summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
committerSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
commiteb4b3404aa00220d659e532151dab13d642c17a3 (patch)
tree7e1107c4995489a26c4007e41b53ea8d00ab2134 /tools
downloadThe-Simpsons-Hit-and-Run-TSH&R-PC.tar
The-Simpsons-Hit-and-Run-TSH&R-PC.tar.gz
The-Simpsons-Hit-and-Run-TSH&R-PC.tar.bz2
The-Simpsons-Hit-and-Run-TSH&R-PC.tar.lz
The-Simpsons-Hit-and-Run-TSH&R-PC.tar.xz
The-Simpsons-Hit-and-Run-TSH&R-PC.tar.zst
The-Simpsons-Hit-and-Run-TSH&R-PC.zip
Diffstat (limited to 'tools')
-rw-r--r--tools/ArtChecker/DSGmaker.exebin0 -> 1310720 bytes
-rw-r--r--tools/ArtChecker/artchecker.cpp1349
-rw-r--r--tools/ArtChecker/artchecker.dsp128
-rw-r--r--tools/ArtChecker/artchecker.exebin0 -> 1445888 bytes
-rw-r--r--tools/ArtChecker/artlimits.h3
-rw-r--r--tools/ArtChecker/artlimits.hpp2
-rw-r--r--tools/ArtChecker/artobject.cpp46
-rw-r--r--tools/ArtChecker/artobject.h59
-rw-r--r--tools/ArtChecker/atcmaker.exebin0 -> 278528 bytes
-rw-r--r--tools/ArtChecker/badlist.cpp90
-rw-r--r--tools/ArtChecker/badlist.hpp33
-rw-r--r--tools/ArtChecker/check.bat2
-rw-r--r--tools/ArtChecker/libmySQL.dllbin0 -> 217088 bytes
-rw-r--r--tools/ArtChecker/summary.bat13
-rw-r--r--tools/ArtChecker/summary.pl23
-rw-r--r--tools/ArtChecker/summaryall.bat13
-rw-r--r--tools/ArtChecker/summaryall.pl23
-rw-r--r--tools/Backup/tools.sln725
-rw-r--r--tools/Backup1/tools.sln725
-rw-r--r--tools/CreateSetChunk/SetChunk.dsp155
-rw-r--r--tools/CreateSetChunk/SetChunk.dsw122
-rw-r--r--tools/CreateSetChunk/SetChunk.sc22
-rw-r--r--tools/CreateSetChunk/main.cpp494
-rw-r--r--tools/CreateSetChunk/version.cpp21
-rw-r--r--tools/CreateSetChunk/version.hpp15
-rw-r--r--tools/DSGmaker/DSGList.cpp389
-rw-r--r--tools/DSGmaker/DSGList.hpp29
-rw-r--r--tools/DSGmaker/DSGmaker.dsp176
-rw-r--r--tools/DSGmaker/DynaDSGList.cpp53
-rw-r--r--tools/DSGmaker/DynaDSGList.hpp22
-rw-r--r--tools/DSGmaker/InstaEntityDSGList.cpp53
-rw-r--r--tools/DSGmaker/InstaEntityDSGList.hpp20
-rw-r--r--tools/DSGmaker/InstaStaticPhysDSGList.cpp53
-rw-r--r--tools/DSGmaker/InstaStaticPhysDSGList.hpp20
-rw-r--r--tools/DSGmaker/dsgmaker.cpp807
-rw-r--r--tools/MakePS2CD/PS2CD.bat38
-rw-r--r--tools/MakePS2CD/PS2DVD.bat33
-rw-r--r--tools/MakePS2CD/licence.000bin0 -> 12528928 bytes
-rw-r--r--tools/MayaRules/Debug/MayaRules.log12
-rw-r--r--tools/MayaRules/Debug/MayaRules.tlog/MayaRules.lastbuildstate2
-rw-r--r--tools/MayaRules/Debug/MayaRules.tlog/custombuild.command.1.tlogbin0 -> 374 bytes
-rw-r--r--tools/MayaRules/Debug/MayaRules.tlog/custombuild.read.1.tlog1
-rw-r--r--tools/MayaRules/Debug/MayaRules.tlog/custombuild.write.1.tlog1
-rw-r--r--tools/MayaRules/Debug/MayaRules.tlog/unsuccessfulbuild0
-rw-r--r--tools/MayaRules/MayaRules.dsp118
-rw-r--r--tools/MayaRules/MayaRules.vcproj146
-rw-r--r--tools/MayaRules/MayaRules.vcxproj135
-rw-r--r--tools/MayaRules/MayaRules.vcxproj.filters13
-rw-r--r--tools/MayaTools/Maya4.0/bin/plug-ins/objectsnapper.mllbin0 -> 94208 bytes
-rw-r--r--tools/MayaTools/Maya4.0/bin/plug-ins/trackeditor.mllbin0 -> 1617920 bytes
-rw-r--r--tools/MayaTools/Maya4.0/bin/plug-ins/worldbuilder.mllbin0 -> 1744896 bytes
-rw-r--r--tools/MayaTools/Maya4.0/extras/icons/bob_Mr_T.bmpbin0 -> 3128 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/actionlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/breakablecameralocator.bmpbin0 -> 1892 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/carstartlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/directionallocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/eventlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/fovlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/genericlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/interiorlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/occlusionlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/pedgrouplocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/scriptlocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/staticcameralocator.bmpbin0 -> 1456 bytes
-rw-r--r--tools/MayaTools/Maya4.0/icons/zonelocator.bmpbin0 -> 2102 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEActionEventLocatorNodeTemplate.mel34
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel20
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AECarStartLocatorNodeTemplate.mel21
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEDirectionalLocatorNodeTemplate.mel16
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEEventLocatorNodeTemplate.mel28
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEFOVLocatorNodeTemplate.mel30
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEGenericLocatorNodeTemplate.mel16
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel28
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEIntersectionLocatorNodeTemplate.mel20
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEOcclusionLocatorNodeTemplate.mel29
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEPedGroupLocatorNodeTemplate.mel26
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AERailCamLocatorNodeTemplate.mel56
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AERoadNodeTemplate.mel29
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEScriptLocatorNodeTemplate.mel28
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AESplineLocatorNodeTemplate.mel23
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEStaticCameraLocatorNodeTemplate.mel52
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AETELocatorSuppress.mel37
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AETEShowRoadSegButton.mel29
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AETreelineShapeNodeTemplate.mel41
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AETriggerVolumeNodeTemplate.mel18
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBLocatorSuppress.mel37
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBSelectTarget.mel34
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBTriggerButton.mel94
-rw-r--r--tools/MayaTools/Maya4.0/scripts/AETemplates/AEZoneEventLocatorNodeTemplate.mel28
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/ajrAutoSave.mel532
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/copyToInst.mel302
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceTexture.mel44
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel381
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/backfaceoff.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/movetex.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/optimizetex.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/p3d.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelighttool.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelitoff.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/removetxt.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renamesh.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renametex.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/rnd.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/setshape.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/unique.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/uvz.bmpbin0 -> 5768 bytes
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelight.mel126
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelightWindow.mel1118
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/nameSpaceGui.mel74
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/optimizeShaders.mel1046
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameScripts.mel313
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameTexture.mel94
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceSimpleShaderWithLambert.mel152
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceTex.mel38
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.mel578
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.xpm828
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rp_help.mel184
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/searchReplaceWin.mel87
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/selectInst.mel36
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel17
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/simpsonsArt.mel334
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/snapCurveY.mel75
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/uvz.mel226
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.mel172
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.xpm198
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/TerrainType.mel426
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/bobsMenu.mel33
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/os_cleanup.mel3
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/os_main.mel228
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/reBuildLayers.mel111
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/showAndLight.mel113
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/swapCamera.mel104
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_BVContext.mel43
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_IntersectionContext.mel212
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_PPContext.mel43
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_cleanup.mel12
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_editorwindow.mel335
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_globals.mel1
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_main.mel195
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_setup.mel15
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/te_treelineContext.mel84
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_cleanup.mel11
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_coinsplines.mel53
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_locator.mel71
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_main.mel274
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_setup.mel6
-rw-r--r--tools/MayaTools/Maya4.0/scripts/others/wb_splines.mel46
-rw-r--r--tools/MayaTools/Maya4.0/scripts/srr2rules.txt13
-rw-r--r--tools/SearchReplace/SearchReplace.cpp336
-rw-r--r--tools/SearchReplace/SearchReplace.dsp97
-rw-r--r--tools/SearchReplace/SearchReplace.dsw32
-rw-r--r--tools/SectorTable/Release/SectorTable.exebin0 -> 53248 bytes
-rw-r--r--tools/SectorTable/SectorTable.cpp121
-rw-r--r--tools/SectorTable/SectorTable.sln51
-rw-r--r--tools/SectorTable/SectorTable.vcproj137
-rw-r--r--tools/SectorTable/stdafx.cpp8
-rw-r--r--tools/SectorTable/stdafx.h12
-rw-r--r--tools/UpgradeLog.htmbin0 -> 74958 bytes
-rw-r--r--tools/UpgradeLog2.htmbin0 -> 940658 bytes
-rw-r--r--tools/bin/make.exebin0 -> 126976 bytes
-rw-r--r--tools/bin/sh.exebin0 -> 304128 bytes
-rw-r--r--tools/bin/tee.exebin0 -> 16896 bytes
-rw-r--r--tools/globalcode/utility/GLExt.cpp1129
-rw-r--r--tools/globalcode/utility/GLExt.h191
-rw-r--r--tools/globalcode/utility/MExt.cpp2030
-rw-r--r--tools/globalcode/utility/MExt.h226
-rw-r--r--tools/globalcode/utility/MExt_template.cpp273
-rw-r--r--tools/globalcode/utility/MExt_template.h146
-rw-r--r--tools/globalcode/utility/MUI.cpp220
-rw-r--r--tools/globalcode/utility/MUI.h82
-rw-r--r--tools/globalcode/utility/mayahandles.cpp105
-rw-r--r--tools/globalcode/utility/mayahandles.h42
-rw-r--r--tools/globalcode/utility/nodehelper.h37
-rw-r--r--tools/globalcode/utility/overlaymarquee.cpp222
-rw-r--r--tools/globalcode/utility/overlaymarquee.h55
-rw-r--r--tools/globalcode/utility/stdafx.h19
-rw-r--r--tools/globalcode/utility/transformmatrix.cpp904
-rw-r--r--tools/globalcode/utility/transformmatrix.h247
-rw-r--r--tools/globalcode/utility/util.c724
-rw-r--r--tools/globalcode/utility/util.h88
-rw-r--r--tools/globalcode/utility/winutil.c69
-rw-r--r--tools/globalcode/utility/winutil.h37
-rw-r--r--tools/objectsnapper/build/Debug/objectsnapper.log8
-rw-r--r--tools/objectsnapper/build/objectsnapper.dsp295
-rw-r--r--tools/objectsnapper/build/objectsnapper.vcproj347
-rw-r--r--tools/objectsnapper/build/objectsnapper.vcxproj228
-rw-r--r--tools/objectsnapper/build/objectsnapper.vcxproj.filters92
-rw-r--r--tools/objectsnapper/code/commands/snapselected.cpp435
-rw-r--r--tools/objectsnapper/code/commands/snapselected.h59
-rw-r--r--tools/objectsnapper/code/main/mayaincludes.h49
-rw-r--r--tools/objectsnapper/code/main/pluginMain.cpp76
-rw-r--r--tools/objectsnapper/code/main/pluginMain.h40
-rw-r--r--tools/objectsnapper/code/main/stdafx.h19
-rw-r--r--tools/objectsnapper/code/precompiled/PCH.cpp1
-rw-r--r--tools/objectsnapper/code/precompiled/PCH.h50
-rw-r--r--tools/objectsnapper/code/scripts/os_cleanup.mel3
-rw-r--r--tools/objectsnapper/code/scripts/os_main.mel228
-rw-r--r--tools/relatedfiles/Debug/relatedfiles.log14
-rw-r--r--tools/relatedfiles/Debug/relatedfiles.tlog/cl.command.1.tlog1
-rw-r--r--tools/relatedfiles/Debug/relatedfiles.tlog/relatedfiles.lastbuildstate2
-rw-r--r--tools/relatedfiles/Debug/relatedfiles.tlog/unsuccessfulbuild0
-rw-r--r--tools/relatedfiles/Debug/vc120.idbbin0 -> 11264 bytes
-rw-r--r--tools/relatedfiles/Debug/vc120.pdbbin0 -> 53248 bytes
-rw-r--r--tools/relatedfiles/relatedfiles.dsp840
-rw-r--r--tools/relatedfiles/relatedfiles.vcproj701
-rw-r--r--tools/relatedfiles/relatedfiles.vcxproj319
-rw-r--r--tools/relatedfiles/relatedfiles.vcxproj.filters581
-rw-r--r--tools/statepropbuilder/apps/spbuilder/art/new.bmpbin0 -> 822 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/art/open.bmpbin0 -> 822 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/art/save.bmpbin0 -> 822 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/art/saveas.bmpbin0 -> 822 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/data/Copy of events.txt16
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/data/callbacks.txt18
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/data/events.txt12
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/data/init.txt0
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/empty.txt0
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/pddidx8d.dllbin0 -> 512083 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/spbuilder.exebin0 -> 515584 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/bin/spengine.dllbin0 -> 8462428 bytes
-rw-r--r--tools/statepropbuilder/apps/spbuilder/build/spbuilder/spbuilder.bpr128
-rw-r--r--tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsp179
-rw-r--r--tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsw245
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.cpp73
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.dfm58
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.h34
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.cpp75
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.dfm58
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.h34
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.cpp136
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.dfm120
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.h44
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.cpp704
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.dfm783
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.h163
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.cpp24
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.dfm42
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.h28
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.cpp59
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.hpp43
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.cpp792
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.hpp119
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/dllmain.cpp43
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/platform.cpp94
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.cpp445
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.hpp120
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp509
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.hpp139
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdatatypes.hpp45
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.cpp879
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.hpp67
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/interface/base.hpp25
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/interface/context.hpp50
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/interface/platform.hpp24
-rw-r--r--tools/statepropbuilder/apps/spbuilder/code/sp/interface/workspace.hpp89
-rw-r--r--tools/statepropbuilder/art/BombBlloon.p3dbin0 -> 36094 bytes
-rw-r--r--tools/statepropbuilder/art/BombBlloon_spdata.p3dbin0 -> 801 bytes
-rw-r--r--tools/statepropbuilder/art/Bouncy_Ape.p3dbin0 -> 137872 bytes
-rw-r--r--tools/statepropbuilder/art/Bouncy_Ape_spdata.p3dbin0 -> 3625 bytes
-rw-r--r--tools/statepropbuilder/art/air_pump_1.p3dbin0 -> 134645 bytes
-rw-r--r--tools/statepropbuilder/art/air_pump_1_collision.p3dbin0 -> 1599 bytes
-rw-r--r--tools/statepropbuilder/art/air_pump_1_spdata.p3dbin0 -> 979 bytes
-rw-r--r--tools/statepropbuilder/art/ball_rebounder.p3dbin0 -> 24272 bytes
-rw-r--r--tools/statepropbuilder/art/ball_rebounder_collision.p3dbin0 -> 4479 bytes
-rw-r--r--tools/statepropbuilder/art/ball_rebounder_spdata.p3dbin0 -> 426 bytes
-rw-r--r--tools/statepropbuilder/art/ball_target.p3dbin0 -> 46505 bytes
-rw-r--r--tools/statepropbuilder/art/ball_target_spdata.p3dbin0 -> 193 bytes
-rw-r--r--tools/statepropbuilder/art/barrel.p3dbin0 -> 35657 bytes
-rw-r--r--tools/statepropbuilder/art/barrel_collision.p3dbin0 -> 2423 bytes
-rw-r--r--tools/statepropbuilder/art/barrel_spdata.p3dbin0 -> 602 bytes
-rw-r--r--tools/statepropbuilder/art/big_gulp_of_pop.p3dbin0 -> 23801 bytes
-rw-r--r--tools/statepropbuilder/art/big_gulp_of_pop_spdata.p3dbin0 -> 626 bytes
-rw-r--r--tools/statepropbuilder/art/biker_chick_temp.p3dbin0 -> 205324 bytes
-rw-r--r--tools/statepropbuilder/art/biker_chick_temp_spdata.p3dbin0 -> 413 bytes
-rw-r--r--tools/statepropbuilder/art/box_of_chips.p3dbin0 -> 23128 bytes
-rw-r--r--tools/statepropbuilder/art/box_of_chips_spdata.p3dbin0 -> 610 bytes
-rw-r--r--tools/statepropbuilder/art/box_wooden.p3dbin0 -> 18592 bytes
-rw-r--r--tools/statepropbuilder/art/box_wooden_spdata.p3dbin0 -> 980 bytes
-rw-r--r--tools/statepropbuilder/art/cage_collision.p3dbin0 -> 10243 bytes
-rw-r--r--tools/statepropbuilder/art/cameraTrigger.p3dbin0 -> 974 bytes
-rw-r--r--tools/statepropbuilder/art/camera_test.p3dbin0 -> 7101 bytes
-rw-r--r--tools/statepropbuilder/art/camera_test_collision.p3dbin0 -> 1391 bytes
-rw-r--r--tools/statepropbuilder/art/camera_test_spdata.p3dbin0 -> 193 bytes
-rw-r--r--tools/statepropbuilder/art/carney_A.p3dbin0 -> 218252 bytes
-rw-r--r--tools/statepropbuilder/art/carney_A_collisions.p3dbin0 -> 1118 bytes
-rw-r--r--tools/statepropbuilder/art/carney_A_spdata.p3dbin0 -> 1786 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_1.p3dbin0 -> 145207 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_1_collision.p3dbin0 -> 3859 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_1_spdata.p3dbin0 -> 989 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_2.p3dbin0 -> 117739 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_2_collision.p3dbin0 -> 3859 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_2_spdata.p3dbin0 -> 1013 bytes
-rw-r--r--tools/statepropbuilder/art/carney_stall_2_spdata_spdata.p3dbin0 -> 1013 bytes
-rw-r--r--tools/statepropbuilder/art/stateprop.p3dbin0 -> 141791 bytes
-rw-r--r--tools/statepropbuilder/art/weapon.p3dbin0 -> 135773 bytes
-rw-r--r--tools/statepropbuilder/build/win32/stateprop.dsp108
-rw-r--r--tools/statepropbuilder/inc/stateprop/stateprop.hpp86
-rw-r--r--tools/statepropbuilder/inc/stateprop/statepropdata.hpp99
-rw-r--r--tools/statepropbuilder/inc/stateprop/statepropdatatypes.hpp45
-rw-r--r--tools/statepropbuilder/lib/dummy.txt0
-rw-r--r--tools/statepropbuilder/lib/stateproppd.abin0 -> 440394 bytes
-rw-r--r--tools/statepropbuilder/lib/stateproppt.abin0 -> 295484 bytes
-rw-r--r--tools/statepropbuilder/src/stateprop.cpp299
-rw-r--r--tools/statepropbuilder/src/statepropdata.cpp249
-rw-r--r--tools/tools.dsw1245
-rw-r--r--tools/tools.sdfbin0 -> 69599232 bytes
-rw-r--r--tools/tools.sln414
-rw-r--r--tools/tools.v12.suobin0 -> 43520 bytes
-rw-r--r--tools/trackeditor/build/Debug/trackeditor.log8
-rw-r--r--tools/trackeditor/build/trackeditor.dsp7141
-rw-r--r--tools/trackeditor/build/trackeditor.vcproj906
-rw-r--r--tools/trackeditor/build/trackeditor.vcxproj438
-rw-r--r--tools/trackeditor/build/trackeditor.vcxproj.filters251
-rw-r--r--tools/trackeditor/code/AETemplates/AEIntersectionLocatorNodeTemplate.mel20
-rw-r--r--tools/trackeditor/code/AETemplates/AERoadNodeTemplate.mel29
-rw-r--r--tools/trackeditor/code/AETemplates/AETELocatorSuppress.mel37
-rw-r--r--tools/trackeditor/code/AETemplates/AETEShowRoadSegButton.mel29
-rw-r--r--tools/trackeditor/code/AETemplates/AETreelineShapeNodeTemplate.mel41
-rw-r--r--tools/trackeditor/code/commands/export.cpp193
-rw-r--r--tools/trackeditor/code/commands/export.h26
-rw-r--r--tools/trackeditor/code/commands/intersectioncommands.cpp449
-rw-r--r--tools/trackeditor/code/commands/intersectioncommands.h60
-rw-r--r--tools/trackeditor/code/commands/trackeditorcommands.cpp222
-rw-r--r--tools/trackeditor/code/commands/trackeditorcommands.h42
-rw-r--r--tools/trackeditor/code/commands/treelinecommand.cpp323
-rw-r--r--tools/trackeditor/code/commands/treelinecommand.h136
-rw-r--r--tools/trackeditor/code/constants/version.hpp16
-rw-r--r--tools/trackeditor/code/contexts/bvcontext.cpp721
-rw-r--r--tools/trackeditor/code/contexts/bvcontext.h98
-rw-r--r--tools/trackeditor/code/contexts/intersectioncontext.cpp478
-rw-r--r--tools/trackeditor/code/contexts/intersectioncontext.h82
-rw-r--r--tools/trackeditor/code/contexts/ppcontext.cpp717
-rw-r--r--tools/trackeditor/code/contexts/ppcontext.h97
-rw-r--r--tools/trackeditor/code/contexts/treelinecontext.cpp402
-rw-r--r--tools/trackeditor/code/contexts/treelinecontext.h139
-rw-r--r--tools/trackeditor/code/main/constants.h21
-rw-r--r--tools/trackeditor/code/main/pluginMain.cpp164
-rw-r--r--tools/trackeditor/code/main/pluginMain.h47
-rw-r--r--tools/trackeditor/code/main/shapeconstants.h34
-rw-r--r--tools/trackeditor/code/main/trackeditor.cpp350
-rw-r--r--tools/trackeditor/code/main/trackeditor.h85
-rw-r--r--tools/trackeditor/code/nodes/NU.h34
-rw-r--r--tools/trackeditor/code/nodes/fenceline.cpp201
-rw-r--r--tools/trackeditor/code/nodes/fenceline.h30
-rw-r--r--tools/trackeditor/code/nodes/intersection.cpp213
-rw-r--r--tools/trackeditor/code/nodes/intersection.h48
-rw-r--r--tools/trackeditor/code/nodes/pedpath.cpp271
-rw-r--r--tools/trackeditor/code/nodes/pedpath.h30
-rw-r--r--tools/trackeditor/code/nodes/road.cpp409
-rw-r--r--tools/trackeditor/code/nodes/road.h56
-rw-r--r--tools/trackeditor/code/nodes/tiledisplay.cpp212
-rw-r--r--tools/trackeditor/code/nodes/tiledisplay.h35
-rw-r--r--tools/trackeditor/code/nodes/treelineshapenode.cpp1343
-rw-r--r--tools/trackeditor/code/nodes/treelineshapenode.h142
-rw-r--r--tools/trackeditor/code/nodes/walllocator.cpp551
-rw-r--r--tools/trackeditor/code/nodes/walllocator.h69
-rw-r--r--tools/trackeditor/code/precompiled/PCH.cpp1
-rw-r--r--tools/trackeditor/code/precompiled/PCH.h68
-rw-r--r--tools/trackeditor/code/scripts/te_BVContext.mel43
-rw-r--r--tools/trackeditor/code/scripts/te_IntersectionContext.mel212
-rw-r--r--tools/trackeditor/code/scripts/te_PPContext.mel43
-rw-r--r--tools/trackeditor/code/scripts/te_cleanup.mel12
-rw-r--r--tools/trackeditor/code/scripts/te_editorwindow.mel335
-rw-r--r--tools/trackeditor/code/scripts/te_globals.mel1
-rw-r--r--tools/trackeditor/code/scripts/te_main.mel195
-rw-r--r--tools/trackeditor/code/scripts/te_setup.mel15
-rw-r--r--tools/trackeditor/code/scripts/te_treelineContext.mel84
-rw-r--r--tools/worldbuilder/build/Debug/worldbuilder.log8
-rw-r--r--tools/worldbuilder/build/worldbuilder.dsp1739
-rw-r--r--tools/worldbuilder/build/worldbuilder.vcproj1010
-rw-r--r--tools/worldbuilder/build/worldbuilder.vcxproj514
-rw-r--r--tools/worldbuilder/build/worldbuilder.vcxproj.filters430
-rw-r--r--tools/worldbuilder/code/AETemplates/AEActionEventLocatorNodeTemplate.mel34
-rw-r--r--tools/worldbuilder/code/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel20
-rw-r--r--tools/worldbuilder/code/AETemplates/AECarStartLocatorNodeTemplate.mel21
-rw-r--r--tools/worldbuilder/code/AETemplates/AEDirectionalLocatorNodeTemplate.mel16
-rw-r--r--tools/worldbuilder/code/AETemplates/AEEventLocatorNodeTemplate.mel28
-rw-r--r--tools/worldbuilder/code/AETemplates/AEFOVLocatorNodeTemplate.mel30
-rw-r--r--tools/worldbuilder/code/AETemplates/AEGenericLocatorNodeTemplate.mel16
-rw-r--r--tools/worldbuilder/code/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel28
-rw-r--r--tools/worldbuilder/code/AETemplates/AEOcclusionLocatorNodeTemplate.mel29
-rw-r--r--tools/worldbuilder/code/AETemplates/AEPedGroupLocatorNodeTemplate.mel26
-rw-r--r--tools/worldbuilder/code/AETemplates/AERailCamLocatorNodeTemplate.mel56
-rw-r--r--tools/worldbuilder/code/AETemplates/AEScriptLocatorNodeTemplate.mel28
-rw-r--r--tools/worldbuilder/code/AETemplates/AESplineLocatorNodeTemplate.mel23
-rw-r--r--tools/worldbuilder/code/AETemplates/AEStaticCameraLocatorNodeTemplate.mel52
-rw-r--r--tools/worldbuilder/code/AETemplates/AETriggerVolumeNodeTemplate.mel18
-rw-r--r--tools/worldbuilder/code/AETemplates/AEWBLocatorSuppress.mel37
-rw-r--r--tools/worldbuilder/code/AETemplates/AEWBSelectTarget.mel34
-rw-r--r--tools/worldbuilder/code/AETemplates/AEWBTriggerButton.mel94
-rw-r--r--tools/worldbuilder/code/AETemplates/AEZoneEventLocatorNodeTemplate.mel28
-rw-r--r--tools/worldbuilder/code/commands/export.cpp282
-rw-r--r--tools/worldbuilder/code/commands/export.h26
-rw-r--r--tools/worldbuilder/code/commands/worldbuildercommands.cpp689
-rw-r--r--tools/worldbuilder/code/commands/worldbuildercommands.h90
-rw-r--r--tools/worldbuilder/code/contexts/locatorcontext.cpp887
-rw-r--r--tools/worldbuilder/code/contexts/locatorcontext.h86
-rw-r--r--tools/worldbuilder/code/contexts/triggercontext.cpp488
-rw-r--r--tools/worldbuilder/code/contexts/triggercontext.h82
-rw-r--r--tools/worldbuilder/code/gameengine/gameengine.cpp749
-rw-r--r--tools/worldbuilder/code/gameengine/gameengine.h85
-rw-r--r--tools/worldbuilder/code/gameengine/mayacamera.cpp151
-rw-r--r--tools/worldbuilder/code/gameengine/mayacamera.h49
-rw-r--r--tools/worldbuilder/code/gameengine/wbcamtarget.cpp296
-rw-r--r--tools/worldbuilder/code/gameengine/wbcamtarget.h90
-rw-r--r--tools/worldbuilder/code/main/constants.h31
-rw-r--r--tools/worldbuilder/code/main/pluginMain.cpp193
-rw-r--r--tools/worldbuilder/code/main/pluginMain.h38
-rw-r--r--tools/worldbuilder/code/main/toolhack.h8
-rw-r--r--tools/worldbuilder/code/main/worldbuilder.cpp267
-rw-r--r--tools/worldbuilder/code/main/worldbuilder.h260
-rw-r--r--tools/worldbuilder/code/nodes/actioneventlocatornode.cpp651
-rw-r--r--tools/worldbuilder/code/nodes/actioneventlocatornode.h205
-rw-r--r--tools/worldbuilder/code/nodes/breakablecameralocatornode.cpp327
-rw-r--r--tools/worldbuilder/code/nodes/breakablecameralocatornode.h113
-rw-r--r--tools/worldbuilder/code/nodes/carstartlocatornode.cpp347
-rw-r--r--tools/worldbuilder/code/nodes/carstartlocatornode.h117
-rw-r--r--tools/worldbuilder/code/nodes/directionallocatornode.cpp312
-rw-r--r--tools/worldbuilder/code/nodes/directionallocatornode.h107
-rw-r--r--tools/worldbuilder/code/nodes/eventlocatornode.cpp460
-rw-r--r--tools/worldbuilder/code/nodes/eventlocatornode.h121
-rw-r--r--tools/worldbuilder/code/nodes/fovlocatornode.cpp361
-rw-r--r--tools/worldbuilder/code/nodes/fovlocatornode.h124
-rw-r--r--tools/worldbuilder/code/nodes/genericlocatornode.cpp287
-rw-r--r--tools/worldbuilder/code/nodes/genericlocatornode.h108
-rw-r--r--tools/worldbuilder/code/nodes/interiorentrancelocatornode.cpp409
-rw-r--r--tools/worldbuilder/code/nodes/interiorentrancelocatornode.h151
-rw-r--r--tools/worldbuilder/code/nodes/occlusionlocatornode.cpp374
-rw-r--r--tools/worldbuilder/code/nodes/occlusionlocatornode.h112
-rw-r--r--tools/worldbuilder/code/nodes/pedgrouplocator.cpp371
-rw-r--r--tools/worldbuilder/code/nodes/pedgrouplocator.h115
-rw-r--r--tools/worldbuilder/code/nodes/railcamlocatornode.cpp584
-rw-r--r--tools/worldbuilder/code/nodes/railcamlocatornode.h232
-rw-r--r--tools/worldbuilder/code/nodes/scriptlocatornode.cpp377
-rw-r--r--tools/worldbuilder/code/nodes/scriptlocatornode.h149
-rw-r--r--tools/worldbuilder/code/nodes/splinelocatornode.cpp439
-rw-r--r--tools/worldbuilder/code/nodes/splinelocatornode.h101
-rw-r--r--tools/worldbuilder/code/nodes/staticcameralocatornode.cpp573
-rw-r--r--tools/worldbuilder/code/nodes/staticcameralocatornode.h198
-rw-r--r--tools/worldbuilder/code/nodes/triggertypes.h10
-rw-r--r--tools/worldbuilder/code/nodes/triggervolumenode.cpp435
-rw-r--r--tools/worldbuilder/code/nodes/triggervolumenode.h86
-rw-r--r--tools/worldbuilder/code/nodes/wbspline.cpp109
-rw-r--r--tools/worldbuilder/code/nodes/wbspline.h54
-rw-r--r--tools/worldbuilder/code/nodes/zoneeventlocatornode.cpp377
-rw-r--r--tools/worldbuilder/code/nodes/zoneeventlocatornode.h151
-rw-r--r--tools/worldbuilder/code/precompiled/PCH.cpp1
-rw-r--r--tools/worldbuilder/code/precompiled/PCH.h52
-rw-r--r--tools/worldbuilder/code/resources/icon1.icobin0 -> 766 bytes
-rw-r--r--tools/worldbuilder/code/resources/resource.apsbin0 -> 37208 bytes
-rw-r--r--tools/worldbuilder/code/resources/resource.h28
-rw-r--r--tools/worldbuilder/code/resources/resource.rc318
-rw-r--r--tools/worldbuilder/code/scripts/wb_cleanup.mel11
-rw-r--r--tools/worldbuilder/code/scripts/wb_coinsplines.mel53
-rw-r--r--tools/worldbuilder/code/scripts/wb_locator.mel71
-rw-r--r--tools/worldbuilder/code/scripts/wb_main.mel274
-rw-r--r--tools/worldbuilder/code/scripts/wb_setup.mel6
-rw-r--r--tools/worldbuilder/code/scripts/wb_splines.mel46
-rw-r--r--tools/xboxsync/XboxSync.exebin0 -> 110592 bytes
458 files changed, 74962 insertions, 0 deletions
diff --git a/tools/ArtChecker/DSGmaker.exe b/tools/ArtChecker/DSGmaker.exe
new file mode 100644
index 0000000..7ae21c3
--- /dev/null
+++ b/tools/ArtChecker/DSGmaker.exe
Binary files differ
diff --git a/tools/ArtChecker/artchecker.cpp b/tools/ArtChecker/artchecker.cpp
new file mode 100644
index 0000000..e2a9f1c
--- /dev/null
+++ b/tools/ArtChecker/artchecker.cpp
@@ -0,0 +1,1349 @@
+// artchecker.cpp : Defines the entry point for the console application.
+// options -strict -add -all
+#pragma warning(disable:4786)
+
+
+#include <iostream>
+#include <cstring>
+#include <iomanip>
+//#include <mysql++>
+#include "artobject.h"
+#include "artlimits.h"
+#include "badlist.hpp"
+#include "outputbuffer.hpp"
+#include <toollib.hpp>
+#include <tlCollisionObjectChunk.hpp>
+#include <tlMeshChunk.hpp>
+#include <tlImageChunk.hpp>
+#include <tlAnimationChunk.hpp>
+#include <tlStatepropChunk.hpp>
+#include "..\..\..\..\game\code\constants\srrchunks.h"
+
+using namespace std;
+
+void debugstring(char * message);
+
+int texturelookup(const texture_data& texturedata, bool add, bool strict,bool showall,badlist& p_badtextures ,bool suppress);
+int shaderlookup(shader_data* lp_shaderdata, bool add, bool strict,bool showall,badlist& badshaders,bool suppress);
+//int artobjectlookup(art_object* lp_artobject, Query& query,bool add, bool strict,bool showall,bool suppress);
+//int bvobjectlookup(bv_data* lp_bvobject,Query& query,bool add,bool strict,bool showall,bool suppress);
+
+int main(int argc, char* argv[])
+{
+
+ char* arguements [4];
+ char* filename;
+ bool strict =false;
+ bool add =false;
+ bool badart=false;
+ bool showall =false;
+ bool suppress =false;
+ bool shin=false;
+ char screenoutput [1000];
+ int i;
+
+ //lists to track bad textures and shaders.
+ badlist bad_textures;
+ badlist bad_shaders;
+
+ //list to track meshes using bad shaders and meshes over 500 polys
+ outputbuffer* p_mesh_ref=new outputbuffer;
+ outputbuffer* p_polycount=new outputbuffer;
+
+
+ tlDataChunk::RegisterDefaultChunks();
+
+ //processes arguements
+
+ //no options
+ if (argc ==1)
+ {
+ printf("usage:artchecker filename <strict> \n");
+ exit (1);
+ }
+
+
+ filename= argv[1];
+ debugstring(filename);
+
+
+ for (i=2;i<argc;i++)
+ {
+ arguements[i]=argv[i];
+
+ // user set strict
+ if (strcmp(arguements[i],"strict")== 0)
+ {
+ strict =true;
+ debugstring("strict option set");
+ break;
+ }
+
+ //user set add
+
+ else if (strcmp (arguements[i],"add")==0)
+ {
+ add=true;
+ debugstring("add option set");
+ break;
+ }
+
+ else if (strcmp (arguements[i],"sum")==0)
+ {
+ suppress =true;
+ break;
+ }
+
+ else if (strcmp (arguements[i],"all")==0)
+ {
+ showall =true;
+ break;
+ }
+
+ else if (strcmp (arguements[i],"shin")==0)
+ {
+ shin =true;
+ break;
+ }
+ //illegal option
+ else
+ {
+ printf("%s is an illegal option \n",arguements[i]);
+ exit (1);
+ }
+
+
+ } //end for
+
+ //have the pure3d file name
+
+ tlFile input(new tlFileByteStream(filename,omREAD), tlFile::FROMFILE);
+ if(!input.IsOpen())
+ {
+ printf("Could not open %s\n", filename);
+ exit(-6);
+ }
+
+ printf("Processing Filename: %s\n",filename);
+
+ //desend into the file and look at each object until no more objects left
+
+ // make a tlDataChunk from the file
+ // this is the wrapper chunk for the input
+ tlDataChunk* inchunk = new tlDataChunk(&input);
+ // we don't need the tlFile anymore
+ // this cleans up the tlFile object including the
+ // tlFileByteStream
+ //printf("Fucking CLose! \n");
+ input.Close();
+
+ //printf("Closing File proceeding.\n");
+
+ //lists to track memory stats for various components.
+ badlist texturestats(inchunk->SubChunkCount());
+ badlist animationstats(inchunk->SubChunkCount());
+ badlist meshstats(inchunk->SubChunkCount());
+
+ // build an output chunk
+ tlDataChunk* outchunk = new tlDataChunk;
+ int ch;
+
+ static int counter =0;
+
+ //connect to the DB
+
+
+ //setup artrb variables
+ bool dbconnect=false;
+// char querybuffer [1000];
+// Row row;
+
+
+
+
+ //creat connection and query
+ //Connection con (use_exceptions);
+ //Query query=con.query( );
+ //dbconnect=con.connect ("srr2test","radit","root","custom47");
+/*
+ if (dbconnect == true)
+ {
+ printf("Connection to Artdb established proceeding.\n");
+ }
+ else
+ {
+ printf("Cant connection to art db \n");
+ exit (1);
+ }
+*/
+ //printf("Counting chunks !\n");
+
+ // go through all the sub-chunks of the input and
+ // process the ones you care about
+ for(ch=0; ch < inchunk->SubChunkCount(); ch++)
+ {
+ //printf("Processing Chunks, #%d \n",ch);
+ // create the next sub-chunk
+ tlDataChunk* sub = inchunk->GetSubChunk(ch);
+
+ // look at the id of the subchunk to decide if we
+ // want to do something with it or not
+ switch(sub->ID())
+ {
+
+
+ case Pure3D::Texture::TEXTURE:
+ {
+ //temp variables
+ tlTexture* p_texture = new tlTexture ();
+ tlImage* p_image2d ;
+ texture_data mytexture;
+ unsigned int texturememsize =0;
+
+ //printf("texuture name: %s \n",p_texture->GetName());
+
+ int chunkcount1,chunkcount2;
+
+ for (chunkcount1 =0;chunkcount1<sub->SubChunkCount();chunkcount1++)
+ {
+ tlDataChunk* sub1=sub->GetSubChunk(chunkcount1);
+
+ switch(sub1->ID())
+ {
+ case Pure3D::Texture::IMAGE:
+ {
+ for (chunkcount2=0;chunkcount2<sub1->SubChunkCount();chunkcount2++)
+ {
+ tlDataChunk* sub2=sub1->GetSubChunk(chunkcount2);
+ switch (sub2->ID())
+ {
+ case Pure3D::Texture::IMAGE_DATA:
+ {
+ tlImageDataChunk* p_imagedatachunk = (tlImageDataChunk*) sub2;
+ texturememsize += p_imagedatachunk->GetImageDataSize();
+ //printf("%u bytes \n", p_imagedatachunk->GetImageDataSize());
+ }
+ }
+ }//end for
+
+ }//end case
+ }//end switch
+
+ }//end outer for loop.
+
+
+
+
+ p_texture->LoadFromChunk(sub);
+
+ //cout<<"Checking for "<<p_texture->GetName()<<" Texture ";
+ p_image2d = p_texture->GetImage(0);
+
+ //fill in texture struct.
+ strcpy(mytexture.name,p_texture->GetName());
+ mytexture.height=p_texture->GetHeight();
+ mytexture.width=p_texture->GetWidth();
+ mytexture.bpp=p_image2d->GetBpp();
+ mytexture.alpha=p_texture->GetAlphaDepth();
+
+ texturestats.add(p_texture->GetName(),1,texturememsize);
+
+ //texture check
+ if (texturelookup (mytexture,add,strict,showall,bad_textures,suppress) ) //
+ {
+ badart= true;
+ }
+
+ /*
+ cout<<"Height: "<<p_image2d->GetHeight();
+ cout<<"Width: "<<p_image2d->GetWidth();
+ cout<<"Bpp: "<<mytexture.bpp;
+ cout<<"Alpha: "<<mytexture.alpha;
+ cout<<endl;
+ */
+
+ delete p_texture;
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+ }
+
+ case Pure3D::Shader::SHADER:
+ {
+
+ shader_data myshader;
+ tlShader* p_shader =new tlShader ();
+ p_shader->LoadFromChunk(sub);
+
+ //get data for myshader
+
+ strcpy(myshader.name,p_shader->GetName());
+ myshader.lit=p_shader->GetIntParam("LIT");
+ myshader.twosid=p_shader->GetIntParam("2SID");
+
+ //cout<<"Checking for "<<myshader.name<<" Shader ";
+
+
+ if (p_shader->GetFloatParam("SHIN") > 0.0 )
+ {
+ if (shin)
+ {
+ printf("Shader: %s has shinyness %f greater than 0.0!!!\n",p_shader->GetName(),p_shader->GetFloatParam("SHIN"));
+ //printf("Shader: %s has shinyness %f greater than 0.0!!!, Setting it to 0.0\n",p_shader->GetName(),p_shader->GetFloatParam("SHIN"));
+ //p_shader->SetFloatParam("SHIN",0.0);
+ }
+ }
+
+
+ if( strcmp ("lambert",p_shader->GetShaderType() )==0)
+ {
+ printf(" =====> ERROR: %s is of type Lambert, SOMEONE is GETTING the BEATS ! \n",myshader.name);
+ badart=true;
+ }
+
+ if (p_shader->GetIntParam("2SID") == 0)
+ {
+ //printf("%-30s Shader: =====>Warning : Double Sided FLAG is 0!\n",p_shader->GetName());
+ //p_shader->SetIntParam("2SID",1);
+ //error=true;
+ }
+
+ if(shaderlookup(&myshader,add,strict,showall,bad_shaders,suppress))
+ {
+ badart=true;
+ }
+
+ tlDataChunk* p_chunk=p_shader->Chunk();
+ delete p_shader;
+ outchunk->AppendSubChunk(p_chunk);
+ break;
+ }
+ case SRR2::ChunkID::ENTITY_DSG:
+ {
+ tlDataChunk* p_temp = sub->GetSubChunk(0);
+
+
+ tlMeshChunk* p_mesh = (tlMeshChunk* ) p_temp;
+ tlPrimGroup* p_primgroup = new tlPrimGroup ();
+ unsigned int vertexmemsize =0;
+ p_primgroup->LoadFromChunk(p_mesh->GetSubChunk(0));
+
+ if( p_primgroup->GetTriangleCount() >MAX_POLYCOUNT)
+ {
+ if(p_primgroup->GetType() == PDDI_PRIM_TRIANGLES)
+ {
+ sprintf(screenoutput,"%-30s mesh => Polycount : %6d \n",p_mesh->GetName(),p_primgroup->GetTriangleCount());
+ }
+
+ if(p_primgroup->GetType() == PDDI_PRIM_TRISTRIP)
+ {
+ sprintf(screenoutput,"%-30s mesh => Polycount Tristriped: %6d \n",p_mesh->GetName(),p_primgroup->GetTriangleCount());
+ }
+
+ //cout<< p_primgroup->GetTriangleCount()<<endl;
+ //printf("%-30s mesh => Polycount: %6d \n",p_mesh->GetName(),p_primgroup->GetTriangleCount());
+ p_polycount->add(screenoutput);
+ }
+
+ if(p_primgroup->GetVertexType()==8209)
+ {
+ //printf("ERROR: %s mesh HAS NO CVB lighting INFO!\n",p_mesh->GetName());
+ sprintf(screenoutput,"%-30s =====>ERROR: Mesh has No CBV (Color by Vertex) Lighting INFO! ", p_mesh->GetName());
+ p_mesh_ref->add(screenoutput);
+ badart=true;
+ }
+
+ if (bad_shaders.inlist(p_primgroup->GetShader( ) ))
+ {
+ sprintf(screenoutput,"%-30s =====>ERROR: Referencing bad shader : %-30s", p_mesh->GetName(), p_primgroup->GetShader());
+ p_mesh_ref->add(screenoutput);
+ badart =true;
+ }
+
+ delete p_primgroup;
+
+
+
+ // memory checkfunctionality
+ int chunkcount1,chunkcount2;
+
+ for (chunkcount1 =0;chunkcount1<p_temp->SubChunkCount();chunkcount1++)
+ {
+ tlDataChunk* sub1=p_temp->GetSubChunk(chunkcount1);
+
+ switch(sub1->ID())
+ {
+ case Pure3D::Mesh::PRIMGROUP:
+ {
+ for (chunkcount2=0;chunkcount2<sub1->SubChunkCount();chunkcount2++)
+ {
+ tlDataChunk* sub2=sub1->GetSubChunk(chunkcount2);
+ switch (sub2->ID())
+ {
+ case Pure3D::Mesh::MEMORYIMAGEVERTEXLIST:
+ {
+ tlPrimGroupMemoryImageVertexChunk* p_vertexmemorychunk = (tlPrimGroupMemoryImageVertexChunk*) sub2;
+ vertexmemsize = p_vertexmemorychunk->GetMemoryImageVertexSize();
+ //printf("%u bytes \n", p_vertexmemorychunk->GetMemoryImageVertexSize());
+ }
+ }
+ }//end for
+
+ }//end case
+ }//end switch
+
+ }//end outer for loop.
+
+
+ meshstats.add(p_mesh->GetName(),1,vertexmemsize);
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+
+ }
+
+
+
+ case Pure3D::Mesh::MESH:
+ {
+ counter++;
+
+ tlDataChunk* p_sub =NULL;
+
+ unsigned int i = 0;
+ p_sub = sub->GetSubChunk(i);
+
+ while (p_sub ->ID( ) == Pure3D::Mesh::PRIMGROUP )
+ {
+ tlMeshChunk* p_mesh = (tlMeshChunk* ) sub;
+ tlPrimGroup* p_primgroup = new tlPrimGroup ();
+ unsigned int vertexmemsize =0;
+ p_primgroup->LoadFromChunk(p_mesh->GetSubChunk(i));
+
+ if( p_primgroup->GetTriangleCount() >MAX_POLYCOUNT)
+ {
+
+ if(p_primgroup->GetType() == PDDI_PRIM_TRIANGLES)
+ {
+ sprintf(screenoutput,"%-30s mesh => Polycount : %6d \n",p_mesh->GetName(),p_primgroup->GetTriangleCount());
+ p_polycount->add(screenoutput);
+ }
+
+ if(p_primgroup->GetType() == PDDI_PRIM_TRISTRIP)
+ {
+ sprintf(screenoutput,"%-30s mesh => Polycount Tristriped: %6d \n",p_mesh->GetName(),p_primgroup->GetTriangleCount());
+ p_polycount->add(screenoutput);
+ }
+ }
+
+ if(p_primgroup->GetVertexType()==8209)
+ {
+ sprintf(screenoutput,"%-30s =====>ERROR: Mesh has No CBV (Color by Vertex) Lighting INFO! ", p_mesh->GetName());
+ p_mesh_ref->add(screenoutput);
+ badart=true;
+ }
+
+ //hack to make every 3rd shader be char swatch.
+ if (counter == 3)
+ {
+ counter =0;
+ p_primgroup->SetShader("char_swatch_m");
+ }
+
+ if (bad_shaders.inlist(p_primgroup->GetShader( ) ))
+ {
+ sprintf(screenoutput,"%-30s =====>ERROR: Referencing bad shader : %-30s", p_mesh->GetName(), p_primgroup->GetShader());
+ p_mesh_ref->add(screenoutput);
+ badart=true;
+ }
+
+ delete p_primgroup;
+ i++;
+
+
+
+ // memory checkfunctionality
+ int chunkcount1,chunkcount2;
+
+ for (chunkcount1 =0;chunkcount1<sub->SubChunkCount();chunkcount1++)
+ {
+ tlDataChunk* sub1=sub->GetSubChunk(chunkcount1);
+
+ switch(sub1->ID())
+ {
+ case Pure3D::Mesh::PRIMGROUP:
+ {
+ for (chunkcount2=0;chunkcount2<sub1->SubChunkCount();chunkcount2++)
+ {
+ tlDataChunk* sub2=sub1->GetSubChunk(chunkcount2);
+ switch (sub2->ID())
+ {
+ case Pure3D::Mesh::MEMORYIMAGEVERTEXLIST:
+ {
+ tlPrimGroupMemoryImageVertexChunk* p_vertexmemorychunk = (tlPrimGroupMemoryImageVertexChunk*) sub2;
+ vertexmemsize = p_vertexmemorychunk->GetMemoryImageVertexSize();
+ //printf("%u bytes \n", p_vertexmemorychunk->GetMemoryImageVertexSize());
+ }
+ }
+ }//end for
+
+ }//end case
+ }//end switch
+
+ }//end outer for loop.
+
+
+ meshstats.add(p_mesh->GetName(),1,vertexmemsize);
+ outchunk->AppendSubChunk(sub,FALSE);
+ p_sub = sub->GetSubChunk(i);
+ }//end while loop
+ break;
+ }
+ case Pure3D::Animation::AnimationData::ANIMATION:
+ {
+
+ unsigned int animationmemsize =0;
+ int chunkcount1;
+
+ for (chunkcount1 =0;chunkcount1<sub->SubChunkCount();chunkcount1++)
+ {
+ tlDataChunk* sub1=sub->GetSubChunk(chunkcount1);
+
+ switch(sub1->ID())
+ {
+ case Pure3D::Animation::AnimationData::SIZE:
+ {
+
+ tlAnimationSizeChunk* p_animationsizechunk = (tlAnimationSizeChunk*) sub1;
+ animationmemsize = p_animationsizechunk->GetPS2();
+ //printf("%u bytes \n", p_animationsizechunk->GetPS2());
+
+ }//end case
+ }//end switch
+ }//end outer for loop.
+
+ //printf("name: %s , %u bytes \n",sub->GetName(),animationmemsize);
+ animationstats.add(sub->GetName(),1,animationmemsize);
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+
+ }
+
+ /*
+ case Simulation::Collision::OBJECT:
+ {
+ //temp local variables
+
+ tlCollisionObjectChunk* p_collisionobject= (tlCollisionObjectChunk*)sub;
+ bv_data bv_object;
+ char source_name[max_length];
+ char object_name1[max_length];
+ char object_name2[max_length];
+
+
+ //cout<<"Checking "<<p_collisionobject->GetName()<<" Collision Object "<< endl;
+
+ //get the name of collision object
+ strcpy(source_name,p_collisionobject->GetName());
+ //cout<<"Source name: "<<source_name<<endl;
+
+ //smash up string to remove the number appended by Maya
+ strcpy(object_name1,strtok(source_name,"_"));
+ strcpy(object_name2,strtok(NULL,"_"));
+
+ //reform string
+ strcat(object_name1,"_");
+ strcat(object_name1,object_name2);
+
+
+ //set default vaules
+ strcpy(bv_object.name,object_name1);
+ bv_object.classtype=0;
+ bv_object.physpropid=0;
+
+ //cout<<"New concated string: " <<object_name1<<endl;
+
+
+ if(bvobjectlookup(&bv_object,query,add,strict,showall))
+ {
+ badart=true;
+ }
+
+ //creating object attribute chunk
+
+ tlObjectAttributeChunk* p_otc =new tlObjectAttributeChunk ();
+ p_otc->SetClassType(bv_object.classtype);
+ p_otc->SetPhyPropID(bv_object.physpropid);
+
+ tlPhysWrapperChunk* p_physwrapper = new tlPhysWrapperChunk ();
+ p_physwrapper->SetName(p_collisionobject->GetName());
+
+ //append the chunks
+ //p_physwrapper->AppendSubChunk(p_otc);
+ //p_physwrapper->AppendSubChunk(sub, FALSE);
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+ }
+
+
+ */
+ case StateProp::STATEPROP:
+ {
+ printf("This File:%s contains a stateprop \n",filename);
+ break;
+ }
+ default:
+ {
+ // this is not a chunk that we care about
+ // so simply copy it to the output wrapper chunk
+ // the optional parameter to AppendSubChunk
+ // indicates that we have merely copied a pointer
+ // so the destructor of outchunk should not
+ // destroy this sub-chunk as that duty will be
+ // taken care of by the destructor of inchunk
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+
+ }
+ }//end switch
+ }//end for
+
+ //record objects stats faking art object
+ art_object target_object;
+ strcpy(target_object.name,"devil car");
+
+ target_object.art_properties.vertex_count= 453;
+ target_object.art_properties.poly_count=2345;
+ target_object.art_properties.animation_frames=25;
+ target_object.art_properties.bone_count=35;
+ target_object.art_properties.shader_count=14;
+
+/*
+ if( artobjectlookup(&target_object,query,add,strict) )
+ {
+ cout<<"Art object:" <<target_object.name<< " has failed art check\n ";
+ //exit (1);
+ }
+
+*/
+ //check for shaders and textures are
+
+
+ //all is good add physic proporties
+
+ shader_data hmm;
+
+ strcpy(hmm.name,"trunk");
+ hmm.lit=false;
+/*
+ if (shaderlookup(&hmm,query,add,strict))
+ {
+ cout<<hmm.name<<"not in art db \n";
+ //exit (1);
+ }
+*/
+
+
+//}
+ //end of try
+
+// catch (BadQuery er)
+ {
+ // cout<<"Error: " <<er.error<< endl;
+ // return 1;
+ }
+
+ if (badart)
+ {
+ printf("\n");
+ printf("\n");
+
+ printf("***** SUMMARY ******* \n");
+ fprintf(stdout,"ERROR: %-15s contains BAD ART and has FAILED Artchecker! \n",filename);
+
+ // cleanup the no-longer-needed wrapper chunks
+
+ printf("Total Memory size of Textures: %20u bytes in %9u textures \n",texturestats.getsize(),texturestats.getindexcount());
+ printf("Total Memory size of Animations: %20u bytes in %9u animations \n",animationstats.getsize(),animationstats.getindexcount());
+ printf("Total Memory size of Meshes: %20u bytes in %9u meshes \n",meshstats.getsize(),meshstats.getindexcount());
+
+ printf("***** END OF SUMMARY ******* \n");
+ printf("\n");
+
+
+ if(!suppress)
+ {
+ printf("\n");
+ printf("\n");
+ printf("***** Bad Meshes *******\n");
+ p_mesh_ref->print();
+ printf("\n");
+ printf("***** HIGH POLY Meshes *******\n");
+ p_polycount->print();
+ printf("\n");
+ }
+ if(showall)
+ {
+ printf("\n");
+ printf("***** Texture Breakdown *******\n");
+ texturestats.printverbose();
+ printf("\n");
+ printf("***** Animation Breakdown *******\n");
+ animationstats.printverbose();
+ printf("\n");
+ printf("***** Meshes Breakdown *******\n");
+ meshstats.printverbose();
+ printf("\n");
+
+ }
+ delete p_mesh_ref ;
+ delete p_polycount;
+
+ /*
+ // create the new output file
+ tlFile output(new tlFileByteStream(filename, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+ printf("Could not open %s for writing,unable to Save\n", filename);
+ exit(-1);
+ }
+
+ // get the output wrapper chunk to write its data out
+ // to the file
+ outchunk->Write(&output);
+*/
+
+ delete inchunk;
+ delete outchunk;
+ return 1;
+ }
+ else
+ {
+
+/*
+ // create the new output file
+ tlFile output(new tlFileByteStream(filename, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+ printf("Could not open %s for writing\n", filename);
+ exit(-1);
+ }
+*/
+ // get the output wrapper chunk to write its data out
+ // to the file
+ // outchunk->Write(&output);
+
+
+ // cleanup the no-longer-needed wrapper chunks
+ delete inchunk;
+ delete outchunk;
+ delete p_mesh_ref;
+ delete p_polycount;
+ printf("\n");
+ printf("\n");
+ printf("\n");
+
+ printf("***** SUMMARY ******* \n");
+ printf("\n");
+ fprintf(stdout,"Filename:%-15s PASSED Artchecker. \n",filename);
+ printf("\n");
+
+ // cleanup the no-longer-needed wrapper chunks
+
+ printf("Total Memory size of Textures: %20u bytes in %9u textures \n",texturestats.getsize(),texturestats.getindexcount());
+ printf("Total Memory size of Animations: %20u bytes in %9u animations \n",animationstats.getsize(),animationstats.getindexcount());
+ printf("Total Memory size of Meshes: %20u bytes in %9u meshes \n",meshstats.getsize(),meshstats.getindexcount());
+
+ printf("***** END OF SUMMARY ******* \n");
+
+ if(showall)
+ {
+ printf("\n");
+ printf("***** Texture Breakdown *******\n");
+ texturestats.printverbose();
+ printf("\n");
+ printf("***** Animation Breakdown *******\n");
+ animationstats.printverbose();
+ printf("\n");
+ printf("***** Meshes Breakdown *******\n");
+ meshstats.printverbose();
+ printf("\n");
+
+ }
+ return 0;
+ }
+} //end of main
+
+
+//********************************************
+// Function Bodies
+//********************************************
+
+//helper function to print error messages
+void debugstring (char * message)
+{
+#ifdef DEBUG
+ cout<<message<<endl;
+#endif
+}
+
+
+//helper funtion to check texutre return 0 if texture matches db ,1 if their is a mismatch or error
+int texturelookup(const texture_data& texturedata, bool add, bool strict,bool showall,badlist& badtextures,bool suppress) //badlist* p_badtextures
+{
+ bool error=false ;
+ //char querybuffer [1000];
+ char output [1000];
+// Result::iterator sql_iterator;
+// Row row;
+ outputbuffer texture_errors;
+
+ //sprintf(querybuffer, "SELECT * FROM textures WHERE name = '%s' ",texturedata.name);
+ //query<< querybuffer;
+ //Result myresult= query.store ( );
+
+
+
+ //cant find texture in the database
+ //if (myresult.size ( ) ==0 )
+ if (1)
+ {
+
+ if ( add == true)
+ {
+ //add object to the DB
+ cout<< "Adding:" << texturedata.name << " texture to the ArtDB \n";
+
+ //todo add stuff here
+ }
+ //texture not found in the the DB
+
+ if (strict)
+ {
+ //cout<<",Not Found !" <<endl;
+ sprintf(output," ERROR :%s texture not found in the ArtDB",texturedata.name);
+ texture_errors.add(output);
+ //cout<<"ERROR :"<<texturedata.name<< " texture not found in the ArtDB \n";
+ error = true;
+ }
+
+ //check texture attributes against the default limits
+
+ //check against art limits
+ if(texturedata.height>MAX_TEXTURE_SIZE)
+ {
+ error=true;
+ sprintf(output," ERROR : %u Height exceeds Max Texture SIZE OF %u",texturedata.height,MAX_TEXTURE_SIZE);
+ texture_errors.add(output);
+ // cout<<" =====>Warning "<<texturedata.name<<" : "<< texturedata.height << " Height exceeds Max Texture SIZE OF "<<MAX_TEXTURE_SIZE<<endl;
+ }
+
+ if(texturedata.width>MAX_TEXTURE_SIZE)
+ {
+ error=true;
+ sprintf(output," ERROR : %u Width exceeds Max Texture SIZE OF %u",texturedata.width,MAX_TEXTURE_SIZE);
+ texture_errors.add(output);
+ // cout<<" =====>Warning "<<texturedata.name<<": "<< texturedata.width << " Width exceeds Max Texture SIZE OF "<<MAX_TEXTURE_SIZE<<endl;
+ }
+
+ if(texturedata.bpp>MAX_BPP)
+ {
+ error=true;
+ sprintf(output," ERROR : %u BPP exceeds Max BPP SIZE OF %u",texturedata.bpp,MAX_BPP);
+ texture_errors.add(output);
+ //cout<<" =====>Warning "<<texturedata.name<<": "<< texturedata.bpp << " BPP exceeds Max BPP SIZE OF "<<MAX_BPP<<endl;
+ }
+ // cout<<" Warning :"<<texturedata.name<< " texture not found in the ArtDB \n";
+
+ }//end if in artdb block
+
+ //if(myresult.size()!=0)
+ if(0)
+ {
+ //cout <<",Found . " << endl;
+
+ /*
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+
+ row =*sql_iterator;
+ int height= row["height"];
+ int width=row["width"];
+ int bpp=row["bpp"];
+ int alpha=row["alphabits"];
+
+
+ //check texture height
+ if( texturedata.height > height)
+ {
+ if (strict)
+ {
+ error=true;
+ sprintf(output," ERROR :Texture height %u exceeds expected %u",texturedata.height,height);
+ texture_errors.add(output);
+ }
+ else
+ {
+ sprintf(output," Warning :Texture height %u exceeds expected %u",texturedata.height,height);
+ texture_errors.add(output);
+ }
+ }//end if
+
+ //check width
+ if( texturedata.width > width)
+ {
+ if (strict)
+ {
+ error=true;
+ sprintf(output," ERROR :Texture width %u exceeds expected %u",texturedata.width,width);
+ texture_errors.add(output);
+ }
+ else
+ {
+ sprintf(output," Warning :Texture width %u exceeds expected %u",texturedata.width,width);
+ texture_errors.add(output);
+ }
+ }//end if
+
+ //check bpp
+ if( texturedata.bpp > bpp)
+ {
+ if (strict)
+ {
+ error=true;
+ sprintf(output," ERROR :Texture BPP %u exceeds expected %u",texturedata.bpp,bpp);
+ texture_errors.add(output);
+ }
+ else
+ {
+ sprintf(output," Warning :Texture BPP %u exceeds expected %u",texturedata.bpp,bpp);
+ texture_errors.add(output);
+ }
+ }//end if
+
+
+
+
+ //just printing out the rows
+ //for (int j=0;j<row.size ( ); j++)
+ //{
+ // cout<< "[" << row[j] << "]" ;
+ //}
+ //cout<<endl;
+
+ }//end for iterator loop
+
+ */
+
+ }//end if found in the Artdb block
+
+
+
+
+ if (error)
+ {
+ if(!suppress)
+ {
+ printf("\n");
+ printf("%s Texture:\n",texturedata.name);
+ texture_errors.print();
+ printf("\n");
+ }
+ badtextures.add(texturedata.name,1,0);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+
+}// end texture lookup
+
+
+//helper funtion to check shader, returns 0 if shader matches db ,1 if their is a mismatch
+int shaderlookup(shader_data* lp_shaderdata, bool add, bool strict,bool showall,badlist& badshaders,bool suppress)
+{
+
+ bool error=false;
+ char querybuffer [1000];
+ char output [1000];
+ //Result::iterator sql_iterator;
+ //Row row;
+ outputbuffer shader_errors;
+ sprintf(querybuffer, "SELECT * FROM shaders WHERE name = '%s' ",lp_shaderdata->name);
+ //query<< querybuffer;
+ //Result myresult= query.store ( );
+
+
+// if (myresult.size ( ) ==0 )
+ if (1)
+ {
+
+ if ( add == true)
+ {
+ //add object to the DB
+ printf("Adding: %s shader to the ArtDB \n",lp_shaderdata->name);
+ //todo add stuff here
+ }
+
+ if (strict)
+ {
+ sprintf(output," ERROR: %s Shader not found in the ArtDB",lp_shaderdata->name);
+ shader_errors.add(output);
+ }
+
+ //check for lit
+ if ( lp_shaderdata->lit)
+ {
+ shader_errors.add(" =====>ERROR : LIT shader FOUND!");
+ error = true;
+
+ if(badshaders.inlist(lp_shaderdata->name) ==0)
+ {
+ badshaders.add(lp_shaderdata->name,1,0);
+ }
+ }
+/*
+ if ((lp_shaderdata->twosid) == 0)
+ {
+ shader_errors.add(" =====>Warning : Double Sided FLAG is 0!");
+ error=true;
+ }
+
+ */
+
+ }//end if shader in artdb check
+
+ //cout << "Records Found: " << myresult.size() << endl ;
+/*
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+ row =*sql_iterator;
+
+ //just printing out the rows
+ for (int j=0;j<row.size ( ); j++)
+ {
+ cout<< "[" << row[j] << "]" ;
+ }
+ cout<<endl;
+ }//end for iterator loop
+*/
+
+ if (error)
+ {
+ if(!suppress)
+ {
+
+ printf("\n");
+ printf("%s shader : \n",lp_shaderdata->name);
+ shader_errors.print();
+ }
+ if(strict)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+
+}// end shader lookup
+
+/*
+
+
+//helper funtion to check object, returns 0 if shader matches db ,1 if their is a mismatch
+int artobjectlookup(art_object* lp_artobject, Query& query,bool add, bool strict,bool showall,bool suppress)
+{
+
+ char querybuffer [1000];
+ Result::iterator sql_iterator;
+ Row row;
+ unsigned int artpropid,shaderid;
+ bool error= false;
+
+ //setup a query to artdb ask if object is in Artdb
+
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",lp_artobject->name);
+ query<< querybuffer;
+ Result myresult= query.store ( );
+ //cout << "Records Found: " << myresult.size() << endl ;
+
+ //if result size is zero, object not found
+ //if ( myresult.size ( ) ==0 )
+ if(1)
+ {
+ if ( add == true)
+ {
+ //add object to the DB
+ cout<< "Adding:" << lp_artobject->name << " to the ArtDB \n";
+ //todo add stuff here
+
+ return 0;
+ }
+ //object not found in the the DB halt
+ else
+ {
+ if (strict)
+ {
+ printf("ERROR: %s object not found in the ArtDB, \n",lp_artobject->name);
+ error =true;
+ }
+ else
+ {
+ printf("Warning:%s object not found in the ArtDB \n",lp_artobject->name);
+ }
+ }
+ }//end if object in artdb check
+
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+ row =*sql_iterator;
+ artpropid = row["artpropid"];
+ shaderid = row["shaderid"];
+ //just printing out the rows
+ for (int j=0;j<row.size ( ); j++)
+ {
+ cout<< "[" << row[j] << "]" ;
+ }
+ cout<<endl;
+ }//end for iterator loop
+
+
+ //check check the art proporties if less than max vertices,etc then we ok
+ sprintf(querybuffer, "SELECT * FROM artprops WHERE id = '%i' ",artpropid);
+ query<< querybuffer;
+ myresult= query.store ( );
+
+ cout << "Records Found: " << myresult.size() << endl ;
+ //check if artprops in the ArtDB
+ //if ( myresult.size ( ) ==0 )
+ if(1)
+ {
+ if ( add == true)
+ {
+ //add object to the DB
+ cout<< "Adding:" <<lp_artobject->name << " art props to the ArtDB \n";
+ cout<< "Adding: Artprops to artdb \n";
+ return 0;
+
+ //todo add stuff here
+ }
+
+ //object not found in the the DB halt
+ else
+ {
+ if (strict)
+ {
+ cout<<"ERROR: "<<lp_artobject->name<< " Art properties not found in the ArtDB, Halting \n";
+ error=true;
+ }
+ else
+ {
+ cout<<"Warning: "<<lp_artobject->name<< " Art properties not found in the ArtDB, using default physic properties\n";
+ }//end else
+ }//end else
+ }//end if
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+ row =*sql_iterator;
+
+ unsigned int vertexcount,polycount,shadercount,bonecount,animationframes;
+ vertexcount=row["VertexCount"];
+ polycount=row["PolyCount"];
+ shadercount=row["ShaderCount"];
+ bonecount=row["BoneCount"];
+ animationframes=row["Animframes"];
+
+ if (strict)
+ {
+ if( lp_artobject->art_properties.vertex_count > vertexcount)
+ {
+ cout<<"ERROR:"<< lp_artobject->name<<" has exceeded " << row["VertexCount"]<<" Vertexcount, HALTING \n";
+ error =true;
+ }
+
+ if( lp_artobject->art_properties.poly_count > polycount)
+ {
+ cout<<"ERROR:"<< lp_artobject->name<<" has exceeded " << row["PolyCount"]<<" Polycount, HALTING \n";
+ error =true;
+ }
+
+ if( lp_artobject->art_properties.animation_frames > animationframes)
+ {
+ cout<<"ERROR:"<< lp_artobject->name<<" has exceeded " << row["AnimFrames"]<< " Animation frames, HALTING \n";
+ error =true;
+ }
+
+ if( lp_artobject->art_properties.bone_count > bonecount)
+ {
+ cout<<"ERROR:"<< lp_artobject->name<<" has exceeded " << row["BoneCount"]<<" Bonecount, HALTING \n";
+ error =true;
+ }
+
+ if( lp_artobject->art_properties.shader_count > shadercount)
+ {
+ cout<<"ERROR:"<< lp_artobject->name<<" has exceeded " << row["ShaderCount"]<<" Shadercount, HALTING\n";
+ error =true;
+ }
+ }//end if artprops check
+ else
+ {
+ if( lp_artobject->art_properties.vertex_count > vertexcount)
+ {
+ cout<<"Warning:"<< lp_artobject->name<<" has exceeded " << row["VertexCount"]<<" Vertexcount \n";
+ }
+
+ if( lp_artobject->art_properties.poly_count > polycount)
+ {
+ cout<<"Warning:"<< lp_artobject->name<<" has exceeded " << row["PolyCount"]<<" Polycount \n";
+ }
+
+ if( lp_artobject->art_properties.animation_frames > animationframes)
+ {
+ cout<<"Warning:"<< lp_artobject->name<<" has exceeded " << row["AnimFrames"]<< " Animation frames \n";
+ }
+
+ if( lp_artobject->art_properties.bone_count > bonecount)
+ {
+ cout<<"Warning:"<< lp_artobject->name<<" has exceeded " << row["BoneCount"]<<" Bonecount \n";
+ }
+
+ if( lp_artobject->art_properties.shader_count > shadercount)
+ {
+ cout<<"Warning:"<< lp_artobject->name<<" has exceeded " << row["ShaderCount"]<<" Shadercount \n";
+ }
+ }// end else artprops check
+
+
+
+ }//for loop end artobjectlookup
+
+
+ //printing art props
+
+ for (int j=0;j<row.size ( ); j++)
+ {
+ cout<< "[" << row[j] << "]" ;
+ }
+
+
+ printf("\n");
+
+ if (error)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+
+}//end artobject lookup
+
+
+//*************************************************************************
+// Check's if root of Bound Volume exists, if not then treats it as a strict object
+
+int bvobjectlookup(bv_data* lp_bvobject,Query& query,bool add,bool strict,bool showall,bool suppress)
+{
+ bool errors =false;
+ char querybuffer [1000];
+ char output[1000];
+ outputbuffer bv_errors;
+ Result::iterator sql_iterator;
+ Row row;
+
+
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",lp_bvobject->name);
+ query<< querybuffer;
+ Result myresult= query.store ( );
+
+
+ if (myresult.size ( ) ==0 )
+ {
+ if ( add == true)
+ {
+ //add object to the DB
+ //cout<< "Adding:" << lp_shaderdata->name << " shader to the ArtDB \n";
+
+ //todo add stuff here
+ }
+ //object not found in the the DB halt
+ else
+ {
+ if (strict)
+ {
+ sprintf(output,"ERROR: %s object not found in the ArtDB \n",lp_bvobject->name);
+ bv_errors.add(output);
+ //cout<<" ERROR:"<<lp_bvobject->name<< " object not found in the ArtDB \n";
+ //return 1;
+ errors =true;
+ }
+ else
+ {
+ errors =true;
+ sprintf(output,"Warning: %s object not found in the ArtDB , using defaults vaules for ObjectAttributeChunk \n",lp_bvobject->name);
+ bv_errors.add(output);
+ //cout<<" Warning:"<<lp_bvobject->name<< " bv object not found in the ArtDB, using defaults vaules for ObjectAttributeChunk \n";
+ lp_bvobject->physpropid=0;
+ lp_bvobject->classtype=2; // set to dsg_static_phys
+ }
+
+ }
+
+ }//end if object check in artdb check
+
+ // cout << "Records Found: " << myresult.size() << endl ;
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+
+ row =*sql_iterator;
+ lp_bvobject->classtype =2;
+ lp_bvobject->physpropid=row["physpropid"];
+
+
+ //just printing out the rows
+ for (int j=0;j<row.size ( ); j++)
+ {
+ cout<< "[" << row[j] << "]" ;
+ }
+
+ cout<<endl;
+
+
+ }//end for iterator loop
+
+ if (errors)
+ {
+ if(strict)
+ {
+ bv_errors.print();
+ return 1;
+ }
+ else
+ {
+ if(!suppress)
+ {
+ bv_errors.print ();
+ }
+ return 0;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+}// end of Bv object check
+
+
+*/ \ No newline at end of file
diff --git a/tools/ArtChecker/artchecker.dsp b/tools/ArtChecker/artchecker.dsp
new file mode 100644
index 0000000..ebb8f83
--- /dev/null
+++ b/tools/ArtChecker/artchecker.dsp
@@ -0,0 +1,128 @@
+# Microsoft Developer Studio Project File - Name="artchecker" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=artchecker - Win32 Tools Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "artchecker.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "artchecker.mak" CFG="artchecker - Win32 Tools Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "artchecker - Win32 Tools Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "artchecker - Win32 Tools Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "artchecker"
+# PROP Scc_LocalPath "."
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "artchecker - Win32 Tools Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "artchecker___Win32_Tools_Debug"
+# PROP BASE Intermediate_Dir "artchecker___Win32_Tools_Debug"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEBUG" /YX /FD /GZ /c
+# ADD CPP /nologo /MD /W3 /GR /GX /ZI /Od /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /FR /YX /FD /GZ /c
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"
+# ADD RSC /l 0x1009 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"C:\mysql++\lib\\"
+# SUBTRACT BASE LINK32 /incremental:no
+# ADD LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"C:\mysql++\lib\\"
+# SUBTRACT LINK32 /incremental:no
+
+!ELSEIF "$(CFG)" == "artchecker - Win32 Tools Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "artchecker___Win32_Tools_Release"
+# PROP BASE Intermediate_Dir "artchecker___Win32_Tools_Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "RAD_RELEASE" /D "RAD_PC" /D "RAD_WIN32" /FR /YX /FD /c
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"
+# ADD RSC /l 0x1009 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ENDIF
+
+# Begin Target
+
+# Name "artchecker - Win32 Tools Debug"
+# Name "artchecker - Win32 Tools Release"
+# Begin Group "sourcefile"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\artchecker.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\artobject.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\badlist.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\outputbuffer.cpp
+# End Source File
+# End Group
+# Begin Group "header"
+
+# PROP Default_Filter ".h"
+# Begin Source File
+
+SOURCE=.\artlimits.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\artobject.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\badlist.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\outputbuffer.hpp
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/ArtChecker/artchecker.exe b/tools/ArtChecker/artchecker.exe
new file mode 100644
index 0000000..d258eb8
--- /dev/null
+++ b/tools/ArtChecker/artchecker.exe
Binary files differ
diff --git a/tools/ArtChecker/artlimits.h b/tools/ArtChecker/artlimits.h
new file mode 100644
index 0000000..a2fb3b5
--- /dev/null
+++ b/tools/ArtChecker/artlimits.h
@@ -0,0 +1,3 @@
+#define MAX_TEXTURE_SIZE 64
+#define MAX_BPP 8
+#define MAX_POLYCOUNT 500 \ No newline at end of file
diff --git a/tools/ArtChecker/artlimits.hpp b/tools/ArtChecker/artlimits.hpp
new file mode 100644
index 0000000..f1d00a3
--- /dev/null
+++ b/tools/ArtChecker/artlimits.hpp
@@ -0,0 +1,2 @@
+#define MAX_TEXTURE_SIZE 256
+#define MAX_BPP 8
diff --git a/tools/ArtChecker/artobject.cpp b/tools/ArtChecker/artobject.cpp
new file mode 100644
index 0000000..fcd120d
--- /dev/null
+++ b/tools/ArtChecker/artobject.cpp
@@ -0,0 +1,46 @@
+#include <cstring>
+#include "artobject.h"
+
+
+art_object::art_object ( )
+{
+ int i,j;
+
+ for (i=0;i<max_shaders;i++)
+ {
+ for (j=0;j<max_textures;j++)
+ {
+ strcpy(shader_list[i].texture_list[j].name, "no name");
+ shader_list[i].texture_list[j].width =0;
+ shader_list[i].texture_list[j].height =0;
+ shader_list[i].texture_list[j].bpp =0;
+ shader_list[i].texture_list[j].alpha =0;
+ }//end for
+
+ strcpy (shader_list[i].name, "no name");
+ shader_list[i].lit =false;
+ }//end for
+
+ //setting default art vaules
+ art_properties.vertex_count =0;
+ art_properties.poly_count =0;
+ art_properties.animation_frames =0;
+ art_properties.shader_count =0;
+ art_properties.bone_count =0;
+
+ //set default art_object vaules
+
+ strcpy(name,"no name");
+
+}
+
+art_object::~art_object( )
+{
+
+}
+
+
+
+
+
+
diff --git a/tools/ArtChecker/artobject.h b/tools/ArtChecker/artobject.h
new file mode 100644
index 0000000..eff09ab
--- /dev/null
+++ b/tools/ArtChecker/artobject.h
@@ -0,0 +1,59 @@
+#define max_length 64
+#define max_textures 3
+#define max_shaders 14
+
+struct texture_data
+{
+ char name[max_length] ;
+ unsigned int width;
+ unsigned int height;
+ unsigned int bpp;
+ unsigned int alpha;
+};
+
+
+struct shader_data
+{
+ char name[max_length];
+ unsigned int lit;
+ unsigned int twosid;
+
+ texture_data texture_list[max_textures];
+};
+
+struct art_data
+{
+ unsigned int vertex_count;
+ unsigned int poly_count;
+ unsigned int animation_frames;
+ unsigned int shader_count;
+ unsigned int bone_count;
+};
+
+
+struct bv_data
+{
+ char name[max_length];
+ unsigned int physpropid;
+ unsigned int classtype;
+};
+
+
+
+class art_object
+{
+
+public:
+//data
+ shader_data shader_list[max_shaders];
+ art_data art_properties;
+ char name[max_length];
+
+//methods
+ art_object ( );
+ ~art_object( );
+
+};
+
+
+
diff --git a/tools/ArtChecker/atcmaker.exe b/tools/ArtChecker/atcmaker.exe
new file mode 100644
index 0000000..e0390c7
--- /dev/null
+++ b/tools/ArtChecker/atcmaker.exe
Binary files differ
diff --git a/tools/ArtChecker/badlist.cpp b/tools/ArtChecker/badlist.cpp
new file mode 100644
index 0000000..bcce4ca
--- /dev/null
+++ b/tools/ArtChecker/badlist.cpp
@@ -0,0 +1,90 @@
+#include "badlist.hpp"
+#include <cstring>
+#include<stdio.h>
+
+badlist::badlist ()
+{
+ max_items=200;
+ data_array=new entity_data[max_items];
+ index = 0;
+ totalmemoryusage =0;
+ for(unsigned int i=0;i<max_items;i++)
+ {
+ strcpy(data_array[i].name," ");
+ data_array[i].occurances=0;
+ data_array[i].size=0;
+ }
+}
+badlist::badlist (const unsigned int arraysize)
+{
+ max_items=arraysize;
+ data_array=new entity_data[max_items];
+ index = 0;
+ totalmemoryusage =0;
+ for(unsigned int i=0;i<max_items;i++)
+ {
+ strcpy(data_array[i].name," ");
+ data_array[i].occurances=0;
+ data_array[i].size=0;
+ }
+}
+
+
+
+
+badlist::~badlist ()
+{
+}
+
+int badlist::add(const char* name,const unsigned int occurances,const unsigned int size)
+{
+ if (index<max_items-1)
+ {
+ strcpy( data_array[index].name,name);
+ data_array[index].occurances=occurances;
+ data_array[index].size=size;
+ totalmemoryusage+=size;
+ index++;
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+int badlist::inlist(const char* name)
+{
+ unsigned int i=0;
+ do
+ {
+ if(strcmp(name,data_array[i].name) ==0)
+ {
+ //printf("%s found in list \n",name);
+ return 1;
+ }
+ i++;
+ } while (i<index);
+
+ return 0;
+}
+
+int badlist::getsize()
+{
+ return totalmemoryusage;
+}
+
+int badlist::getindexcount()
+{
+ return index;
+}
+
+
+int badlist::printverbose()
+{
+ for (unsigned int i=0;i<index;i++)
+ {
+ printf("%-30s: size in bytes: %6i \n",data_array[i].name,data_array[i].size);
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/tools/ArtChecker/badlist.hpp b/tools/ArtChecker/badlist.hpp
new file mode 100644
index 0000000..727ca47
--- /dev/null
+++ b/tools/ArtChecker/badlist.hpp
@@ -0,0 +1,33 @@
+//#define max_items 200
+struct entity_data
+{
+
+ char name [40];
+ unsigned int occurances;
+ unsigned int size;
+};
+
+
+class badlist
+{
+ public:
+
+
+ int add (const char * name,const unsigned int occurances,const unsigned int size);
+ int inlist (const char * name);
+ int getsize();
+ int getindexcount();
+ int printverbose();
+
+ badlist ();
+ badlist (const unsigned int arraysize);
+ ~badlist();
+
+ private:
+ unsigned int max_items;
+ entity_data* data_array ;
+ unsigned int index;
+ unsigned int totalmemoryusage;
+
+};
+
diff --git a/tools/ArtChecker/check.bat b/tools/ArtChecker/check.bat
new file mode 100644
index 0000000..6b932aa
--- /dev/null
+++ b/tools/ArtChecker/check.bat
@@ -0,0 +1,2 @@
+@artchecker %1
+@pause \ No newline at end of file
diff --git a/tools/ArtChecker/libmySQL.dll b/tools/ArtChecker/libmySQL.dll
new file mode 100644
index 0000000..53c753d
--- /dev/null
+++ b/tools/ArtChecker/libmySQL.dll
Binary files differ
diff --git a/tools/ArtChecker/summary.bat b/tools/ArtChecker/summary.bat
new file mode 100644
index 0000000..88ca88e
--- /dev/null
+++ b/tools/ArtChecker/summary.bat
@@ -0,0 +1,13 @@
+:// Usage summary <destination filename>
+:// example summary myfile.txt
+
+
+dir *.p3d /b> dir.txt
+
+@perl d:\artchecker\summary.pl dir.txt
+
+:// ..\..\..\build\ps2\LevelMemoryNumbers.txt
+
+del dir.txt
+
+
diff --git a/tools/ArtChecker/summary.pl b/tools/ArtChecker/summary.pl
new file mode 100644
index 0000000..83ed95d
--- /dev/null
+++ b/tools/ArtChecker/summary.pl
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+
+$filename=@ARGV[0];
+
+##############################################################################
+# MAIN
+##############################################################################
+
+#open file
+open(FILE_HANDLE,$filename) || die "Could not open file ERROR: $filename!";
+
+
+#while not EOF and read in string
+while (<FILE_HANDLE>)
+{
+ $string = $_;
+ chop($string);
+ #print $string;
+ @todo =("artchecker ",$string," sum");
+ system (@todo) # == 0 or die "Failed to Execute Artchecker Command !\n";
+}
+
+close(FILE_HANDLE); \ No newline at end of file
diff --git a/tools/ArtChecker/summaryall.bat b/tools/ArtChecker/summaryall.bat
new file mode 100644
index 0000000..648eea5
--- /dev/null
+++ b/tools/ArtChecker/summaryall.bat
@@ -0,0 +1,13 @@
+:// Usage summary <destination filename>
+:// example summary myfile.txt
+
+
+dir *.p3d /b> dir.txt
+
+@perl d:\artchecker\summaryall.pl dir.txt
+
+:// ..\..\..\build\ps2\LevelMemoryNumbers.txt
+
+del dir.txt
+
+
diff --git a/tools/ArtChecker/summaryall.pl b/tools/ArtChecker/summaryall.pl
new file mode 100644
index 0000000..e69e131
--- /dev/null
+++ b/tools/ArtChecker/summaryall.pl
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+
+$filename=@ARGV[0];
+
+##############################################################################
+# MAIN
+##############################################################################
+
+#open file
+open(FILE_HANDLE,$filename) || die "Could not open file ERROR: $filename!";
+
+
+#while not EOF and read in string
+while (<FILE_HANDLE>)
+{
+ $string = $_;
+ chop($string);
+ #print $string;
+ @todo =("artchecker ",$string);
+ system (@todo) # == 0 or die "Failed to Execute Artchecker Command !\n";
+}
+
+close(FILE_HANDLE); \ No newline at end of file
diff --git a/tools/Backup/tools.sln b/tools/Backup/tools.sln
new file mode 100644
index 0000000..36917a8
--- /dev/null
+++ b/tools/Backup/tools.sln
@@ -0,0 +1,725 @@
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimCollDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimCollDSGMaker\AnimCollDSGMaker.vcproj", "{2DBC8F99-0223-499F-9AC1-4702EA5DD47B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimDSGMaker\AnimDSGMaker.vcproj", "{FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InstAnimDynaPhysMaker", "..\game\libs\pure3d\tools\commandline\InstAnimDynaPhysMaker\InstAnimDynaPhysMaker.vcproj", "{C8C67032-1BBC-4050-AEAE-2D43AE950C76}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Instancer", "..\game\libs\pure3d\tools\commandline\Instancer\Instancer.vcproj", "{3C294239-15AF-49E2-A5E8-E5CD2785FC3D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LensFlareDSGMaker", "..\game\libs\pure3d\tools\commandline\LensFlareDSGMaker\LensFlareDSGMaker.vcproj", "{B93AEF58-B533-4820-A0D0-1F8E91301129}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MayaRules", "MayaRules\MayaRules.vcproj", "{F456A1E8-974F-4D56-BB57-3D944DF8DCB1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Pure3D", "..\game\libs\pure3d\build\win32\Pure3D.vcproj", "{86DA78E6-9FC4-40B7-9E55-390903F2A144}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "breakablesmaker", "..\game\libs\pure3d\tools\commandline\breakablesmaker\breakablesmaker.vcproj", "{345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "chunkGroup", "..\game\libs\pure3d\tools\commandline\chunkGroup\chunkGroup.vcproj", "{E47D996B-68D6-47DE-B640-44B3C0363E6E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convert2dxtn", "..\game\libs\pure3d\tools\commandline\convert2dxtn\convert2dxtn.vcproj", "{F7404001-6D28-4698-9BF8-5B26426765EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.vcproj", "{6D333C70-A27D-4E25-AD26-BB9E20558B8F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "..\game\libs\pure3d\build\win32\libpng.vcproj", "{D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makechunktool", "..\game\libs\pure3d\tools\commandline\makechunktool\makechunktool.vcproj", "{01A371FA-BA4E-4DC9-B339-4E9552545991}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objectsnapper", "objectsnapper\build\objectsnapper.vcproj", "{278283D0-FEC2-4B06-8AED-8DDB745215B4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3d2dsg", "..\game\libs\pure3d\tools\commandline\p3d2dsg\p3d2dsg.vcproj", "{B1DD8C69-F562-4275-BE4E-7A6EF727ED30}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddel", "..\game\libs\pure3d\tools\commandline\p3ddel\p3ddel.vcproj", "{A7DFC4D3-FD76-4375-AD16-009BC39A697D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddiff", "..\game\libs\pure3d\tools\gui-win32\p3ddiff\p3ddiff.vcproj", "{84451C74-4E26-4557-9FB8-8C26243DAC55}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dexplorer", "..\game\libs\pure3d\tools\gui-win32\p3dexplorer\p3dexplorer.vcproj", "{72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgc", "..\game\libs\pure3d\tools\commandline\p3dgc\p3dgc.vcproj", "{44AB737E-AA4F-47AA-943B-D2ABA9CB424B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgendsg", "..\game\libs\pure3d\tools\commandline\p3dgendsg\p3dgendsg.vcproj", "{ACF60C5C-93C6-447B-92A2-477AECB0E19C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgeo2prims", "..\game\libs\pure3d\tools\commandline\p3dgeo2prims\p3dgeo2prims.vcproj", "{635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dimage", "..\game\libs\pure3d\tools\commandline\p3dimage\p3dimage.vcproj", "{AFE81408-CC31-4EAF-9597-4931F6C08CED}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dmutate", "..\game\libs\pure3d\tools\commandline\p3dmutate\p3dmutate.vcproj", "{A3C2F702-CE80-48D6-9217-E73E93F19F88}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsort", "..\game\libs\pure3d\tools\commandline\p3dsort\p3dsort.vcproj", "{DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsplit", "..\game\libs\pure3d\tools\commandline\p3dsplit\p3dsplit.vcproj", "{4C924B45-1710-4A4D-9D40-CC232B14CD44}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcontent", "..\game\libs\radcontent\build\win32\radcontent.vcproj", "{0C2A1DB4-652B-4F59-BBDC-376E94561647}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcore", "..\game\libs\radcore\build\win32\radcore.vcproj", "{A45F932B-0CF8-41B0-A8FF-1386283E2BE7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radmath", "..\game\libs\radmath\build\win32\radmath.vcproj", "{01B694CE-5AFC-4832-B18E-73AE3E811C74}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relatedfiles", "relatedfiles\relatedfiles.vcproj", "{EF05D776-F91E-422F-BD64-16B3F5557888}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "roadOptimizer", "..\game\libs\pure3d\tools\commandline\roadOptimizer\roadOptimizer.vcproj", "{37223926-26AB-4BCE-BBEB-191699C3BEF1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib", "..\game\libs\pure3d\toollib\toollib.vcproj", "{8CC3C650-909A-42E8-9039-04697C27C565}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib_extras", "..\game\libs\pure3d\toollib\toollib_extras.vcproj", "{CDB92E4A-1E5D-49A8-8153-34264B3FEF29}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trackeditor", "trackeditor\build\trackeditor.vcproj", "{8D79E782-9747-4732-A869-CA630AC7D3C0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "worldbuilder", "worldbuilder\build\worldbuilder.vcproj", "{B5900135-3859-403D-BC2F-FD90B4C2B2E5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\game\libs\pure3d\build\win32\zlib.vcproj", "{38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dcompdrawopt", "..\game\libs\pure3d\tools\commandline\p3dcompdrawopt\p3dcompdrawopt.vcproj", "{967364EA-F3C7-455E-BBA4-F8B031FB780C}"
+EndProject
+Global
+ GlobalSection(SourceCodeControl) = preSolution
+ SccNumberOfProjects = 37
+ SccProjectName0 = Perforce\u0020Project
+ SccLocalPath0 = .
+ SccProvider0 = MSSCCI:Perforce\u0020SCM
+ CanCheckoutShared = true
+ SolutionUniqueID = {A63DD452-9297-447E-95E4-99D497318CFE}
+ SccProjectUniqueName1 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimCollDSGMaker\\AnimCollDSGMaker.vcproj
+ SccLocalPath1 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimCollDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName2 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimDSGMaker\\AnimDSGMaker.vcproj
+ SccLocalPath2 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName3 = ..\\game\\libs\\pure3d\\tools\\commandline\\InstAnimDynaPhysMaker\\InstAnimDynaPhysMaker.vcproj
+ SccLocalPath3 = ..\\game\\libs\\pure3d\\tools\\commandline\\InstAnimDynaPhysMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName4 = ..\\game\\libs\\pure3d\\tools\\commandline\\Instancer\\Instancer.vcproj
+ SccLocalPath4 = ..\\game\\libs\\pure3d\\tools\\commandline\\Instancer
+ CanCheckoutShared = true
+ SccProjectUniqueName5 = ..\\game\\libs\\pure3d\\tools\\commandline\\LensFlareDSGMaker\\LensFlareDSGMaker.vcproj
+ SccLocalPath5 = ..\\game\\libs\\pure3d\\tools\\commandline\\LensFlareDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName6 = MayaRules\\MayaRules.vcproj
+ SccLocalPath6 = .
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection6 = MayaRules\\
+ SccProjectUniqueName7 = ..\\game\\libs\\pure3d\\build\\win32\\Pure3D.vcproj
+ SccLocalPath7 = ..\\game\\libs\\pure3d
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection7 = build\\win32\\
+ SccProjectUniqueName8 = ..\\game\\libs\\pure3d\\tools\\commandline\\breakablesmaker\\breakablesmaker.vcproj
+ SccLocalPath8 = ..\\game\\libs\\pure3d\\tools\\commandline\\breakablesmaker
+ CanCheckoutShared = true
+ SccProjectUniqueName9 = ..\\game\\libs\\pure3d\\tools\\commandline\\chunkGroup\\chunkGroup.vcproj
+ SccLocalPath9 = ..\\game\\libs\\pure3d\\tools\\commandline\\chunkGroup
+ CanCheckoutShared = true
+ SccProjectUniqueName10 = ..\\game\\libs\\pure3d\\tools\\commandline\\convert2dxtn\\convert2dxtn.vcproj
+ SccLocalPath10 = ..\\game\\libs\\pure3d\\tools\\commandline\\convert2dxtn
+ CanCheckoutShared = true
+ SccProjectUniqueName11 = ..\\game\\libs\\pure3d\\lib\\freetype\\builds\\win32\\visualc\\freetype.vcproj
+ SccLocalPath11 = ..\\game\\libs\\pure3d\\lib\\freetype\\builds\\win32\\visualc
+ CanCheckoutShared = true
+ SccProjectUniqueName12 = ..\\game\\libs\\pure3d\\build\\win32\\libpng.vcproj
+ SccLocalPath12 = ..\\game\\libs\\pure3d\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName13 = ..\\game\\libs\\pure3d\\tools\\commandline\\makechunktool\\makechunktool.vcproj
+ SccLocalPath13 = ..\\game\\libs\\pure3d\\tools\\commandline\\makechunktool
+ CanCheckoutShared = true
+ SccProjectUniqueName14 = objectsnapper\\build\\objectsnapper.vcproj
+ SccLocalPath14 = objectsnapper\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName15 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3d2dsg\\p3d2dsg.vcproj
+ SccLocalPath15 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3d2dsg
+ CanCheckoutShared = true
+ SccProjectUniqueName16 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3ddel\\p3ddel.vcproj
+ SccLocalPath16 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3ddel
+ CanCheckoutShared = true
+ SccProjectUniqueName17 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3ddiff\\p3ddiff.vcproj
+ SccLocalPath17 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3ddiff
+ CanCheckoutShared = true
+ SccProjectUniqueName18 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3dexplorer\\p3dexplorer.vcproj
+ SccLocalPath18 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3dexplorer
+ CanCheckoutShared = true
+ SccProjectUniqueName19 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgc\\p3dgc.vcproj
+ SccLocalPath19 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgc
+ CanCheckoutShared = true
+ SccProjectUniqueName20 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgendsg\\p3dgendsg.vcproj
+ SccLocalPath20 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgendsg
+ CanCheckoutShared = true
+ SccProjectUniqueName21 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgeo2prims\\p3dgeo2prims.vcproj
+ SccLocalPath21 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgeo2prims
+ CanCheckoutShared = true
+ SccProjectUniqueName22 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dimage\\p3dimage.vcproj
+ SccLocalPath22 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dimage
+ CanCheckoutShared = true
+ SccProjectUniqueName23 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dmutate\\p3dmutate.vcproj
+ SccLocalPath23 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dmutate
+ CanCheckoutShared = true
+ SccProjectUniqueName24 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsort\\p3dsort.vcproj
+ SccLocalPath24 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsort
+ CanCheckoutShared = true
+ SccProjectUniqueName25 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsplit\\p3dsplit.vcproj
+ SccLocalPath25 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsplit
+ CanCheckoutShared = true
+ SccProjectUniqueName26 = ..\\game\\libs\\radcontent\\build\\win32\\radcontent.vcproj
+ SccLocalPath26 = ..\\game\\libs\\radcontent
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection26 = build\\win32\\
+ SccProjectUniqueName27 = ..\\game\\libs\\radcore\\build\\win32\\radcore.vcproj
+ SccLocalPath27 = ..\\game\\libs\\radcore
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection27 = build\\win32\\
+ SccProjectUniqueName28 = ..\\game\\libs\\radmath\\build\\win32\\radmath.vcproj
+ SccLocalPath28 = ..\\game\\libs\\radmath\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName29 = relatedfiles\\relatedfiles.vcproj
+ SccLocalPath29 = relatedfiles
+ CanCheckoutShared = true
+ SccProjectUniqueName30 = ..\\game\\libs\\pure3d\\tools\\commandline\\roadOptimizer\\roadOptimizer.vcproj
+ SccLocalPath30 = ..\\game\\libs\\pure3d\\tools\\commandline\\roadOptimizer
+ CanCheckoutShared = true
+ SccProjectUniqueName31 = ..\\game\\libs\\pure3d\\toollib\\toollib.vcproj
+ SccLocalPath31 = ..\\game\\libs\\pure3d\\toollib
+ CanCheckoutShared = true
+ SccProjectUniqueName32 = ..\\game\\libs\\pure3d\\toollib\\toollib_extras.vcproj
+ SccLocalPath32 = ..\\game\\libs\\pure3d\\toollib
+ CanCheckoutShared = true
+ SccProjectUniqueName33 = trackeditor\\build\\trackeditor.vcproj
+ SccLocalPath33 = trackeditor\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName34 = worldbuilder\\build\\worldbuilder.vcproj
+ SccLocalPath34 = worldbuilder\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName35 = ..\\game\\libs\\pure3d\\build\\win32\\zlib.vcproj
+ SccLocalPath35 = ..\\game\\libs\\pure3d\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName36 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dcompdrawopt\\p3dcompdrawopt.vcproj
+ SccLocalPath36 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dcompdrawopt
+ CanCheckoutShared = true
+ EndGlobalSection
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = Debug
+ ConfigName.1 = Release
+ ConfigName.2 = Tools Debug
+ ConfigName.3 = Tools Release
+ ConfigName.4 = Tune
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.4 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.2 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.0 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.2 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.4 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.5 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.1 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.2 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.4 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.0 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.1 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.2 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.3 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.4 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.2 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.3 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.6 = {0C2A1DB4-652B-4F59-BBDC-376E94561647}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.6 = {86DA78E6-9FC4-40B7-9E55-390903F2A144}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.7 = {0C2A1DB4-652B-4F59-BBDC-376E94561647}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.8 = {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.1 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune.Build.0 = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Debug.ActiveCfg = Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Debug.Build.0 = Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Release.ActiveCfg = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Release.Build.0 = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Debug.Build.0 = Tools Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Release.ActiveCfg = Tools Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Release.Build.0 = Tools Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tune.ActiveCfg = Tune|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tune.Build.0 = Tune|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug.ActiveCfg = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release.ActiveCfg = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release.Build.0 = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug.Build.0 = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release.Build.0 = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune.Build.0 = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Debug.ActiveCfg = Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Debug.Build.0 = Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Release.ActiveCfg = Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Release.Build.0 = Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Debug.Build.0 = Tools Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Release.ActiveCfg = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Release.Build.0 = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tune.ActiveCfg = Tune|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tune.Build.0 = Tune|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune.Build.0 = Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune.Build.0 = Tools Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune.Build.0 = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Debug.ActiveCfg = Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Debug.Build.0 = Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Release.ActiveCfg = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Release.Build.0 = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Debug.Build.0 = Tools Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Release.ActiveCfg = Tools Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Release.Build.0 = Tools Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tune.ActiveCfg = Tune|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tune.Build.0 = Tune|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Debug.ActiveCfg = Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Debug.Build.0 = Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Release.ActiveCfg = Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Release.Build.0 = Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Debug.Build.0 = Tools Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Release.ActiveCfg = Tools Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Release.Build.0 = Tools Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tune.ActiveCfg = Tune|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tune.Build.0 = Tune|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Debug.ActiveCfg = Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Debug.Build.0 = Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Release.ActiveCfg = Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Release.Build.0 = Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Debug.Build.0 = Tools Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Release.ActiveCfg = Tools Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Release.Build.0 = Tools Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tune.ActiveCfg = Tune|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tune.Build.0 = Tune|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release.Build.0 = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Release.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune.Build.0 = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Debug.ActiveCfg = Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Debug.Build.0 = Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Release.ActiveCfg = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Release.Build.0 = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Debug.Build.0 = Tools Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Release.ActiveCfg = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Release.Build.0 = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tune.ActiveCfg = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tune.Build.0 = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug.ActiveCfg = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug.Build.0 = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release.ActiveCfg = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release.Build.0 = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug.Build.0 = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release.ActiveCfg = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release.Build.0 = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune.ActiveCfg = Tune|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune.Build.0 = Tune|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune.Build.0 = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Debug.ActiveCfg = Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Debug.Build.0 = Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Release.ActiveCfg = Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Release.Build.0 = Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Debug.Build.0 = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Release.ActiveCfg = Tools Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Release.Build.0 = Tools Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tune.ActiveCfg = Tune|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tune.Build.0 = Tune|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/tools/Backup1/tools.sln b/tools/Backup1/tools.sln
new file mode 100644
index 0000000..36917a8
--- /dev/null
+++ b/tools/Backup1/tools.sln
@@ -0,0 +1,725 @@
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimCollDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimCollDSGMaker\AnimCollDSGMaker.vcproj", "{2DBC8F99-0223-499F-9AC1-4702EA5DD47B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimDSGMaker\AnimDSGMaker.vcproj", "{FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InstAnimDynaPhysMaker", "..\game\libs\pure3d\tools\commandline\InstAnimDynaPhysMaker\InstAnimDynaPhysMaker.vcproj", "{C8C67032-1BBC-4050-AEAE-2D43AE950C76}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Instancer", "..\game\libs\pure3d\tools\commandline\Instancer\Instancer.vcproj", "{3C294239-15AF-49E2-A5E8-E5CD2785FC3D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LensFlareDSGMaker", "..\game\libs\pure3d\tools\commandline\LensFlareDSGMaker\LensFlareDSGMaker.vcproj", "{B93AEF58-B533-4820-A0D0-1F8E91301129}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MayaRules", "MayaRules\MayaRules.vcproj", "{F456A1E8-974F-4D56-BB57-3D944DF8DCB1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Pure3D", "..\game\libs\pure3d\build\win32\Pure3D.vcproj", "{86DA78E6-9FC4-40B7-9E55-390903F2A144}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "breakablesmaker", "..\game\libs\pure3d\tools\commandline\breakablesmaker\breakablesmaker.vcproj", "{345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "chunkGroup", "..\game\libs\pure3d\tools\commandline\chunkGroup\chunkGroup.vcproj", "{E47D996B-68D6-47DE-B640-44B3C0363E6E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convert2dxtn", "..\game\libs\pure3d\tools\commandline\convert2dxtn\convert2dxtn.vcproj", "{F7404001-6D28-4698-9BF8-5B26426765EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.vcproj", "{6D333C70-A27D-4E25-AD26-BB9E20558B8F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "..\game\libs\pure3d\build\win32\libpng.vcproj", "{D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makechunktool", "..\game\libs\pure3d\tools\commandline\makechunktool\makechunktool.vcproj", "{01A371FA-BA4E-4DC9-B339-4E9552545991}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objectsnapper", "objectsnapper\build\objectsnapper.vcproj", "{278283D0-FEC2-4B06-8AED-8DDB745215B4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3d2dsg", "..\game\libs\pure3d\tools\commandline\p3d2dsg\p3d2dsg.vcproj", "{B1DD8C69-F562-4275-BE4E-7A6EF727ED30}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddel", "..\game\libs\pure3d\tools\commandline\p3ddel\p3ddel.vcproj", "{A7DFC4D3-FD76-4375-AD16-009BC39A697D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddiff", "..\game\libs\pure3d\tools\gui-win32\p3ddiff\p3ddiff.vcproj", "{84451C74-4E26-4557-9FB8-8C26243DAC55}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dexplorer", "..\game\libs\pure3d\tools\gui-win32\p3dexplorer\p3dexplorer.vcproj", "{72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgc", "..\game\libs\pure3d\tools\commandline\p3dgc\p3dgc.vcproj", "{44AB737E-AA4F-47AA-943B-D2ABA9CB424B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgendsg", "..\game\libs\pure3d\tools\commandline\p3dgendsg\p3dgendsg.vcproj", "{ACF60C5C-93C6-447B-92A2-477AECB0E19C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgeo2prims", "..\game\libs\pure3d\tools\commandline\p3dgeo2prims\p3dgeo2prims.vcproj", "{635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dimage", "..\game\libs\pure3d\tools\commandline\p3dimage\p3dimage.vcproj", "{AFE81408-CC31-4EAF-9597-4931F6C08CED}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dmutate", "..\game\libs\pure3d\tools\commandline\p3dmutate\p3dmutate.vcproj", "{A3C2F702-CE80-48D6-9217-E73E93F19F88}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsort", "..\game\libs\pure3d\tools\commandline\p3dsort\p3dsort.vcproj", "{DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsplit", "..\game\libs\pure3d\tools\commandline\p3dsplit\p3dsplit.vcproj", "{4C924B45-1710-4A4D-9D40-CC232B14CD44}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcontent", "..\game\libs\radcontent\build\win32\radcontent.vcproj", "{0C2A1DB4-652B-4F59-BBDC-376E94561647}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcore", "..\game\libs\radcore\build\win32\radcore.vcproj", "{A45F932B-0CF8-41B0-A8FF-1386283E2BE7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radmath", "..\game\libs\radmath\build\win32\radmath.vcproj", "{01B694CE-5AFC-4832-B18E-73AE3E811C74}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relatedfiles", "relatedfiles\relatedfiles.vcproj", "{EF05D776-F91E-422F-BD64-16B3F5557888}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "roadOptimizer", "..\game\libs\pure3d\tools\commandline\roadOptimizer\roadOptimizer.vcproj", "{37223926-26AB-4BCE-BBEB-191699C3BEF1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib", "..\game\libs\pure3d\toollib\toollib.vcproj", "{8CC3C650-909A-42E8-9039-04697C27C565}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib_extras", "..\game\libs\pure3d\toollib\toollib_extras.vcproj", "{CDB92E4A-1E5D-49A8-8153-34264B3FEF29}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trackeditor", "trackeditor\build\trackeditor.vcproj", "{8D79E782-9747-4732-A869-CA630AC7D3C0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "worldbuilder", "worldbuilder\build\worldbuilder.vcproj", "{B5900135-3859-403D-BC2F-FD90B4C2B2E5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\game\libs\pure3d\build\win32\zlib.vcproj", "{38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dcompdrawopt", "..\game\libs\pure3d\tools\commandline\p3dcompdrawopt\p3dcompdrawopt.vcproj", "{967364EA-F3C7-455E-BBA4-F8B031FB780C}"
+EndProject
+Global
+ GlobalSection(SourceCodeControl) = preSolution
+ SccNumberOfProjects = 37
+ SccProjectName0 = Perforce\u0020Project
+ SccLocalPath0 = .
+ SccProvider0 = MSSCCI:Perforce\u0020SCM
+ CanCheckoutShared = true
+ SolutionUniqueID = {A63DD452-9297-447E-95E4-99D497318CFE}
+ SccProjectUniqueName1 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimCollDSGMaker\\AnimCollDSGMaker.vcproj
+ SccLocalPath1 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimCollDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName2 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimDSGMaker\\AnimDSGMaker.vcproj
+ SccLocalPath2 = ..\\game\\libs\\pure3d\\tools\\commandline\\AnimDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName3 = ..\\game\\libs\\pure3d\\tools\\commandline\\InstAnimDynaPhysMaker\\InstAnimDynaPhysMaker.vcproj
+ SccLocalPath3 = ..\\game\\libs\\pure3d\\tools\\commandline\\InstAnimDynaPhysMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName4 = ..\\game\\libs\\pure3d\\tools\\commandline\\Instancer\\Instancer.vcproj
+ SccLocalPath4 = ..\\game\\libs\\pure3d\\tools\\commandline\\Instancer
+ CanCheckoutShared = true
+ SccProjectUniqueName5 = ..\\game\\libs\\pure3d\\tools\\commandline\\LensFlareDSGMaker\\LensFlareDSGMaker.vcproj
+ SccLocalPath5 = ..\\game\\libs\\pure3d\\tools\\commandline\\LensFlareDSGMaker
+ CanCheckoutShared = true
+ SccProjectUniqueName6 = MayaRules\\MayaRules.vcproj
+ SccLocalPath6 = .
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection6 = MayaRules\\
+ SccProjectUniqueName7 = ..\\game\\libs\\pure3d\\build\\win32\\Pure3D.vcproj
+ SccLocalPath7 = ..\\game\\libs\\pure3d
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection7 = build\\win32\\
+ SccProjectUniqueName8 = ..\\game\\libs\\pure3d\\tools\\commandline\\breakablesmaker\\breakablesmaker.vcproj
+ SccLocalPath8 = ..\\game\\libs\\pure3d\\tools\\commandline\\breakablesmaker
+ CanCheckoutShared = true
+ SccProjectUniqueName9 = ..\\game\\libs\\pure3d\\tools\\commandline\\chunkGroup\\chunkGroup.vcproj
+ SccLocalPath9 = ..\\game\\libs\\pure3d\\tools\\commandline\\chunkGroup
+ CanCheckoutShared = true
+ SccProjectUniqueName10 = ..\\game\\libs\\pure3d\\tools\\commandline\\convert2dxtn\\convert2dxtn.vcproj
+ SccLocalPath10 = ..\\game\\libs\\pure3d\\tools\\commandline\\convert2dxtn
+ CanCheckoutShared = true
+ SccProjectUniqueName11 = ..\\game\\libs\\pure3d\\lib\\freetype\\builds\\win32\\visualc\\freetype.vcproj
+ SccLocalPath11 = ..\\game\\libs\\pure3d\\lib\\freetype\\builds\\win32\\visualc
+ CanCheckoutShared = true
+ SccProjectUniqueName12 = ..\\game\\libs\\pure3d\\build\\win32\\libpng.vcproj
+ SccLocalPath12 = ..\\game\\libs\\pure3d\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName13 = ..\\game\\libs\\pure3d\\tools\\commandline\\makechunktool\\makechunktool.vcproj
+ SccLocalPath13 = ..\\game\\libs\\pure3d\\tools\\commandline\\makechunktool
+ CanCheckoutShared = true
+ SccProjectUniqueName14 = objectsnapper\\build\\objectsnapper.vcproj
+ SccLocalPath14 = objectsnapper\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName15 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3d2dsg\\p3d2dsg.vcproj
+ SccLocalPath15 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3d2dsg
+ CanCheckoutShared = true
+ SccProjectUniqueName16 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3ddel\\p3ddel.vcproj
+ SccLocalPath16 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3ddel
+ CanCheckoutShared = true
+ SccProjectUniqueName17 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3ddiff\\p3ddiff.vcproj
+ SccLocalPath17 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3ddiff
+ CanCheckoutShared = true
+ SccProjectUniqueName18 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3dexplorer\\p3dexplorer.vcproj
+ SccLocalPath18 = ..\\game\\libs\\pure3d\\tools\\gui-win32\\p3dexplorer
+ CanCheckoutShared = true
+ SccProjectUniqueName19 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgc\\p3dgc.vcproj
+ SccLocalPath19 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgc
+ CanCheckoutShared = true
+ SccProjectUniqueName20 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgendsg\\p3dgendsg.vcproj
+ SccLocalPath20 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgendsg
+ CanCheckoutShared = true
+ SccProjectUniqueName21 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgeo2prims\\p3dgeo2prims.vcproj
+ SccLocalPath21 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dgeo2prims
+ CanCheckoutShared = true
+ SccProjectUniqueName22 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dimage\\p3dimage.vcproj
+ SccLocalPath22 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dimage
+ CanCheckoutShared = true
+ SccProjectUniqueName23 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dmutate\\p3dmutate.vcproj
+ SccLocalPath23 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dmutate
+ CanCheckoutShared = true
+ SccProjectUniqueName24 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsort\\p3dsort.vcproj
+ SccLocalPath24 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsort
+ CanCheckoutShared = true
+ SccProjectUniqueName25 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsplit\\p3dsplit.vcproj
+ SccLocalPath25 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dsplit
+ CanCheckoutShared = true
+ SccProjectUniqueName26 = ..\\game\\libs\\radcontent\\build\\win32\\radcontent.vcproj
+ SccLocalPath26 = ..\\game\\libs\\radcontent
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection26 = build\\win32\\
+ SccProjectUniqueName27 = ..\\game\\libs\\radcore\\build\\win32\\radcore.vcproj
+ SccLocalPath27 = ..\\game\\libs\\radcore
+ CanCheckoutShared = true
+ SccProjectFilePathRelativizedFromConnection27 = build\\win32\\
+ SccProjectUniqueName28 = ..\\game\\libs\\radmath\\build\\win32\\radmath.vcproj
+ SccLocalPath28 = ..\\game\\libs\\radmath\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName29 = relatedfiles\\relatedfiles.vcproj
+ SccLocalPath29 = relatedfiles
+ CanCheckoutShared = true
+ SccProjectUniqueName30 = ..\\game\\libs\\pure3d\\tools\\commandline\\roadOptimizer\\roadOptimizer.vcproj
+ SccLocalPath30 = ..\\game\\libs\\pure3d\\tools\\commandline\\roadOptimizer
+ CanCheckoutShared = true
+ SccProjectUniqueName31 = ..\\game\\libs\\pure3d\\toollib\\toollib.vcproj
+ SccLocalPath31 = ..\\game\\libs\\pure3d\\toollib
+ CanCheckoutShared = true
+ SccProjectUniqueName32 = ..\\game\\libs\\pure3d\\toollib\\toollib_extras.vcproj
+ SccLocalPath32 = ..\\game\\libs\\pure3d\\toollib
+ CanCheckoutShared = true
+ SccProjectUniqueName33 = trackeditor\\build\\trackeditor.vcproj
+ SccLocalPath33 = trackeditor\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName34 = worldbuilder\\build\\worldbuilder.vcproj
+ SccLocalPath34 = worldbuilder\\build
+ CanCheckoutShared = true
+ SccProjectUniqueName35 = ..\\game\\libs\\pure3d\\build\\win32\\zlib.vcproj
+ SccLocalPath35 = ..\\game\\libs\\pure3d\\build\\win32
+ CanCheckoutShared = true
+ SccProjectUniqueName36 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dcompdrawopt\\p3dcompdrawopt.vcproj
+ SccLocalPath36 = ..\\game\\libs\\pure3d\\tools\\commandline\\p3dcompdrawopt
+ CanCheckoutShared = true
+ EndGlobalSection
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = Debug
+ ConfigName.1 = Release
+ ConfigName.2 = Tools Debug
+ ConfigName.3 = Tools Release
+ ConfigName.4 = Tune
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.4 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.2 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.0 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.2 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.4 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.5 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.1 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.2 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.4 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.2 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.3 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.5 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.0 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.1 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.2 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.3 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.4 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.0 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.1 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.2 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.3 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.4 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.5 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.6 = {0C2A1DB4-652B-4F59-BBDC-376E94561647}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.1 = {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.3 = {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.4 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.5 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.6 = {86DA78E6-9FC4-40B7-9E55-390903F2A144}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.7 = {0C2A1DB4-652B-4F59-BBDC-376E94561647}
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.8 = {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.0 = {6D333C70-A27D-4E25-AD26-BB9E20558B8F}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.1 = {01B694CE-5AFC-4832-B18E-73AE3E811C74}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.2 = {8CC3C650-909A-42E8-9039-04697C27C565}
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.3 = {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune.Build.0 = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Debug.ActiveCfg = Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Debug.Build.0 = Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Release.ActiveCfg = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Release.Build.0 = Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Debug.Build.0 = Tools Debug|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Release.ActiveCfg = Tools Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tools Release.Build.0 = Tools Release|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tune.ActiveCfg = Tune|Win32
+ {86DA78E6-9FC4-40B7-9E55-390903F2A144}.Tune.Build.0 = Tune|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug.ActiveCfg = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release.ActiveCfg = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release.Build.0 = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug.Build.0 = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release.Build.0 = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune.Build.0 = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Debug.ActiveCfg = Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Debug.Build.0 = Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Release.ActiveCfg = Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Release.Build.0 = Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Debug.Build.0 = Tools Debug|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Release.ActiveCfg = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tools Release.Build.0 = Tools Release|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tune.ActiveCfg = Tune|Win32
+ {D490A7A5-ABD2-4BB7-940F-0DDC65F969C3}.Tune.Build.0 = Tune|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune.Build.0 = Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune.Build.0 = Tools Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune.Build.0 = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Debug.ActiveCfg = Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Debug.Build.0 = Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Release.ActiveCfg = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Release.Build.0 = Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Debug.Build.0 = Tools Debug|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Release.ActiveCfg = Tools Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tools Release.Build.0 = Tools Release|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tune.ActiveCfg = Tune|Win32
+ {0C2A1DB4-652B-4F59-BBDC-376E94561647}.Tune.Build.0 = Tune|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Debug.ActiveCfg = Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Debug.Build.0 = Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Release.ActiveCfg = Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Release.Build.0 = Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Debug.Build.0 = Tools Debug|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Release.ActiveCfg = Tools Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tools Release.Build.0 = Tools Release|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tune.ActiveCfg = Tune|Win32
+ {A45F932B-0CF8-41B0-A8FF-1386283E2BE7}.Tune.Build.0 = Tune|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Debug.ActiveCfg = Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Debug.Build.0 = Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Release.ActiveCfg = Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Release.Build.0 = Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Debug.Build.0 = Tools Debug|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Release.ActiveCfg = Tools Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tools Release.Build.0 = Tools Release|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tune.ActiveCfg = Tune|Win32
+ {01B694CE-5AFC-4832-B18E-73AE3E811C74}.Tune.Build.0 = Tune|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release.Build.0 = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Release.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune.Build.0 = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Debug.ActiveCfg = Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Debug.Build.0 = Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Release.ActiveCfg = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Release.Build.0 = Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Debug.Build.0 = Tools Debug|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Release.ActiveCfg = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tools Release.Build.0 = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tune.ActiveCfg = Tools Release|Win32
+ {8CC3C650-909A-42E8-9039-04697C27C565}.Tune.Build.0 = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug.ActiveCfg = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug.Build.0 = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release.ActiveCfg = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release.Build.0 = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug.Build.0 = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release.ActiveCfg = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release.Build.0 = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune.ActiveCfg = Tune|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune.Build.0 = Tune|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune.Build.0 = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Debug.ActiveCfg = Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Debug.Build.0 = Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Release.ActiveCfg = Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Release.Build.0 = Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Debug.Build.0 = Tools Debug|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Release.ActiveCfg = Tools Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tools Release.Build.0 = Tools Release|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tune.ActiveCfg = Tune|Win32
+ {38D5EE66-A56C-4673-9A53-4C92D2CA4DD1}.Tune.Build.0 = Tune|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/tools/CreateSetChunk/SetChunk.dsp b/tools/CreateSetChunk/SetChunk.dsp
new file mode 100644
index 0000000..45bc869
--- /dev/null
+++ b/tools/CreateSetChunk/SetChunk.dsp
@@ -0,0 +1,155 @@
+# Microsoft Developer Studio Project File - Name="Image2LUT" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=Image2LUT - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "SetChunk.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "SetChunk.mak" CFG="Image2LUT - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Image2LUT - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "Image2LUT - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "Image2LUT"
+# PROP Scc_LocalPath "."
+CPP=snCl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Image2LUT - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../perl" /I "../../game/libs/pure3d/toollib/inc" /I "../../game/libs/pure3d/constants" /I "../../game/libs/pure3d/toollib/chunks16/inc" /I "../../game/code/constants" /I "../../game/libs/radmath" /I "../../game/libs" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "P3DDEBUG" /D "P3DWIN95" /D "RAD_RELEASE" /D "RAD_WIN32" /D "RAD_PC" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=snBsc.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBC.lib" /out:"..\bin\CreateSetChunk.exe"
+# SUBTRACT LINK32 /nodefaultlib
+
+!ELSEIF "$(CFG)" == "Image2LUT - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../perl" /I "../../game/libs/pure3d/toollib/inc" /I "../../game/libs/pure3d/constants" /I "../../game/libs/pure3d/toollib/chunks16/inc" /I "../../game/libs/radmath" /I "../../game/code/constants" /I "../../game/libs" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "P3DDEBUG" /D "P3DWIN95" /D "RAD_DEBUG" /D "RAD_WIN32" /D "RAD_PC" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=snBsc.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"LIBC.lib LIBCMTD.lib" /pdbtype:sept
+# SUBTRACT LINK32 /nodefaultlib
+
+!ENDIF
+
+# Begin Target
+
+# Name "Image2LUT - Win32 Release"
+# Name "Image2LUT - Win32 Debug"
+# Begin Group "Source"
+
+# PROP Default_Filter "*.cpp, *.c"
+# Begin Source File
+
+SOURCE=.\main.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Param.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\version.cpp
+# End Source File
+# End Group
+# Begin Group "Include"
+
+# PROP Default_Filter "*.hpp, *.h"
+# Begin Source File
+
+SOURCE=.\Param.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\version.hpp
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\SetChunk.sc
+
+!IF "$(CFG)" == "Image2LUT - Win32 Release"
+
+# Begin Custom Build - ToolsParamCreator
+InputPath=.\SetChunk.sc
+InputName=SetChunk
+
+BuildCmds= \
+ ..\..\game\libs\pure3d\tools\commandline\bin\ToolsParamCreator -s $(InputName).sc
+
+"Param.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Param.hpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "Image2LUT - Win32 Debug"
+
+# Begin Custom Build
+InputPath=.\SetChunk.sc
+InputName=SetChunk
+
+BuildCmds= \
+ ..\..\game\libs\pure3d\tools\commandline\bin\ToolsParamCreator -s $(InputName).sc
+
+"Param.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"Param.hpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Target
+# End Project
diff --git a/tools/CreateSetChunk/SetChunk.dsw b/tools/CreateSetChunk/SetChunk.dsw
new file mode 100644
index 0000000..6e2d18e
--- /dev/null
+++ b/tools/CreateSetChunk/SetChunk.dsw
@@ -0,0 +1,122 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Image2LUT"=.\SetChunk.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"=..\..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libpng"=..\..\game\libs\pure3d\build\win32\libpng.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "radmath"=..\..\game\libs\radmath\build\win32\radmath.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "toollib"=..\..\game\libs\pure3d\toollib\toollib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "toollib_extras"=..\..\game\libs\pure3d\toollib\toollib_extras.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "zlib"=..\..\game\libs\pure3d\build\win32\zlib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/CreateSetChunk/SetChunk.sc b/tools/CreateSetChunk/SetChunk.sc
new file mode 100644
index 0000000..d7b5092
--- /dev/null
+++ b/tools/CreateSetChunk/SetChunk.sc
@@ -0,0 +1,22 @@
+tool SetChunk :
+ description( "This tool turns a texture animation into a set chunk." )
+{
+}
+
+parameter OutputFile :
+ short( o ),
+ long( "output-file" ),
+ arg( name ),
+ description( "Specify output file." ),
+ type( string )
+{
+}
+
+parameter ShaderName :
+ short( s ),
+ long( "shader-name" ),
+ arg( name ),
+ description( "Specify the shader with texture animation whose textures will become set chunk." ),
+ type( string )
+{
+}
diff --git a/tools/CreateSetChunk/main.cpp b/tools/CreateSetChunk/main.cpp
new file mode 100644
index 0000000..62228a4
--- /dev/null
+++ b/tools/CreateSetChunk/main.cpp
@@ -0,0 +1,494 @@
+/*===========================================================================
+ File: main.cpp
+
+ This tool turns a greyscale image into a raw look up table.
+
+ Copyright (c) Radical Entertainment, Inc. All rights reserved.
+
+===========================================================================*/
+
+#include <stdio.h>
+#include <assert.h>
+#include <toollib.hpp>
+#include <dospath.hpp>
+#include <tlFrameControllerChunk16.hpp>
+#include <tlAnimationChunk.hpp>
+#include <atenum.hpp>
+#include <chunkids.hpp>
+
+#include "Param.hpp"
+#include <tlSetChunk.hpp>
+
+Parameters* Param;
+char outFile[P3DMAXNAME];
+
+struct TextureData
+{
+ TextureData() :
+ m_TextureID( 0 ),
+ m_NumIDs( 0 ),
+ m_ShaderID( 0 ),
+ m_AnimationChunk( 0 ),
+ m_ControllerChunk( 0 ),
+// m_MultiControllerChunk( 0 ),
+ m_pSetChunk( 0 ),
+ m_WritenOut( false ) {};
+ ~TextureData() { delete m_TextureID; } // Set chunk is deleted by the output chunk.
+ TLUID* m_TextureID; // List of texture chunks to put into set chunk.
+ int m_NumIDs; // Number in list. If number is negative then just the animation/controller chunk are removed and multicontroller modified.
+ TLUID m_ShaderID; // The shader this data is for.
+ TLUID m_AnimationChunk; // Texture animation chunk to remove.
+ TLUID m_ControllerChunk; // Texture frame controller chunk to remove.
+// TLUID m_MultiControllerChunk; // MultiController to remove texture frame controller from.
+ tlSetChunk* m_pSetChunk; // Set chunk which will be written to file.
+ bool m_WritenOut; // Has the set chunk been written out?
+};
+
+static const int TEXTURE_COLLECTION_SIZE = 256;
+static TextureData* g_TextureCollection[ TEXTURE_COLLECTION_SIZE ];
+static int g_TextureCollectionCount = 0;
+
+int main(int argc, char* argv[])
+{
+ Param = new Parameters(argc,argv);
+ bool sameFile = false; // Have we switched to a new output file.
+
+ tlDataChunk::RegisterDefaultChunks();
+
+ tlFile* output = 0;
+
+ for( int i = 0; i < TEXTURE_COLLECTION_SIZE; ++i )
+ {
+ g_TextureCollection[ i ] = 0;
+ }
+
+ if( Param->Files.Count() < 1 )
+ {
+ printf( "Must specify at least one input file.\n" );
+ exit( -1 );
+ }
+ if( Param->ShaderName == 0 )
+ {
+ printf( "Must specify the name of the shader with texture animation.\n" );
+ exit( -1 );
+ }
+
+ bool wildCardShader = false;
+ int shaderNameLen = strlen( Param->ShaderName );
+ if( Param->ShaderName[ shaderNameLen - 1 ] == '*' )
+ {
+ wildCardShader = true;
+ --shaderNameLen;
+ Param->ShaderName[ shaderNameLen ] = '\0';
+ }
+
+ // for each file on the command-line, do the following:
+ for(int curFile = 0; curFile < Param->Files.Count(); curFile++)
+ {
+ tlFile input(new tlFileByteStream(Param->Files[ curFile ], omREAD), tlFile::FROMFILE);
+ if(!input.IsOpen())
+ {
+ printf("Could not open %s\n", Param->Files[ curFile ]);
+ exit( -1 );
+ }
+ tlDataChunk* inChunk = new tlDataChunk( &input );
+
+ char outFileName[256];
+ if( output == 0 )
+ {
+ if( Param->OutputFile )
+ {
+ strcpy(outFileName, Param->OutputFile);
+ }
+ else
+ {
+ strcpy(outFileName, Param->Files[curFile]);
+ RemoveExtension(outFileName);
+ strcat(outFileName, ".p3d");
+ }
+ output = new tlFile(new tlFileByteStream(outFileName, omWRITE), tlFile::CHUNK32);
+ if( ( output == 0 ) || ( !output->IsOpen() ) )
+ {
+ printf("Could not open %s for writing\n", outFileName);
+ exit(-1);
+ }
+ sameFile = false;
+ }
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ delete g_TextureCollection[ i ];
+ g_TextureCollection[ i ] = 0;
+ }
+
+ /*************************************************/
+ // First pass for input file, nose through the frame controllers.
+ // Go through all the sub-chunks of the input and look for shader name
+ //in heirarchy of texture frame controller.
+ int inChunkIndex;
+ for( inChunkIndex = 0; inChunkIndex < inChunk->SubChunkCount(); inChunkIndex++ )
+ {
+ tlDataChunk* sub = inChunk->GetSubChunk( inChunkIndex );
+ if( sub->ID() == Pure3D::Animation::FrameControllerData::FRAME_CONTROLLER )
+ {
+ // We have a frame controller...
+ tlFrameControllerChunk* controller = static_cast<tlFrameControllerChunk*>( sub );
+ if( controller->GetType() == Pure3DAnimationTypes::TEXTURE_TEX )
+ {
+ // and it's a texture controller. So check the hierarchy name.
+ bool foundShader = false;
+ const char* heirName = controller->HierarchyName();
+ if( wildCardShader )
+ {
+ foundShader = strncmp( heirName, Param->ShaderName, shaderNameLen ) == 0;
+ }
+ else
+ {
+ foundShader = strcmp( heirName, Param->ShaderName ) == 0;
+ }
+ if( foundShader )
+ {
+ // We found the shader so remember the texture animation data.
+ TextureData* texData = new TextureData();
+ if( texData == 0 )
+ {
+ printf( "Unable to allocate texture data.\n" );
+ exit( -1 );
+ }
+ texData->m_ShaderID = tlEntity::MakeUID( heirName );
+ texData->m_ControllerChunk = tlEntity::MakeUID( controller->GetName() );
+ texData->m_AnimationChunk = tlEntity::MakeUID( controller->AnimationName() );
+ // Look to see if we already have this shader.
+ //If we do, we'll just erase the controller and animation and modify the multicontroller.
+ //The first texData will be used to create the chunk set.
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ if( g_TextureCollection[ i ]->m_ShaderID == texData->m_ShaderID )
+ {
+ texData->m_NumIDs = -1;
+ break;
+ }
+ }
+ g_TextureCollection[ g_TextureCollectionCount ] = texData;
+ ++g_TextureCollectionCount;
+ }
+ }
+ }
+ }
+ /*************************************************/
+ // Second pass. Now we look for the animation to go with all those texture frame controllers
+ //we found.
+ for( inChunkIndex = 0; inChunkIndex < inChunk->SubChunkCount(); inChunkIndex++ )
+ {
+ tlDataChunk* sub = inChunk->GetSubChunk( inChunkIndex );
+ // Is this an animation?
+ if( sub->ID() != Pure3D::Animation::AnimationData::ANIMATION )
+ {
+ // No, not interested.
+ continue;
+ }
+ tlAnimationChunk* anim = static_cast<tlAnimationChunk*>( sub );
+ // Is it a texture animation?
+ if( anim->GetAnimationType() != Pure3DAnimationTypes::TEXTURE_TEX )
+ {
+ // No, not interested.
+ continue;
+ }
+ // We've found a texture animation. Check if it's one we are looking for.
+ TLUID animID = tlEntity::MakeUID( anim->GetName() );
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ if( ( g_TextureCollection[ i ]->m_NumIDs == 0 ) && ( g_TextureCollection[ i ]->m_AnimationChunk == animID ) )
+ {
+ // We've found the animation to match a frame controller. Let the mess begin.
+ TextureData* texData = g_TextureCollection[ i ]; // just for convience.
+ // Examine the sub chunks...there should be a goup list in there...
+ for( int subChunkIndex = 0; subChunkIndex < anim->SubChunkCount(); ++subChunkIndex )
+ {
+ tlDataChunk* animSub = anim->GetSubChunk( subChunkIndex );
+ if( animSub->ID() == Pure3D::Animation::AnimationData::GROUP_LIST )
+ {
+ // Found the group list. Now we'll nose around the groups...
+ tlAnimationGroupListChunk* groupList = static_cast<tlAnimationGroupListChunk*>( animSub );
+ for( int listChunkIndex = 0; listChunkIndex < groupList->SubChunkCount(); ++listChunkIndex )
+ {
+ // Look at all the channels in the groups in the group list.
+ tlDataChunk* listSub = groupList->GetSubChunk( listChunkIndex );
+ if( listSub->ID() == Pure3D::Animation::AnimationData::GROUP )
+ {
+ tlAnimationGroupChunk* group = static_cast<tlAnimationGroupChunk*>( listSub );
+ for( int channelIndex = 0; channelIndex < (int)group->GetNumChannels(); ++channelIndex )
+ {
+ int i;
+ // In the group (whew), look at all the channels.
+ // Is it an entity channel?
+ tlDataChunk* channelSub = group->GetSubChunk( channelIndex );
+ if( channelSub->ID() != Pure3D::Animation::ChannelData::ENTITY )
+ {
+ // No, not interested.
+ continue;
+ }
+ // Is the entity channel a texture?
+ tlEntityChannelChunk* entityChannel = static_cast<tlEntityChannelChunk*>( channelSub );
+ if( entityChannel->Param() != Pure3DAnimationTypes::TEXTURE_TEX )
+ {
+ // No, not interested.
+ continue;
+ }
+ // Okay we have the entity channel for a texture animation, now we
+ //record the texture names.
+ // We might end up allocating extra space for textures, but we'll
+ //leave the UIDs at zero at the end of the array.
+ texData->m_TextureID = new TLUID[ entityChannel->GetNumFrames() ];
+ if( texData->m_TextureID == 0 )
+ {
+ printf( "Unable to allocate texture array.\n" );
+ exit( -1 );
+ }
+ for( i = 0; i < (int)entityChannel->GetNumFrames(); ++i )
+ {
+ texData->m_TextureID[ i ] = 0;
+ }
+ // Get all the frame values.
+ char** values = entityChannel->GetValues();
+ for( i = 0; i < (int)entityChannel->GetNumFrames(); ++i )
+ {
+ TLUID textureID = tlEntity::MakeUID( values[ i ] );
+ // We have the texture tUID, look if it's a duplicate.
+ bool textureDup = false;
+ for( int j = 0; j < texData->m_NumIDs; ++j )
+ {
+ if( texData->m_TextureID[ j ] == textureID )
+ {
+ // this one is a duplicate, skip it.
+ textureDup = true;
+ break;
+ }
+ }
+ if( !textureDup )
+ {
+ // It's not a duplicate so remember it.
+ texData->m_TextureID[ texData->m_NumIDs ] = textureID;
+ ++texData->m_NumIDs;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ /*************************************************/
+ // Third pass, create the set chunks from the textures we got from those texture animations.
+ for( inChunkIndex = 0; inChunkIndex < inChunk->SubChunkCount(); inChunkIndex++ )
+ {
+ tlDataChunk* sub = inChunk->GetSubChunk( inChunkIndex );
+ if( sub->ID() == Pure3D::Texture::TEXTURE )
+ {
+ // We've found a texture, check to see if it's one of the textures we are looking for.
+ TextureData* texData = 0;
+ int textureIDIndex = 0;
+ TLUID textureID = tlEntity::MakeUID( sub->GetName() );
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ texData = g_TextureCollection[ i ];
+ for( textureIDIndex = 0; textureIDIndex < texData->m_NumIDs; ++textureIDIndex )
+ {
+ if( textureID == texData->m_TextureID[ textureIDIndex ] )
+ {
+ if( texData->m_pSetChunk == 0 )
+ {
+ texData->m_pSetChunk = new tlSetChunk();
+ if( texData->m_pSetChunk == 0 )
+ {
+ printf( "Unable to create tlSetChunk.\n" );
+ exit( -1 );
+ }
+ }
+ if( textureIDIndex == 0 )
+ {
+ // This is the first texture in the set so we'll use the name for
+ //the set.
+ texData->m_pSetChunk->SetName( sub->GetName() );
+ }
+ texData->m_pSetChunk->AppendSubChunk( sub, 0 );
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /*************************************************/
+ // Forth pass, process the file. Copy all the chunks over,
+ //except the texture frame controllers, texture animations,
+ //and textures we've used. Also, modify the multicontrollers
+ //to exclude the texture frame controllers.
+ tlDataChunk* outChunk = new tlDataChunk;
+
+ if( Param->WriteHistory && !sameFile )
+ {
+ // put a history chunk in the output
+ // a history chunk shows what version of the tool
+ // was run on the file with what command-line
+ // parameters
+ outChunk->AppendSubChunk(Param->HistoryChunk());
+ sameFile = true;
+ }
+
+ if( outChunk == 0 )
+ {
+ printf( "Unable to create output chunk.\n" );
+ exit( -1 );
+ }
+ for( inChunkIndex = 0; inChunkIndex < inChunk->SubChunkCount(); inChunkIndex++ )
+ {
+ tlDataChunk* sub = inChunk->GetSubChunk( inChunkIndex );
+ if( sub->ID() == Pure3D::Texture::TEXTURE )
+ {
+ bool inAnySet = false;
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ // Theorically a texture can go into multiple sets so go through them all.
+ bool found = false;
+ TextureData* texData = g_TextureCollection[ i ];
+ for( int j = 0; j < texData->m_NumIDs; ++j )
+ {
+ // Look to see if this texture is in this set.
+ if( tlEntity::MakeUID( sub->GetName() ) == texData->m_TextureID[ j ] )
+ {
+ found = true;
+ inAnySet = true;
+ break;
+ }
+ }
+ if( found && ( texData->m_NumIDs > 0 ) )
+ {
+ // This texture has gone into this set chunk. We'll write the
+ //set chunk out at this point so it's roughly in the same place in
+ //file to protect against load order dependency problems.
+ if( texData->m_WritenOut == false )
+ {
+ texData->m_pSetChunk->SetChildCount( texData->m_NumIDs );
+ outChunk->AppendSubChunk( texData->m_pSetChunk );
+ texData->m_WritenOut = true; // Only write it once.
+ }
+ }
+ }
+ if( !inAnySet )
+ {
+ // This isn't a texture we're interested in so write it out.
+ outChunk->AppendSubChunk( sub );
+ }
+ }
+ else if( sub->ID() == Pure3D::Animation::FrameControllerData::FRAME_CONTROLLER )
+ {
+ // This is a frame controller. If it's one we've used then don't include it.
+ bool found = false;
+ TLUID controllerID = tlEntity::MakeUID( sub->GetName() );
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ if( controllerID == g_TextureCollection[ i ]->m_ControllerChunk )
+ {
+ found = true;
+ break;
+ }
+ }
+ if( !found )
+ {
+ outChunk->AppendSubChunk( sub );
+ }
+ }
+ else if( sub->ID() == Pure3D::Animation::AnimationData::ANIMATION )
+ {
+ // This is an animation. If it's one we've used then don't include it.
+ bool found = false;
+ TLUID animID = tlEntity::MakeUID( sub->GetName() );
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ if( animID == g_TextureCollection[ i ]->m_AnimationChunk )
+ {
+ found = true;
+ break;
+ }
+ }
+ if( !found )
+ {
+ outChunk->AppendSubChunk( sub );
+ }
+ }
+ else if( sub->ID() == P3D_MULTI_CONTROLLER )
+ {
+ // This is a multicontroller. If a track references an framecontroller we
+ //used then exclude that track.
+ tlMultiControllerChunk16* multiCont = static_cast<tlMultiControllerChunk16*>( sub );
+ for( int subIndex = 0; subIndex < multiCont->SubChunkCount(); ++subIndex )
+ {
+ tlDataChunk* subChunk = multiCont->GetSubChunk( subIndex );
+ if( subChunk->ID() == P3D_MULTI_CONTROLLER_TRACKS )
+ {
+ tlMultiControllerTracksChunk16* tracks = static_cast<tlMultiControllerTracksChunk16*>( subChunk );
+ unsigned long numTracks = tracks->GetNumTracks();
+ tlMultiControllerTrackData* trackArray = tracks->GetTracks();
+ for( int i = 0; i < numTracks; ++i )
+ {
+ TLUID trackID = tlEntity::MakeUID( trackArray[ i ].name );
+ for( int j = 0; j < g_TextureCollectionCount; ++j )
+ {
+ if( trackID == g_TextureCollection[ j ]->m_ControllerChunk )
+ {
+ // Remove this track.
+ --numTracks;
+ tracks->SetNumTracks( numTracks );
+ multiCont->SetNumTracks( multiCont->GetNumTracks() - 1 );
+ if( i < numTracks )
+ {
+ trackArray[ i ] = trackArray[ numTracks ];
+ --i;
+ }
+ }
+ }
+ }
+ }
+ else if( subChunk->ID() == P3D_MULTI_CONTROLLER_TRACK )
+ {
+ tlMultiControllerTrackChunk16* track = static_cast<tlMultiControllerTrackChunk16*>( subChunk );
+ TLUID trackID = tlEntity::MakeUID( track->GetName() );
+ for( int i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ if( trackID == g_TextureCollection[ i ]->m_ControllerChunk )
+ {
+ multiCont->RemoveSubChunk( subIndex );
+ multiCont->SetNumTracks( multiCont->GetNumTracks() - 1 );
+ }
+ }
+ }
+ }
+ outChunk->AppendSubChunk( sub );
+ }
+ else
+ {
+ outChunk->AppendSubChunk( sub );
+ }
+ }
+ outChunk->Write( output );
+ delete outChunk;
+ outChunk = 0;
+ if( Param->OutputFile == 0 )
+ {
+ // We have multiple output files so get rid of the
+ //the output file now.
+ delete output;
+ output = 0;
+ }
+ for( i = 0; i < g_TextureCollectionCount; ++i )
+ {
+ delete g_TextureCollection[ i ];
+ g_TextureCollection[ i ] = 0;
+ }
+ } // end of main for loop
+
+ delete Param;
+ return 0;
+}
diff --git a/tools/CreateSetChunk/version.cpp b/tools/CreateSetChunk/version.cpp
new file mode 100644
index 0000000..ac9ae2b
--- /dev/null
+++ b/tools/CreateSetChunk/version.cpp
@@ -0,0 +1,21 @@
+/*===========================================================================
+
+ File:: version.cpp
+
+ Copyright (c) Radical Entertainment, Inc. All rights reserved.
+
+===========================================================================*/
+
+#include <stdio.h>
+#include "version.hpp"
+
+char* version = "1.0.1";
+
+/* History */
+
+char* versioninfo[] = {
+ "1.0.1 Perserve tMultiControllers, just remove texture animation.",
+ "1.0.0 Initial version.",
+ NULL
+};
+
diff --git a/tools/CreateSetChunk/version.hpp b/tools/CreateSetChunk/version.hpp
new file mode 100644
index 0000000..076e5ec
--- /dev/null
+++ b/tools/CreateSetChunk/version.hpp
@@ -0,0 +1,15 @@
+/*===========================================================================
+
+ File:: version.hpp
+
+ Copyright (c) Radical Entertainment, Inc. All rights reserved.
+
+===========================================================================*/
+
+#ifndef _VERSION_HPP
+#define _VERSION_HPP
+
+extern char* version;
+extern char* versioninfo[];
+
+#endif
diff --git a/tools/DSGmaker/DSGList.cpp b/tools/DSGmaker/DSGList.cpp
new file mode 100644
index 0000000..700497f
--- /dev/null
+++ b/tools/DSGmaker/DSGList.cpp
@@ -0,0 +1,389 @@
+#include <cstring>
+#include <stdio.h>
+#include <..\..\..\tools\dsgmaker\DSGList.hpp>
+#include <tlDataChunk.hpp>
+#include <..\constants\srrchunks.h>
+
+
+const int MAX_DSG = 100;
+
+DSGList::DSGList ()
+{
+ mbNoInstanceChunks = false;
+ mindex =0;
+ mp_list = new tlDataChunk* [MAX_DSG];
+ mp_list[0]=NULL;
+}
+
+DSGList::~DSGList ()
+{
+ delete [] mp_list;
+}
+
+//input DynaDSG name and it should return a pointer to the dsg or null if failure
+tlDataChunk* DSGList::GetDSG(const char * name)
+{
+
+ //search the array for the name.
+ for(unsigned int i=0;i<mindex;i++)
+ {
+ //printf(" Searching for %s, against %s\n",name,mp_list[i]->GetName());
+ //if we find it return pointer otherwise it will return null by default
+ if (strcmp ( mp_list[i]->GetName(),name)==0)
+ {
+ return( mp_list[i] );
+ }
+ }
+ return NULL;
+
+}
+
+// add a dynaphyschunk to the list
+int DSGList::AddDSG (tlDataChunk* p_dsg)
+{
+ if(mindex < MAX_DSG -1)
+ {
+ mp_list[mindex++]=p_dsg;
+ return 0;
+ }
+ else
+ {
+ printf(" ERROR: ====> DSGList if FULL! Unable to add entery! \n");
+ return 1;
+ }
+
+}
+
+
+//returns the number of enteries in list.
+unsigned int DSGList::GetIndexCount()
+{
+ return mindex;
+}
+
+//input index and it should return a pointer to the dsg or null if failure
+tlDataChunk* DSGList::GetDSGByIndex(unsigned int i)
+{
+
+ //search the array for the name.
+ if ( i >=0 && i <mindex)
+ {
+ return( mp_list[i] );
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+
+//resorts the DSGchunks so according the the priority set in the toollib_extras.hpp file
+void DSGList::ReSortDSGChunks(void)
+{
+ printf ("Resorting DSG Chunks\n");
+ //sort the DSGchunks internally so InstanceChunks are last
+
+ for( unsigned int i=0;i<GetIndexCount();i++)
+ {
+
+ tlDataChunk* p_dsg=NULL;
+ p_dsg=GetDSGByIndex(i);
+ if (p_dsg == NULL)
+ {
+ printf(" ERROR: ==== > Sorting DSG! \n");
+ }
+ else
+ {
+ p_dsg->SortSubChunks();
+ }
+ }
+
+}
+
+//checks the DSG chunks for missing Chunks that will cause the game loaders to crash.
+unsigned int DSGList::VerifyChunks(void)
+{
+ tlDataChunk* p_datachunk=NULL;
+ bool badart = false;
+
+ printf("\nVerifying Chunks arent missing components....\n");
+
+ for (unsigned int i=0; i<mindex;i++)
+ {
+ p_datachunk=mp_list[i];
+ switch(p_datachunk->ID())
+ {
+ case SRR2::ChunkID::DYNA_PHYS_DSG:
+ {
+ tlDataChunk* p_subchunk=NULL;
+ int subcount=p_datachunk->SubChunkCount();
+
+ if (subcount<5)
+ {
+ bool meshchunk =false;
+ bool physicschunk=false;
+ bool collisionchunk= false;
+ bool otc = false;
+ bool instancechunk = false;
+
+
+ for( int j=0;j<subcount;j++)
+ {
+ p_subchunk=p_datachunk->GetSubChunk(j);
+
+ switch(p_subchunk->ID())
+ {
+ case Pure3D::Mesh::MESH:
+ {
+ meshchunk = true;
+ break;
+ }
+ case Simulation::Physics::OBJECT:
+ {
+ physicschunk = true;
+ break;
+ }
+ case SRR2::ChunkID::OBJECT_ATTRIBUTES:
+ {
+ otc = true;
+ break;
+ }
+ case Simulation::Collision::OBJECT:
+ {
+ collisionchunk = true ;
+ break;
+ }
+ case SRR2::ChunkID::INSTANCES:
+ {
+ instancechunk= true;
+ break;
+ }
+ default:
+ {
+ printf(" Unexpected ChunkType %d \n",p_subchunk->ID() );
+ break;
+ }
+ }//end of switch for sub chunk check
+ }//end of for loop to subchunk iteration
+
+ if (meshchunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s DynaDSGChunk is missing MeshChunk\n",p_datachunk->GetName());
+ }
+
+ if (physicschunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s DynaDSGChunk is missing PhysicsChunk\n",p_datachunk->GetName());
+ }
+
+ if(otc != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s DynaDSGChunk is missing Object Attribute Chunk\n",p_datachunk->GetName());
+
+ }
+
+ if(collisionchunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s DynaDSGChunk is missing BoundingVolume\n",p_datachunk->GetName());
+
+ }
+
+ if( instancechunk != true)
+ {
+ if (mbNoInstanceChunks == true)
+ {
+
+ }
+ else
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s DynaPhysDSGChunk is missing Instanced Chunk\n",p_datachunk->GetName());
+ }
+ }
+ }//end if
+ break;
+ }//end case
+ case SRR2::ChunkID::INSTA_STATIC_PHYS_DSG:
+ {
+ tlDataChunk* p_subchunk=NULL;
+ int subcount=p_datachunk->SubChunkCount();
+
+ if (subcount<4)
+ {
+ bool meshchunk =false;
+ bool collisionchunk= false;
+ bool otc = false;
+ bool instancechunk = false;
+
+ for( int j=0;j<subcount;j++)
+ {
+ p_subchunk=p_datachunk->GetSubChunk(j);
+
+ switch(p_subchunk->ID())
+ {
+ case Pure3D::Mesh::MESH:
+ {
+ meshchunk = true;
+ break;
+ }
+ case SRR2::ChunkID::OBJECT_ATTRIBUTES:
+ {
+ otc = true;
+ break;
+ }
+ case Simulation::Collision::OBJECT:
+ {
+ collisionchunk = true ;
+ break;
+ }
+ case SRR2::ChunkID::INSTANCES:
+ {
+ instancechunk= true;
+ break;
+ }
+ default:
+ {
+ printf(" Unexpected ChunkType %d \n",p_subchunk->ID() );
+ break;
+ }
+ }//end of switch for sub chunk check
+ }//end of for loop to subchunk iteration
+
+ if (meshchunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaStaticPhysDSGChunk is missing MeshChunk\n",p_datachunk->GetName());
+ }
+
+ if(otc != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaStaticPhysDSGChunk is missing Object Attribute Chunk\n",p_datachunk->GetName());
+
+ }
+
+ if(collisionchunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaStaticPhysDSGChunk is missing Bounding Volume\n",p_datachunk->GetName());
+
+ }
+
+ if( instancechunk != true)
+ {
+ if (mbNoInstanceChunks == true)
+ {
+
+ }
+ else
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaStaticPhysDSGChunk is missing Instanced Chunk\n",p_datachunk->GetName());
+ }
+ }
+ }//end if
+ break;
+ }//end of InstaStatPhyscase
+
+ case SRR2::ChunkID::INSTA_ENTITY_DSG:
+ {
+ tlDataChunk* p_subchunk=NULL;
+ int subcount=p_datachunk->SubChunkCount();
+
+ if (subcount<2)
+ {
+ bool meshchunk =false;
+ bool instancechunk = false;
+
+
+ for( int j=0;j<subcount;j++)
+ {
+ p_subchunk=p_datachunk->GetSubChunk(j);
+
+ switch(p_subchunk->ID())
+ {
+ case Pure3D::Mesh::MESH:
+ {
+ meshchunk = true;
+ break;
+ }
+ case SRR2::ChunkID::INSTANCES:
+ {
+ instancechunk= true;
+ break;
+ }
+ default:
+ {
+ printf(" Unexpected ChunkType %d \n",p_subchunk->ID() );
+ break;
+ }
+ }//end of switch for sub chunk check
+ }//end of for loop to subchunk iteration
+
+ if (meshchunk != true)
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaEntityDSGChunk is missing MeshChunk\n",p_datachunk->GetName());
+ }
+
+ if( instancechunk != true)
+ {
+ if (mbNoInstanceChunks == true)
+ {
+
+ }
+ else
+ {
+ badart =true;
+ DSGList::PrintErrors();
+ printf (" ERROR:=====> %-30s InstaStaticPhysDSGChunk is missing Instanced Chunk\n",p_datachunk->GetName());
+ }
+ }
+ }//end if
+ break;
+ }//end case
+
+ }//end switch
+
+ }//end for
+if (badart == true)
+{
+ return 1;
+}
+
+return 0;
+
+}//end of VerifyChunks method
+
+
+// formatted IO Header for errors.
+void DSGList::PrintErrors(void)
+{
+ printf("\n");
+ printf("===============================================================================================\n");
+ printf("\n");
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/DSGmaker/DSGList.hpp b/tools/DSGmaker/DSGList.hpp
new file mode 100644
index 0000000..e7ba78d
--- /dev/null
+++ b/tools/DSGmaker/DSGList.hpp
@@ -0,0 +1,29 @@
+#ifndef DSGLIST_H
+#define DSGLIST_H
+
+//custom list class,stores the address of DynaPhysDSG in a array,that i create in DSGmaker
+
+class tlDataChunk ;
+
+
+
+class DSGList
+{
+ public:
+
+ bool mbNoInstanceChunks;
+ DSGList();
+ virtual ~DSGList();
+ int AddDSG(tlDataChunk* p_dsg);
+ unsigned int GetIndexCount();
+ tlDataChunk* GetDSG(const char* name);
+ tlDataChunk* GetDSGByIndex(unsigned int i);
+ unsigned int VerifyChunks(void);
+ void ReSortDSGChunks(void);
+
+ private:
+ void PrintErrors(void);
+ tlDataChunk** mp_list;
+ unsigned int mindex;
+};
+#endif //end of file \ No newline at end of file
diff --git a/tools/DSGmaker/DSGmaker.dsp b/tools/DSGmaker/DSGmaker.dsp
new file mode 100644
index 0000000..91d041c
--- /dev/null
+++ b/tools/DSGmaker/DSGmaker.dsp
@@ -0,0 +1,176 @@
+# Microsoft Developer Studio Project File - Name="DSGmaker" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=DSGmaker - Win32 Tools Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "DSGmaker.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "DSGmaker.mak" CFG="DSGmaker - Win32 Tools Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "DSGmaker - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "DSGmaker - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "DSGmaker - Win32 Tools Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE "DSGmaker - Win32 Tools Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "DSGmaker"
+# PROP Scc_LocalPath "."
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "DSGmaker - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "RAD_RELEASE" /D "RAD_WIN32" /D "RAD_PC" /YX /FD /c
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"
+# ADD RSC /l 0x1009 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "DSGmaker - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS_DEBUG" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"
+# ADD RSC /l 0x1009 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ELSEIF "$(CFG)" == "DSGmaker - Win32 Tools Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "DSGmaker___Win32_Tools_Debug"
+# PROP BASE Intermediate_Dir "DSGmaker___Win32_Tools_Debug"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS_DEBUG" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /YX /FD /GZ /c
+# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"
+# ADD RSC /l 0x1009 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ELSEIF "$(CFG)" == "DSGmaker - Win32 Tools Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "DSGmaker___Win32_Tools_Release"
+# PROP BASE Intermediate_Dir "DSGmaker___Win32_Tools_Release"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\game\libs\pure3d\toollib\inc" /I "..\..\game\libs\pure3d\constants" /I "..\..\game\code\constants" /I "..\..\game\libs\radmath" /I "..\..\game\libs\pure3d\toollib\chunks16\inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "RAD_RELEASE" /D "RAD_WIN32" /D "RAD_PC" /YX /FD /c
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"
+# ADD RSC /l 0x1009 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 mysql++.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ENDIF
+
+# Begin Target
+
+# Name "DSGmaker - Win32 Release"
+# Name "DSGmaker - Win32 Debug"
+# Name "DSGmaker - Win32 Tools Debug"
+# Name "DSGmaker - Win32 Tools Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\DSGList.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\dsgmaker.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\DSGList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\code\constants\phyprop.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Group "libs"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE="C:\mysql++\lib\mysql++.lib"
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/DSGmaker/DynaDSGList.cpp b/tools/DSGmaker/DynaDSGList.cpp
new file mode 100644
index 0000000..d99f1b2
--- /dev/null
+++ b/tools/DSGmaker/DynaDSGList.cpp
@@ -0,0 +1,53 @@
+#include <cstring>
+#include <stdio.h>
+#include <..\..\..\tools\dsgmaker\DynaDSGList.hpp>
+#include <tlDynaPhysDSGChunk.hpp>
+
+
+const int MAX_DYNA_DSG = 50;
+
+DynaPhysDSGList::DynaPhysDSGList ()
+{
+ mindex =0;
+ mp_list = new tlDynaPhysDSGChunk* [MAX_DYNA_DSG];
+ mp_list[0]=NULL;
+}
+
+DynaPhysDSGList::~DynaPhysDSGList ()
+{
+ delete [] mp_list;
+}
+
+//input DynaDSG name and it should return a pointer to the dsg or null if failure
+tlDynaPhysDSGChunk* DynaPhysDSGList::GetDyna(const char * name)
+{
+
+ //search the array for the name.
+ for(unsigned int i=0;i<mindex;i++)
+ {
+ printf(" Searching for %s, against %s\n",name,mp_list[i]->GetName());
+ //if we find it return pointer otherwise it will return null by default
+ if (strcmp ( mp_list[i]->GetName(),name)==0)
+ {
+ return( mp_list[i] );
+ }
+ }
+ return NULL;
+
+}
+
+// add a dynaphyschunk to the list
+int DynaPhysDSGList::AddDyna (tlDynaPhysDSGChunk* p_dyna)
+{
+ if(mindex < MAX_DYNA_DSG -1)
+ {
+ mp_list[mindex++]=p_dyna;
+ return 0;
+ }
+ else
+ {
+ printf("ERROR: DynaDSGList if FULL! Unable to add entery! \n");
+ return 1;
+ }
+
+}
diff --git a/tools/DSGmaker/DynaDSGList.hpp b/tools/DSGmaker/DynaDSGList.hpp
new file mode 100644
index 0000000..3ba56a6
--- /dev/null
+++ b/tools/DSGmaker/DynaDSGList.hpp
@@ -0,0 +1,22 @@
+#ifndef DYNADSGLIST_H
+#define DYNADSGLIST_H
+
+//custom list class,stores the address of DynaPhysDSG in a array,that i create in DSGmaker
+
+class tlDynaPhysDSGChunk ;
+
+class DynaPhysDSGList
+{
+ public:
+ DynaPhysDSGList();
+ virtual ~DynaPhysDSGList();
+ int AddDyna(tlDynaPhysDSGChunk* p_dyna);
+ unsigned int GetIndexCount();
+ tlDynaPhysDSGChunk* GetDyna(const char* name);
+
+
+ private:
+ tlDynaPhysDSGChunk** mp_list;
+ unsigned int mindex;
+};
+#endif //end of file \ No newline at end of file
diff --git a/tools/DSGmaker/InstaEntityDSGList.cpp b/tools/DSGmaker/InstaEntityDSGList.cpp
new file mode 100644
index 0000000..83271fa
--- /dev/null
+++ b/tools/DSGmaker/InstaEntityDSGList.cpp
@@ -0,0 +1,53 @@
+#include <cstring>
+#include <stdio.h>
+#include <..\..\..\tools\dsgmaker\InstaEntityDSGList.hpp>
+#include <tlInstaEntityDSGChunk.hpp>
+
+
+const int MAX_INSTA_DSG = 50;
+
+InstaEntityDSGList::InstaEntityDSGList ()
+{
+ mindex =0;
+ mp_list = new tlInstaEntityDSGChunk* [MAX_INSTA_DSG];
+ mp_list[0]=NULL;
+}
+
+InstaEntityDSGList::~InstaEntityDSGList ()
+{
+ delete [] mp_list;
+}
+
+//input DSG name and it should return a pointer to the dsg or null if failure
+tlInstaEntityDSGChunk* InstaEntityDSGList::GetInstaEntity(const char * name)
+{
+
+ //search the array for the name.
+ for(unsigned int i=0;i<mindex;i++)
+ {
+ printf(" Searching for %s, against %s\n",name,mp_list[i]->GetName());
+ //if we find it return pointer otherwise it will return null by default
+ if (strcmp ( mp_list[i]->GetName(),name)==0)
+ {
+ return( mp_list[i] );
+ }
+ }
+ return NULL;
+
+}
+
+// add a InstaEntitychunk to the list
+int InstaEntityDSGList::AddInstaEntity (tlInstaEntityDSGChunk* p_insta)
+{
+ if(mindex < MAX_INSTA_DSG -1)
+ {
+ mp_list[mindex++]=p_insta;
+ return 0;
+ }
+ else
+ {
+ printf("ERROR: InstaEntityDSGList if FULL! Unable to add entery! \n");
+ return 1;
+ }
+
+}
diff --git a/tools/DSGmaker/InstaEntityDSGList.hpp b/tools/DSGmaker/InstaEntityDSGList.hpp
new file mode 100644
index 0000000..033e8a9
--- /dev/null
+++ b/tools/DSGmaker/InstaEntityDSGList.hpp
@@ -0,0 +1,20 @@
+#ifndef INSTAENTITYDSGLIST_H
+#define INSTAENTITYDSGLIST_H
+
+//custom list class,stores the address of InstaEntityDSG's in a array,that i create in DSGmaker
+
+class tlInstaEntityDSGChunk ;
+
+class InstaEntityDSGList
+{
+ public:
+ InstaEntityDSGList();
+ virtual ~InstaEntityDSGList();
+ int AddInstaEntity(tlInstaEntityDSGChunk* p_insta);
+ tlInstaEntityDSGChunk* GetInstaEntity(const char* name);
+
+ private:
+ tlInstaEntityDSGChunk** mp_list;
+ unsigned int mindex;
+};
+#endif //end of file \ No newline at end of file
diff --git a/tools/DSGmaker/InstaStaticPhysDSGList.cpp b/tools/DSGmaker/InstaStaticPhysDSGList.cpp
new file mode 100644
index 0000000..a9674b5
--- /dev/null
+++ b/tools/DSGmaker/InstaStaticPhysDSGList.cpp
@@ -0,0 +1,53 @@
+#include <cstring>
+#include <stdio.h>
+#include <..\..\..\tools\dsgmaker\InstaStaticPhysDSGList.hpp>
+#include <tlInstaStaticPhysDSGChunk.hpp>
+
+
+const int MAX_INSTA_DSG = 50;
+
+InstaStaticPhysDSGList::InstaStaticPhysDSGList ()
+{
+ mindex =0;
+ mp_list = new tlInstaStaticPhysDSGChunk* [MAX_INSTA_DSG];
+ mp_list[0]=NULL;
+}
+
+InstaStaticPhysDSGList::~InstaStaticPhysDSGList ()
+{
+ delete [] mp_list;
+}
+
+//input DSG name and it should return a pointer to the dsg or null if failure
+tlInstaStaticPhysDSGChunk* InstaStaticPhysDSGList::GetInstaStaticPhys(const char * name)
+{
+
+ //search the array for the name.
+ for(unsigned int i=0;i<mindex;i++)
+ {
+ printf(" Searching for %s, against %s\n",name,mp_list[i]->GetName());
+ //if we find it return pointer otherwise it will return null by default
+ if (strcmp ( mp_list[i]->GetName(),name)==0)
+ {
+ return( mp_list[i] );
+ }
+ }
+ return NULL;
+
+}
+
+// add a InstaStaticPhyschunk to the list
+int InstaStaticPhysDSGList::AddInstaStaticPhys (tlInstaStaticPhysDSGChunk* p_insta)
+{
+ if(mindex < MAX_INSTA_DSG -1)
+ {
+ mp_list[mindex++]=p_insta;
+ return 0;
+ }
+ else
+ {
+ printf("ERROR: InstaStaticPhysDSGList if FULL! Unable to add entery! \n");
+ return 1;
+ }
+
+} \ No newline at end of file
diff --git a/tools/DSGmaker/InstaStaticPhysDSGList.hpp b/tools/DSGmaker/InstaStaticPhysDSGList.hpp
new file mode 100644
index 0000000..2f9fc1a
--- /dev/null
+++ b/tools/DSGmaker/InstaStaticPhysDSGList.hpp
@@ -0,0 +1,20 @@
+#ifndef INSTAPHYSDSGLIST_H
+#define INSTAPHYSDSGLIST_H
+
+//custom list class,stores the address of InstaEntityDSG's in a array,that i create in DSGmaker
+
+class tlInstaStaticPhysDSGChunk ;
+
+class InstaStaticPhysDSGList
+{
+ public:
+ InstaStaticPhysDSGList();
+ virtual ~InstaStaticPhysDSGList();
+ int AddInstaStaticPhys(tlInstaStaticPhysDSGChunk* p_insta);
+ tlInstaStaticPhysDSGChunk* GetInstaStaticPhys(const char* name);
+
+ private:
+ tlInstaStaticPhysDSGChunk** mp_list;
+ unsigned int mindex;
+};
+#endif //end of file \ No newline at end of file
diff --git a/tools/DSGmaker/dsgmaker.cpp b/tools/DSGmaker/dsgmaker.cpp
new file mode 100644
index 0000000..9624e04
--- /dev/null
+++ b/tools/DSGmaker/dsgmaker.cpp
@@ -0,0 +1,807 @@
+//DSGmaker a tool to traverse the the inventory of a Pure3d file and creates
+//DSGchucks and bundles mesh,phys,BV,instance chunk together. Supports multiple objects in a file.
+
+#pragma warning(disable:4786)
+
+#include <iostream>
+#include <cstring>
+#include <iomanip>
+#include <mysql++>
+#include <..\..\..\tools\artchecker\artobject.h>
+#include <..\..\..\tools\artchecker\artlimits.h>
+#include <..\..\..\tools\artchecker\badlist.hpp>
+#include <..\..\..\tools\artchecker\outputbuffer.hpp>
+
+
+#include <toollib.hpp>
+#include <tlCollisionObjectChunk.hpp>
+#include <tlPhysicsObjectChunk.hpp>
+#include <tlMeshChunk.hpp>
+#include <..\constants\srrchunks.h>
+#include <..\..\..\tools\dsgmaker\DSGList.hpp>
+using namespace std;
+
+//function that strips all the extra crap(prefixes and appended junk)
+//and returns actual object name in output pointer.
+
+unsigned int rootname(const char* input,char* output);
+
+
+int main(int argc, char* argv[])
+{
+
+ //char* arguements [4];
+ char* filename;
+ char querybuffer [1000];
+ bool badart = false;
+ bool showall= false;
+ Result::iterator sql_iterator;
+ DSGList* p_dsglist =new DSGList();
+ bool mbIgnoreMissingInstanceChunk = false;
+
+ tlDataChunk::RegisterDefaultChunks();
+
+ //processes arguements
+
+ //no options
+ if (argc ==1)
+ {
+ cout<<"Usage:Dsgmaker filename \n";
+ exit (1);
+ }
+
+ filename= argv[1];
+
+ if ( argc ==3)
+ {
+ if (strcmp( argv[2],"-nI") == 0)
+ {
+ mbIgnoreMissingInstanceChunk = true;
+ //printf("Ignoring Missing Chunks!\n");
+ }
+ else
+ {
+ printf("Error: unknown arguement %s \n",argv[2]);
+ }
+ }
+
+/*
+ for (i=2;i<argc;i++)
+ {
+ arguements[i]=argv[i];
+
+ // user set strict
+ if (strcmp(arguements[i],"strict")== 0)
+ {
+ strict =true;
+ debugstring("strict option set");
+ break;
+ }
+
+ //user set add
+
+ else if (strcmp (arguements[i],"add")==0)
+ {
+ add=true;
+ debugstring("add option set");
+ break;
+ }
+
+ else if (strcmp (arguements[i],"all")==0)
+ {
+ showall =true;
+ break;
+ }
+ //illegal option
+ else
+ {
+ cout <<arguements[i] <<" is an illegal option \n";
+ exit (1);
+ }
+
+#ifdef DEBUG
+ cout<< i ;
+ cout<< arguements [i] << "\n";
+#endif
+
+ } //end for
+
+ */
+
+ //read in the pure3d file name
+
+ tlFile input(new tlFileByteStream(filename,omREAD), tlFile::FROMFILE);
+ if(!input.IsOpen())
+ {
+ printf("Could not open %s\n", filename);
+ exit(-1);
+ }
+
+ cout<<"Processing Filename:"<<filename<<endl;
+
+ //desend into the file and look at each object until no more objects left
+
+ // make a tlDataChunk from the file
+ // this is the wrapper chunk for the input
+ tlDataChunk* inchunk = new tlDataChunk(&input);
+ // we don't need the tlFile anymore
+ // this cleans up the tlFile object including the
+ // tlFileByteStream
+ input.Close();
+
+
+ // build an output chunk
+ tlDataChunk* outchunk = new tlDataChunk;
+ int ch;
+
+ //connect to the Art DB
+ try
+ {
+ //setup artrb variables
+ bool dbconnect=false;
+ Row row;
+
+ //creat connection and query objects
+ Connection con (use_exceptions);
+ Query query=con.query( );
+ dbconnect=con.connect ("srr2test","radit","root","custom47");
+
+
+ if (dbconnect == true)
+ {
+ cout<<"Connection to Artdb established proceeding.\n";
+ }
+ else
+ {
+ cout<<"Cant connection to ArtDB Aborting! \n";
+ exit (1);
+ }
+
+
+ // go through all the sub-chunks of the input and
+ // process the ones you care about
+ for(ch=0; ch < inchunk->SubChunkCount(); ch++)
+ {
+ // create the next sub-chunk
+ tlDataChunk* sub = inchunk->GetSubChunk(ch);
+
+ // look at the id of the subchunk to decide if we
+ // want to do something with it or not
+ switch(sub->ID())
+ {
+
+
+ case Pure3D::Mesh::MESH:
+ {
+
+ //printf("\n");
+ tlMeshChunk* p_mesh = (tlMeshChunk* ) sub;
+ char mesh_name[max_length];
+
+ //get object name and remove extra appended crap
+ ::rootname(p_mesh->GetName(),mesh_name);
+
+
+ //query ArtDB for info on this mesh
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",mesh_name);
+ query<< querybuffer;
+ Result myresult = query.store ( );
+
+ //check results,
+ //if not found in ArtDB make it a into a StaticEntityDSG as a default.
+ if (myresult.size ( ) ==0 )
+ {
+ //create StaticEntityDSG chunk and append mesh
+ printf("%s : Mesh not found in ArtDB creating EntityDSGChunk !\n",mesh_name);
+ tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk();
+ p_entitydsg->SetName(p_mesh->GetName());
+ p_entitydsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_entitydsg,FALSE);
+
+ }
+ // its found in the ArtDB, need to determine what kind of DSG to make.
+ else
+ {
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+ row =*sql_iterator;
+ char classtypeID [max_length];
+ strcpy(classtypeID, row["ClassType"]);
+ printf("Found %s meshchunk \n",p_mesh->GetName());
+ //printf("Classtype ID: %s \n",classtypeID);
+
+ //make the correct DSG chunktype
+ if (
+ (strcmp(classtypeID,"PROP_MOVEABLE")==0) ||
+ (strcmp(classtypeID,"PROP_BREAKABLE")==0) ||
+ (strcmp(classtypeID,"PROP_ONETIME_MOVEABLE")==0)
+ )
+ {
+ printf(" %s is of type %s creating DynaPhysDSGChunk \n",mesh_name,classtypeID);
+ tlDynaPhysDSGChunk* p_dynaphysdsg =new tlDynaPhysDSGChunk ();
+ p_dynaphysdsg->SetName(p_mesh->GetName());
+ p_dynaphysdsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_dynaphysdsg,FALSE);
+ p_dsglist->AddDSG(p_dynaphysdsg);
+ //printf(" Finished making chunk\n");
+ }
+
+ else if (strcmp(classtypeID,"PROP_STATIC")==0)
+ {
+ printf(" %s is of type %s creating InstaStaticPhysDSGChunk \n",mesh_name,classtypeID);
+ tlInstaStaticPhysDSGChunk* p_instaphysdsg =new tlInstaStaticPhysDSGChunk ();
+ p_instaphysdsg->SetName(p_mesh->GetName());
+ p_instaphysdsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_instaphysdsg,FALSE);
+ p_dsglist->AddDSG(p_instaphysdsg);
+ }
+
+ else if (strcmp(classtypeID,"PROP_DRAWABLE")==0)
+ {
+ printf(" %s is of type %s creating InstaEntityDSGChunk \n",mesh_name,classtypeID);
+ tlInstaEntityDSGChunk* p_instaentitydsg =new tlInstaEntityDSGChunk();
+ p_instaentitydsg->SetName(p_mesh->GetName());
+ p_instaentitydsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_instaentitydsg,FALSE);
+ p_dsglist->AddDSG(p_instaentitydsg);
+ }
+
+ else if (strcmp(classtypeID,"STATIC")==0)
+ {
+ printf(" %s is of type %s creating EntityDSGChunk \n",mesh_name,classtypeID);
+ tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk();
+ p_entitydsg->SetName(p_mesh->GetName());
+ p_entitydsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_entitydsg,FALSE);
+ }
+
+ else if (strcmp(classtypeID,"DRAWABLE")==0)
+ {
+ printf(" %s is of type %s creating EntityDSGChunk \n",mesh_name,classtypeID);
+ tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk();
+ p_entitydsg->SetName(p_mesh->GetName());
+ p_entitydsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(p_entitydsg,FALSE);
+ }
+
+ else if (strcmp(classtypeID,"ANIMATED_BV")==0)
+ {
+ printf(" %s is of type %s creating AnimatedBvDSGChunk \n",mesh_name,classtypeID);
+
+ //Need to finalize class specs with Greg, Devin and Trav TBD still
+
+ //tlDynaPhysDSGChunk* p_dynaphysdsg =new tlDynaPhysDSGChunk ();
+ //p_dynaphysdsg->SetName(p_mesh->GetName());
+ //p_dynaphysdsg->AppendSubChunk(sub,FALSE);
+ outchunk->AppendSubChunk(sub,FALSE);
+ }
+ else
+ {
+ printf("\n===================================================\n");
+ printf("\n=\tError unknown %s ClasstypeID \n",classtypeID);
+ printf("\n===================================================\n");
+ }
+
+
+ }//end for loop
+
+ }//end else
+ //printf("exiting Mesh case\n");
+ break;
+ }
+ case Simulation::Physics::OBJECT:
+ {
+ tlPhysicsObjectChunk *p_physobject = (tlPhysicsObjectChunk*) sub;
+ tlDataChunk* p_dsg=NULL;
+ char name[max_length];
+
+ ::rootname(p_physobject->GetName(),name);
+ printf("\n");
+ printf("Phys Chunk: %s \n",p_physobject->GetName());
+
+ p_dsg =p_dsglist->GetDSG(p_physobject->GetName());
+
+ if( p_dsg ==NULL)
+ {
+ badart=true;
+ printf("\n===================================================\n");
+ printf("\n=\tERROR: Cant find Parent DSG for %s, This Physics Volume is MISSING its mesh!!\n",p_physobject->GetName());
+ printf("\n===================================================\n");
+ }
+ else
+ {
+ printf(" Found the parent for %s\n",p_physobject->GetName());
+ p_dsg->AppendSubChunk(sub,FALSE);
+ }
+ break;
+ }
+
+
+ case Simulation::Collision::OBJECT:
+ {
+ //printf("entering Collision object \n");
+ //temp local variables
+
+ tlCollisionObjectChunk* p_collisionobject= (tlCollisionObjectChunk*)sub;
+ bv_data bv_object;
+ tlDataChunk* p_dsg=NULL;
+ char sound [64] ="nosound"; //default vaule
+
+ bool errors =false;
+ char querybuffer [1000];
+
+
+ ::rootname(p_collisionobject->GetName(),bv_object.name);
+
+ printf("\n");
+ printf("BV name: %s \t ",p_collisionobject->GetName());
+
+ //seting default vaules, 7 is the default for staticphysDSG's,
+ //and physprop 0 is bogus vaule and should get filled in if BV object is know in the artdb.
+ bv_object.classtype=7;
+ bv_object.physpropid=0;
+
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",bv_object.name);
+ query<< querybuffer;
+ Result myresult= query.store ( );
+
+ // cout << "Records Found: " << myresult.size() << endl ;
+
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+
+ row =*sql_iterator;
+ char classtypeID [max_length];
+ strcpy(classtypeID, row["ClassType"]);
+ bv_object.physpropid=row["physpropid"];
+ strcpy(sound,row["Sound"]);
+
+ //make the correct DSG chunktype
+ if (strcmp(classtypeID,"PROP_MOVEABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 3\n",bv_object.name,classtypeID);
+ bv_object.classtype=3;
+ }
+
+ else if (strcmp(classtypeID,"PROP_BREAKABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 4\n",bv_object.name,classtypeID);
+ bv_object.classtype=4;
+ }
+
+ else if (strcmp(classtypeID,"PROP_STATIC")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID);
+ bv_object.classtype=2;
+ }
+
+ else if (strcmp(classtypeID,"DRAWABLE")==0)
+ {
+ printf(" %s is of type %s ERROR Drawable Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID);
+ badart=true;
+ }
+ else if (strcmp(classtypeID,"PROP_DRAWABLE")==0)
+ {
+ printf(" %s is of type %s ERROR PROP_DRAWABLE Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID);
+ badart=true;
+ }
+
+ else if (strcmp(classtypeID,"ANIMATED_BV")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 5\n",bv_object.name,classtypeID);
+ bv_object.classtype=5;
+ }
+ else if (strcmp(classtypeID,"STATIC")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID);
+ bv_object.classtype=7;
+ }
+ else if (strcmp (classtypeID,"PROP_ONETIME_MOVEABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 10\n",bv_object.name,classtypeID);
+ bv_object.classtype=10;
+ }
+
+
+
+ }//end for iterator loop
+
+
+
+ //creating object attribute chunk
+ tlObjectAttributeChunk* p_otc =new tlObjectAttributeChunk ();
+ p_otc->SetClassType(bv_object.classtype);
+ p_otc->SetPhyPropID(bv_object.physpropid);
+ p_otc->SetSound(sound);
+
+ //if object is a static then create a StaticPhysDSGChunk
+ if(bv_object.classtype == 7)
+ {
+ tlStaticPhysDSGChunk* p_statdsg =new tlStaticPhysDSGChunk ();
+ p_statdsg->AppendSubChunk(sub,FALSE);
+ p_statdsg->AppendSubChunk(p_otc);
+ p_statdsg->SetName(p_collisionobject->GetName());
+ outchunk->AppendSubChunk(p_statdsg,FALSE);
+ }
+
+ //otherwise find the Parent DSG and add OTC and
+ else
+ {
+ //printf(" Need to find Parent DSG \n");
+ // find the parent DynaDSG object
+ p_dsg=p_dsglist->GetDSG(p_collisionobject->GetName());
+ if(p_dsg ==NULL)
+ {
+ printf("\n===================================================\n");
+ printf("\n=\tERROR: Cant Find Parent DSG for %s, This Bounding Volume is MISSING its Mesh!! \n",p_collisionobject->GetName());
+ printf("\n===================================================\n");
+ badart=true;
+ }
+ else
+ {
+ printf(" Found the parent for %s\n",p_collisionobject->GetName());
+ p_dsg->AppendSubChunk(p_otc,FALSE);
+ p_dsg->AppendSubChunk(sub,FALSE);
+ }
+ }
+ //printf("exiting collision\n");
+ break;
+ }
+
+
+ case SRR2::ChunkID::ANIM_DSG_WRAPPER:
+ {
+ bv_data bv_object;
+ char sound[64] = "nosound"; //setting default vaule
+ char chunkname [64];
+
+
+ //tlAnimDSGWrapperChunk* p_animwrapper = dynamic_cast<tlAnimDSGWrapperChunk*>(sub);
+
+ printf("Found %s AnimWrapperChunk \n",sub->GetName());
+ ::rootname(sub->GetName(),chunkname);
+
+ //query ArtDB for info on this instanced Animated object
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",chunkname);
+ query<< querybuffer;
+ Result myresult = query.store ( );
+
+
+ //check if animwrapper found in artDB
+ if (myresult.size ( ) ==0 )
+
+ {
+ //object not found in the art db
+ printf(" ERROR: Object not found in the artDB,Skipping InstAnimDSGChuck Creation!\n");
+ break;
+ }
+
+
+ //getting the phys properties
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+ row =*sql_iterator;
+
+ //set classtype to prop_breakable
+ bv_object.classtype =4;
+ bv_object.physpropid=row["physpropid"];
+ strcpy(sound,row["Sound"]);
+
+ }
+
+ printf(" %s is of type InstaAnimDynaPhysDSG creating InstaEntityDSGChunk \n",sub->GetName());
+
+ //create InstaAnimDSGChunk and OTC
+ tlInstAnimDynaPhysDSGChunk* p_instanimdsg = new tlInstAnimDynaPhysDSGChunk ();
+ tlObjectAttributeChunk* p_otc = new tlObjectAttributeChunk ();
+
+ //fill in data for the newly created chunks
+ p_instanimdsg->SetName(sub->GetName());
+ p_otc->SetClassType(bv_object.classtype);
+ p_otc->SetPhyPropID(bv_object.physpropid);
+ p_otc->SetSound(sound);
+
+ //append chunks into the InstaAnimDynaPhysDSGChunk
+ p_instanimdsg->AppendSubChunk(sub,FALSE);
+ p_instanimdsg->AppendSubChunk(p_otc,FALSE);
+
+ //append InstaAnimDynaPhysDSGChunk to the outchunk
+ outchunk->AppendSubChunk(p_instanimdsg,FALSE);
+ p_dsglist->AddDSG(p_instanimdsg);
+
+ break;
+ }
+
+ case SRR2::ChunkID::ANIM_OBJ_DSG_WRAPPER:
+ {
+ bv_data bv_object;
+ char sound[64] = "nosound"; //setting default vaule
+ char chunkname [64];
+
+
+ //tlAnimDSGWrapperChunk* p_animwrapper = dynamic_cast<tlAnimDSGWrapperChunk*>(sub);
+
+ printf("Found %s AnimObjWrapperChunk \n",sub->GetName());
+ ::rootname(sub->GetName(),chunkname);
+
+ //query ArtDB for info on this instanced Animated object
+ sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",chunkname);
+ query<< querybuffer;
+ Result myresult = query.store ( );
+
+
+ //check if animobjwrapper found in artDB
+ if (myresult.size ( ) ==0 )
+
+ {
+ //object not found in the art db
+ printf(" ERROR: Object not found in the artDB,Skipping InstAnimDSGChuck Creation!\n");
+ break;
+ }
+
+
+ //getting the phys properties
+ for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++)
+ {
+
+ row =*sql_iterator;
+
+ char classtypeID [max_length];
+ strcpy(classtypeID, row["ClassType"]);
+ bv_object.physpropid=row["physpropid"];
+ strcpy(sound,row["Sound"]);
+ strcpy(bv_object.name,sub->GetName());
+
+ //set the correct classtypeID
+ if (strcmp(classtypeID,"PROP_MOVEABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 3\n",bv_object.name,classtypeID);
+ bv_object.classtype=3;
+ }
+
+ else if (strcmp(classtypeID,"PROP_BREAKABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 4\n",bv_object.name,classtypeID);
+ bv_object.classtype=4;
+ }
+
+ else if (strcmp(classtypeID,"PROP_STATIC")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID);
+ bv_object.classtype=2;
+ }
+
+ else if (strcmp(classtypeID,"DRAWABLE")==0)
+ {
+ printf(" %s is of type %s ERROR Drawable Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID);
+ badart=true;
+ }
+ else if (strcmp(classtypeID,"PROP_DRAWABLE")==0)
+ {
+ printf(" %s is of type %s ERROR PROP_DRAWABLE Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID);
+ badart=true;
+ }
+
+ else if (strcmp(classtypeID,"ANIMATED_BV")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 5\n",bv_object.name,classtypeID);
+ bv_object.classtype=5;
+ }
+ else if (strcmp(classtypeID,"STATIC")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID);
+ bv_object.classtype=7;
+ }
+
+ else if (strcmp(classtypeID,"PROP_ANIM_BREAKABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 9 \n",bv_object.name,classtypeID);
+ bv_object.classtype=9;
+ }
+
+ else if (strcmp(classtypeID,"PROP_ONETIME_MOVEABLE")==0)
+ {
+ printf(" %s is of type %s Setting Classtype to 10\n",bv_object.name,classtypeID);
+ bv_object.classtype=10;
+ }
+
+
+
+ }//end for loop
+
+ printf(" %s is of type InstaAnimDynaPhysDSG creating InstaAnimDynaPhysDSGChunk \n",sub->GetName());
+
+ //create InstaAnimDSGChunk and OTC
+ tlInstAnimDynaPhysDSGChunk* p_instanimdsg = new tlInstAnimDynaPhysDSGChunk ();
+ tlObjectAttributeChunk* p_otc = new tlObjectAttributeChunk ();
+
+ //fill in data for the newly created chunks
+ p_instanimdsg->SetName(sub->GetName());
+ p_otc->SetClassType(bv_object.classtype);
+ p_otc->SetPhyPropID(bv_object.physpropid);
+ p_otc->SetSound(sound);
+
+ //append chunks into the InstaAnimDynaPhysDSGChunk
+ p_instanimdsg->AppendSubChunk(sub,FALSE);
+ p_instanimdsg->AppendSubChunk(p_otc,FALSE);
+
+ //append InstaAnimDynaPhysDSGChunk to the outchunk
+ outchunk->AppendSubChunk(p_instanimdsg,FALSE);
+ p_dsglist->AddDSG(p_instanimdsg);
+
+ break;
+ }
+
+
+ case SRR2::ChunkID::INSTANCES:
+ {
+ tlDataChunk* p_dsg=NULL;
+ tlDataChunk* subchunk= sub->GetSubChunk(0);
+ tlScenegraphChunk* p_scenegraphchunk= dynamic_cast<tlScenegraphChunk *>(subchunk);
+
+ printf("\n");
+ printf("Found %s instance chunk,looking for Parent DSG.\n",p_scenegraphchunk->GetName());
+ p_dsg=p_dsglist->GetDSG(p_scenegraphchunk->GetName());
+ if(p_dsg ==NULL)
+ {
+ printf("\n===================================================\n");
+ printf("\n=\tERROR: Cant Find Parent DSG Chunk for %s, SceneGraph is MISSING its Mesh!! \n",p_scenegraphchunk->GetName());
+ printf("\n===================================================\n");
+ badart=true;
+ }
+ else
+ {
+ printf(" Found the parent for %s\n",p_scenegraphchunk->GetName());
+ p_dsg->AppendSubChunk(sub,FALSE);
+ }
+ break;
+ }
+
+ default:
+ {
+ // this is not a chunk that we care about
+ // so simply copy it to the output wrapper chunk
+ // the optional parameter to AppendSubChunk
+ // indicates that we have merely copied a pointer
+ // so the destructor of outchunk should not
+ // destroy this sub-chunk as that duty will be
+ // taken care of by the destructor of inchunk
+ outchunk->AppendSubChunk(sub,FALSE);
+ break;
+ }
+ }//end switch
+ }//end for
+
+ p_dsglist->ReSortDSGChunks();
+
+ if ( mbIgnoreMissingInstanceChunk == true)
+ {
+ p_dsglist->mbNoInstanceChunks = true;
+ //printf("Ignore chunk is set!\n");
+ }
+
+ if(p_dsglist->VerifyChunks() == 1)
+ {
+ badart=true;
+ }
+
+
+
+ } //end of try
+
+
+
+ catch (BadQuery er)
+ {
+ cout<<"Error: " <<er.error<< endl;
+ return 1;
+ }
+
+ if (badart)
+ {
+
+ printf("\n=======================================================\n");
+ printf("\n=\tERROR: %s is missing Chunks for DSG objects Aborting DSG Prop Creation !!! \n",filename);
+ printf("\n=======================================================\n");
+
+/*
+ // create the new output file
+ tlFile output(new tlFileByteStream(filename, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+ printf("Could not open %s for writing,unable to Save\n", filename);
+ exit(-1);
+ }
+
+ // get the output wrapper chunk to write its data out
+ // to the file
+ outchunk->Write(&output);
+*/
+ delete inchunk;
+ delete outchunk;
+ delete p_dsglist;
+ return 1;
+ }
+ else
+ {
+
+ printf("\n=======================================================\n");
+ printf("\n=\tDSGmaker: Completed without ERRORS \n");
+ printf("\n=======================================================\n");
+
+ // create the new output file
+ tlFile output(new tlFileByteStream(filename, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+ printf("Could not open %s for writing\n", filename);
+ exit(-1);
+ }
+
+ // get the output wrapper chunk to write its data out
+ // to the file
+ outchunk->Write(&output);
+
+ // cleanup the no-longer-needed chunks
+ delete inchunk;
+ delete outchunk;
+ delete p_dsglist;
+
+
+ return 0;
+ }
+} //end of main
+
+
+
+/********************************************************************/
+/* Helper Function to strip extra crap from the string */
+/********************************************************************/
+
+
+unsigned int rootname(const char * input,char* output)
+{
+ char source_name[max_length];
+ char object_name1[max_length];
+ char object_name2[max_length];
+ char* token =NULL;
+
+ //printf("Phase 1 get name \n");
+
+ //get the name of collision object
+ strcpy(source_name,input);
+ //cout<<"Source name: "<<source_name<<endl;
+
+ //printf("smashing %s\n",source_name);
+ //smash up string to remove the number appended by Maya
+ //printf("strtok1\n");
+ token=strtok(source_name,"_");
+ strcpy(object_name1,token);
+ //printf("After stringtok :%s \n",object_name1);
+
+ //printf("strcat1\n");
+ //reform string
+ strcat(object_name1,"_");
+
+
+ //printf("strtok2\n");
+ token=strtok(NULL,"_");
+
+ if(token != NULL)
+ {
+ strcpy(object_name2,token);
+ //printf("After stringtok :%s \n",object_name2);
+ // printf("strcat2\n");
+ strcat(object_name1,object_name2);
+ }
+
+ //printf("strcpy\n");
+ //set default vaules
+
+ strcpy(output,object_name1);
+ //printf("processed name : %s\n",output);
+ return 0;
+}
+
diff --git a/tools/MakePS2CD/PS2CD.bat b/tools/MakePS2CD/PS2CD.bat
new file mode 100644
index 0000000..51a40d2
--- /dev/null
+++ b/tools/MakePS2CD/PS2CD.bat
@@ -0,0 +1,38 @@
+SET PS2DIR="..\..\Game\cd\PS2"
+SET TEMPDISKDIR="d:\Burn\PS2Disk"
+SET ISOPATH="d:\Burn\PS2ISO"
+SET ISONAME="PS2"
+SET LICENCE=".\licence.000"
+SET MOVIESDIR=".\..\..\Game\ps2movies\placeholder_movies"
+
+ECHO//////////////////////////////////////////////////////
+ECHO//MAKE PS2 DIrectory
+ECHO//////////////////////////////////////////////////////
+MD %TEMPDISKDIR%
+ROBOCOPY %PS2DIR%\ %TEMPDISKDIR% /MIR /XD art /XD movies
+
+ECHO//////////////////////////////////////////////////////
+ECHO//CEMENT ART
+ECHO//////////////////////////////////////////////////////
+..\..\game\libs\radcore\bin\filecementer.exe %TEMPDISKDIR%\art.rcf /basedir %PS2DIR% /add art\*
+RD /s /q %TEMPDISKDIR%\art\
+
+ECHO//////////////////////////////////////////////////////
+ECHO//COPY Movies
+ECHO//////////////////////////////////////////////////////
+ROBOCOPY %MOVIESDIR%\ %TEMPDISKDIR%\MOVIES /MIR
+
+ECHO/////////////////////////////////////////////////////
+ECHO//MAKE ISO IMAGE
+ECHO/////////////////////////////////////////////////////
+MD %ISOPATH%
+DEL /q %ISOPATH%\%ISONAME%.iso
+DEL /q %ISOPATH%\%ISONAME%.cue
+
+DEL %TEMPDISKDIR%\slps_123.45
+RENAME %TEMPDISKDIR%\srr2pr.elf slps_123.45
+CALL ee-strip %TEMPDISKDIR%\slps_123.45
+
+DEL %TEMPDISKDIR%\*.elf
+
+CALL mkps2iso.exe -nolimit %TEMPDISKDIR% %ISOPATH%\\%ISONAME%.iso %LICENCE% \ No newline at end of file
diff --git a/tools/MakePS2CD/PS2DVD.bat b/tools/MakePS2CD/PS2DVD.bat
new file mode 100644
index 0000000..dd70f85
--- /dev/null
+++ b/tools/MakePS2CD/PS2DVD.bat
@@ -0,0 +1,33 @@
+SET PS2DIR="..\..\Game\cd\PS2"
+SET TEMPDISKDIR="d:\Burn\PS2Disk"
+SET ISOPATH="d:\Burn\PS2ISO"
+SET ISONAME="PS2"
+SET LICENCE=".\licence.000"
+SET MOVIESDIR=".\..\..\Game\ps2movies\real_movies"
+
+ECHO//////////////////////////////////////////////////////
+ECHO//MAKE PS2 DIrectory
+ECHO//////////////////////////////////////////////////////
+MD %TEMPDISKDIR%
+ROBOCOPY %PS2DIR%\ %TEMPDISKDIR% /MIR /XD art /XD movies
+
+ECHO//////////////////////////////////////////////////////
+ECHO//CEMENT ART
+ECHO//////////////////////////////////////////////////////
+..\..\game\libs\radcore\bin\filecementer.exe %TEMPDISKDIR%\art.rcf /basedir %PS2DIR% /add art\*
+RD /s /q %TEMPDISKDIR%\art\
+
+ECHO//////////////////////////////////////////////////////
+ECHO//COPY Movies
+ECHO//////////////////////////////////////////////////////
+ROBOCOPY %MOVIESDIR%\ %TEMPDISKDIR%\MOVIES /MIR
+
+ECHO/////////////////////////////////////////////////////
+ECHO//STRIP ExE
+ECHO/////////////////////////////////////////////////////
+DEL %TEMPDISKDIR%\slps_123.45
+RENAME %TEMPDISKDIR%\srr2pr.elf slps_123.45
+CALL ee-strip %TEMPDISKDIR%\slps_123.45
+
+DEL %TEMPDISKDIR%\*.elf
+
diff --git a/tools/MakePS2CD/licence.000 b/tools/MakePS2CD/licence.000
new file mode 100644
index 0000000..deced87
--- /dev/null
+++ b/tools/MakePS2CD/licence.000
Binary files differ
diff --git a/tools/MayaRules/Debug/MayaRules.log b/tools/MayaRules/Debug/MayaRules.log
new file mode 100644
index 0000000..75c9160
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.log
@@ -0,0 +1,12 @@
+Build started 11/7/2015 5:44:20 PM.
+ 1>Project "G:\Code\Simpsons Hit&Run\tools\MayaRules\MayaRules.vcxproj" on node 3 (Build target(s)).
+ 1>CustomBuild:
+ Copying srr2rules to Maya
+ The system cannot find the path specified.
+ 0 file(s) copied.
+ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(170,5): error MSB6006: "cmd.exe" exited with code 1.
+ 1>Done Building Project "G:\Code\Simpsons Hit&Run\tools\MayaRules\MayaRules.vcxproj" (Build target(s)) -- FAILED.
+
+Build FAILED.
+
+Time Elapsed 00:00:00.41
diff --git a/tools/MayaRules/Debug/MayaRules.tlog/MayaRules.lastbuildstate b/tools/MayaRules/Debug/MayaRules.tlog/MayaRules.lastbuildstate
new file mode 100644
index 0000000..72cdac1
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.tlog/MayaRules.lastbuildstate
@@ -0,0 +1,2 @@
+#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
+Debug|Win32|G:\Code\Simpsons Hit&Run\tools\|
diff --git a/tools/MayaRules/Debug/MayaRules.tlog/custombuild.command.1.tlog b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.command.1.tlog
new file mode 100644
index 0000000..cc06b25
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.command.1.tlog
Binary files differ
diff --git a/tools/MayaRules/Debug/MayaRules.tlog/custombuild.read.1.tlog b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.read.1.tlog
new file mode 100644
index 0000000..46b134b
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.read.1.tlog
@@ -0,0 +1 @@
+ÿþ \ No newline at end of file
diff --git a/tools/MayaRules/Debug/MayaRules.tlog/custombuild.write.1.tlog b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.write.1.tlog
new file mode 100644
index 0000000..46b134b
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.tlog/custombuild.write.1.tlog
@@ -0,0 +1 @@
+ÿþ \ No newline at end of file
diff --git a/tools/MayaRules/Debug/MayaRules.tlog/unsuccessfulbuild b/tools/MayaRules/Debug/MayaRules.tlog/unsuccessfulbuild
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/MayaRules/Debug/MayaRules.tlog/unsuccessfulbuild
diff --git a/tools/MayaRules/MayaRules.dsp b/tools/MayaRules/MayaRules.dsp
new file mode 100644
index 0000000..c170f59
--- /dev/null
+++ b/tools/MayaRules/MayaRules.dsp
@@ -0,0 +1,118 @@
+# Microsoft Developer Studio Project File - Name="MayaRules" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=MayaRules - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "MayaRules.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "MayaRules.mak" CFG="MayaRules - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "MayaRules - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "MayaRules - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "MayaRules"
+# PROP Scc_LocalPath ".."
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "MayaRules - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"
+# ADD RSC /l 0x1009 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "MayaRules - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"
+# ADD RSC /l 0x1009 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "MayaRules - Win32 Release"
+# Name "MayaRules - Win32 Debug"
+# Begin Group "Rules"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\MayaTools\Maya4.0\scripts\srr2rules.txt
+
+!IF "$(CFG)" == "MayaRules - Win32 Release"
+
+# Begin Custom Build - Copying $(InputName) to Maya
+InputPath=..\MayaTools\Maya4.0\scripts\srr2rules.txt
+InputName=srr2rules
+
+"$(InputName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy $(InputPath) c:\aw\maya4.0\scripts\$(InputName)
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "MayaRules - Win32 Debug"
+
+# Begin Custom Build - Copying $(InputName) to Maya
+InputPath=..\MayaTools\Maya4.0\scripts\srr2rules.txt
+InputName=srr2rules
+
+"$(InputName)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy $(InputPath) c:\aw\maya4.0\scripts\$(InputName)
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/MayaRules/MayaRules.vcproj b/tools/MayaRules/MayaRules.vcproj
new file mode 100644
index 0000000..e1263d3
--- /dev/null
+++ b/tools/MayaRules/MayaRules.vcproj
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="MayaRules"
+ SccProjectName="Perforce Project"
+ SccAuxPath=""
+ SccLocalPath=".."
+ SccProvider="MSSCCI:Perforce SCM">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Debug/MayaRules.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="odbc32.lib odbccp32.lib"
+ OutputFile=".\Debug/MayaRules.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/MayaRules.pdb"
+ SubSystem="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/MayaRules.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE"
+ StringPooling="TRUE"
+ RuntimeLibrary="4"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Release/MayaRules.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="odbc32.lib odbccp32.lib"
+ OutputFile=".\Release/MayaRules.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ ProgramDatabaseFile=".\Release/MayaRules.pdb"
+ SubSystem="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/MayaRules.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="Rules"
+ Filter="">
+ <File
+ RelativePath="..\MayaTools\Maya4.0\scripts\srr2rules.txt">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copying $(InputName) to Maya"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;c:\aw\maya4.0\scripts\$(InputName)&quot;"
+ Outputs="$(InputName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copying $(InputName) to Maya"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;c:\aw\maya4.0\scripts\$(InputName)&quot;"
+ Outputs="$(InputName)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/MayaRules/MayaRules.vcxproj b/tools/MayaRules/MayaRules.vcxproj
new file mode 100644
index 0000000..05932a4
--- /dev/null
+++ b/tools/MayaRules/MayaRules.vcxproj
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath />
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <ProjectGuid>{F456A1E8-974F-4D56-BB57-3D944DF8DCB1}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>.\Debug\</OutDir>
+ <IntDir>.\Debug\</IntDir>
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>.\Release\</OutDir>
+ <IntDir>.\Release\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Debug/MayaRules.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+ <ObjectFileName>.\Debug/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>.\Debug/MayaRules.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Debug/MayaRules.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ <Midl>
+ <TypeLibraryName>.\Debug/MayaRules.tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Release/MayaRules.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>.\Release/MayaRules.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ProgramDatabaseFile>.\Release/MayaRules.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ <Midl>
+ <TypeLibraryName>.\Release/MayaRules.tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\MayaTools\Maya4.0\scripts\srr2rules.txt">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copying %(Filename) to Maya</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" "c:\aw\maya4.0\scripts\%(Filename)"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename);%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copying %(Filename) to Maya</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" "c:\aw\maya4.0\scripts\%(Filename)"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename);%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/tools/MayaRules/MayaRules.vcxproj.filters b/tools/MayaRules/MayaRules.vcxproj.filters
new file mode 100644
index 0000000..eb4a3e9
--- /dev/null
+++ b/tools/MayaRules/MayaRules.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Rules">
+ <UniqueIdentifier>{a9ebfc65-4204-4ed9-b6dc-b5678e2a73a1}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\MayaTools\Maya4.0\scripts\srr2rules.txt">
+ <Filter>Rules</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/bin/plug-ins/objectsnapper.mll b/tools/MayaTools/Maya4.0/bin/plug-ins/objectsnapper.mll
new file mode 100644
index 0000000..db95b36
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/bin/plug-ins/objectsnapper.mll
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/bin/plug-ins/trackeditor.mll b/tools/MayaTools/Maya4.0/bin/plug-ins/trackeditor.mll
new file mode 100644
index 0000000..ad21094
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/bin/plug-ins/trackeditor.mll
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/bin/plug-ins/worldbuilder.mll b/tools/MayaTools/Maya4.0/bin/plug-ins/worldbuilder.mll
new file mode 100644
index 0000000..87703bd
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/bin/plug-ins/worldbuilder.mll
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/extras/icons/bob_Mr_T.bmp b/tools/MayaTools/Maya4.0/extras/icons/bob_Mr_T.bmp
new file mode 100644
index 0000000..3d39370
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/extras/icons/bob_Mr_T.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/actionlocator.bmp b/tools/MayaTools/Maya4.0/icons/actionlocator.bmp
new file mode 100644
index 0000000..03ca285
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/actionlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/breakablecameralocator.bmp b/tools/MayaTools/Maya4.0/icons/breakablecameralocator.bmp
new file mode 100644
index 0000000..bf05f34
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/breakablecameralocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/carstartlocator.bmp b/tools/MayaTools/Maya4.0/icons/carstartlocator.bmp
new file mode 100644
index 0000000..43bfc06
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/carstartlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/directionallocator.bmp b/tools/MayaTools/Maya4.0/icons/directionallocator.bmp
new file mode 100644
index 0000000..5d663b5
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/directionallocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/eventlocator.bmp b/tools/MayaTools/Maya4.0/icons/eventlocator.bmp
new file mode 100644
index 0000000..a9c46ba
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/eventlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/fovlocator.bmp b/tools/MayaTools/Maya4.0/icons/fovlocator.bmp
new file mode 100644
index 0000000..0e85e2a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/fovlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/genericlocator.bmp b/tools/MayaTools/Maya4.0/icons/genericlocator.bmp
new file mode 100644
index 0000000..2c598d6
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/genericlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/interiorlocator.bmp b/tools/MayaTools/Maya4.0/icons/interiorlocator.bmp
new file mode 100644
index 0000000..47a2f9b
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/interiorlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/occlusionlocator.bmp b/tools/MayaTools/Maya4.0/icons/occlusionlocator.bmp
new file mode 100644
index 0000000..4148247
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/occlusionlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/pedgrouplocator.bmp b/tools/MayaTools/Maya4.0/icons/pedgrouplocator.bmp
new file mode 100644
index 0000000..b420e53
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/pedgrouplocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/scriptlocator.bmp b/tools/MayaTools/Maya4.0/icons/scriptlocator.bmp
new file mode 100644
index 0000000..17ce55e
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/scriptlocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/staticcameralocator.bmp b/tools/MayaTools/Maya4.0/icons/staticcameralocator.bmp
new file mode 100644
index 0000000..909a577
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/staticcameralocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/icons/zonelocator.bmp b/tools/MayaTools/Maya4.0/icons/zonelocator.bmp
new file mode 100644
index 0000000..4a17b3a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/icons/zonelocator.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEActionEventLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEActionEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..4c1a413
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEActionEventLocatorNodeTemplate.mel
@@ -0,0 +1,34 @@
+global proc AEActionEventLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+
+ editorTemplate -addControl "exportTransform";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Action Attribute" -collapse false;
+ editorTemplate -addControl "actionObject";
+ editorTemplate -addControl "joint";
+ editorTemplate -addControl "action";
+ editorTemplate -addControl "buttonInput";
+ editorTemplate -addControl "shouldTransform";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel
new file mode 100644
index 0000000..82a08f2
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel
@@ -0,0 +1,20 @@
+global proc AEBreakableCameraLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "FOV Settings" -collapse 0;
+ editorTemplate -addControl "fov";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AECarStartLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AECarStartLocatorNodeTemplate.mel
new file mode 100644
index 0000000..a3e9f04
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AECarStartLocatorNodeTemplate.mel
@@ -0,0 +1,21 @@
+global proc AECarStartLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Car Start Data" -collapse 0;
+ editorTemplate -addControl "isParked";
+ editorTemplate -addControl "specialName";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEDirectionalLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEDirectionalLocatorNodeTemplate.mel
new file mode 100644
index 0000000..cd9d34e
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEDirectionalLocatorNodeTemplate.mel
@@ -0,0 +1,16 @@
+global proc AEDirectionalLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEEventLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..9d6443b
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEEventLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEEventLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Event Attributes" -collapse false;
+ editorTemplate -addControl "event";
+ editorTemplate -addControl "extraData";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEFOVLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEFOVLocatorNodeTemplate.mel
new file mode 100644
index 0000000..c02a84a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEFOVLocatorNodeTemplate.mel
@@ -0,0 +1,30 @@
+global proc AEFOVLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "FOV Settings" -collapse 0;
+ editorTemplate -addControl "fov";
+ editorTemplate -addControl "time";
+ editorTemplate -addControl "rate";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEGenericLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEGenericLocatorNodeTemplate.mel
new file mode 100644
index 0000000..c1ed3cb
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEGenericLocatorNodeTemplate.mel
@@ -0,0 +1,16 @@
+global proc AEGenericLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel
new file mode 100644
index 0000000..f23f6ee
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEInteriorEntranceLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Interior Attribute" -collapse false;
+ editorTemplate -addControl "zone";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEIntersectionLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEIntersectionLocatorNodeTemplate.mel
new file mode 100644
index 0000000..740b05f
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEIntersectionLocatorNodeTemplate.mel
@@ -0,0 +1,20 @@
+global proc AEIntersectionLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Intersection Attributes" -collapse 0;
+
+ editorTemplate -addControl "IntersectionType";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "localPosition";
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEOcclusionLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEOcclusionLocatorNodeTemplate.mel
new file mode 100644
index 0000000..5833530
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEOcclusionLocatorNodeTemplate.mel
@@ -0,0 +1,29 @@
+
+global proc AEOcclusionLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNewOcclude"
+ "AEWBTriggerButtonReplaceOcclude"
+ "message";
+
+ editorTemplate -callCustom "AEWBTriggerButtonNewVisible"
+ "AEWBTriggerButtonReplaceVisible"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEPedGroupLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEPedGroupLocatorNodeTemplate.mel
new file mode 100644
index 0000000..1dcfcce
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEPedGroupLocatorNodeTemplate.mel
@@ -0,0 +1,26 @@
+global proc AEPedGroupLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Ped Group Attributes" -collapse 0;
+ editorTemplate -addControl "group";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AERailCamLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AERailCamLocatorNodeTemplate.mel
new file mode 100644
index 0000000..7d3178c
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AERailCamLocatorNodeTemplate.mel
@@ -0,0 +1,56 @@
+global proc AERailCamLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Rail Attributes" -collapse false;
+ editorTemplate -addControl "cutInOut";
+ editorTemplate -addControl "carOnly";
+ editorTemplate -addControl "onFootOnly";
+ editorTemplate -addControl "reset";
+ editorTemplate -addControl "noFOV";
+ editorTemplate -addControl "camRail";
+ editorTemplate -addControl "behaviour";
+ editorTemplate -addControl "minRadius";
+ editorTemplate -addControl "maxRadius";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "trackRail";
+ editorTemplate -addControl "trackDist";
+ editorTemplate -addControl "reverseSense";
+ editorTemplate -addControl "fieldOfView";
+ editorTemplate -addControl "facingOffset";
+ editorTemplate -addControl "axisPlay";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "positionLag";
+ editorTemplate -addControl "targetLag";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl"active";
+ editorTemplate -addControl "target";
+
+ editorTemplate -addSeparator;
+ editorTemplate -addControl "transitionTo";
+
+ editorTemplate -callCustom "AEWBTargetSelectNew"
+ "AEWBTargetSelectReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AERoadNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AERoadNodeTemplate.mel
new file mode 100644
index 0000000..27c4431
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AERoadNodeTemplate.mel
@@ -0,0 +1,29 @@
+global proc AERoadNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Road Attributes" -collapse 0;
+
+ editorTemplate -addControl "IntersectionStart";
+ editorTemplate -addControl "IntersectionEnd";
+ editorTemplate -addControl "density";
+ editorTemplate -addControl "speed";
+ editorTemplate -addControl "difficulty";
+ editorTemplate -addControl "shortCut";
+
+ editorTemplate -callCustom "AETEShowRoadSegNew"
+ "AETEShowRoadSegReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "localPosition";
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEScriptLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEScriptLocatorNodeTemplate.mel
new file mode 100644
index 0000000..2e800c8
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEScriptLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEScriptLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Script Attributes" -collapse false;
+ editorTemplate -addControl "script";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AESplineLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AESplineLocatorNodeTemplate.mel
new file mode 100644
index 0000000..57e5e2a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AESplineLocatorNodeTemplate.mel
@@ -0,0 +1,23 @@
+global proc AESplineLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEStaticCameraLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEStaticCameraLocatorNodeTemplate.mel
new file mode 100644
index 0000000..d611957
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEStaticCameraLocatorNodeTemplate.mel
@@ -0,0 +1,52 @@
+global proc AEStaticCameraLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Camera Attributes" -collapse false;
+ editorTemplate -addControl "cutInOut";
+ editorTemplate -addControl "carOnly";
+ editorTemplate -addControl "onFootOnly";
+ editorTemplate -addControl "oneShot";
+ editorTemplate -addControl "noFOV";
+ editorTemplate -addControl "fieldOfView";
+ editorTemplate -addControl "facingOffset";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "targetLag";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "active";
+
+ editorTemplate -addControl "target";
+ editorTemplate -addControl "tracking";
+
+ editorTemplate -addSeparator;
+ editorTemplate -addControl "transitionTo";
+
+ editorTemplate -callCustom "AEWBTargetSelectNew"
+ "AEWBTargetSelectReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AETELocatorSuppress.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETELocatorSuppress.mel
new file mode 100644
index 0000000..13a6d00
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETELocatorSuppress.mel
@@ -0,0 +1,37 @@
+global proc AETELocatorSuppress( string $nodeName )
+{
+ editorTemplate -suppress "inputTranslate";
+ editorTemplate -suppress "input";
+ editorTemplate -suppress "caching";
+ editorTemplate -suppress "nodeState";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "template";
+ editorTemplate -suppress "ghosting";
+ editorTemplate -suppress "instObjGroups";
+ editorTemplate -suppress "compInstObjGroups";
+ editorTemplate -suppress "castsShadows";
+ editorTemplate -suppress "receiveShadows";
+ editorTemplate -suppress "depthJitter";
+ editorTemplate -suppress "motionBlur";
+ editorTemplate -suppress "renderInfo";
+ editorTemplate -suppress "primaryVisibility";
+ editorTemplate -suppress "visibleInReflections";
+ editorTemplate -suppress "visibleInRefractions";
+ editorTemplate -suppress "geometryAntialiasingOverride";
+ editorTemplate -suppress "antialiasingLevel";
+ editorTemplate -suppress "shadingSamplesOverride";
+ editorTemplate -suppress "shadingSamples";
+ editorTemplate -suppress "maxShadingSamples";
+ editorTemplate -suppress "volumeSamplesOverride";
+ editorTemplate -suppress "volumeSamples";
+ editorTemplate -suppress "maxVisibilitySamplesOverride";
+ editorTemplate -suppress "maxVisibilitySamples";
+ editorTemplate -suppress "boundingBoxScale";
+ editorTemplate -suppress "drawOverride";
+ editorTemplate -suppress "useObjectColor";
+ editorTemplate -suppress "objectColor";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "lodVisibility";
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AETEShowRoadSegButton.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETEShowRoadSegButton.mel
new file mode 100644
index 0000000..3ffbeb5
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETEShowRoadSegButton.mel
@@ -0,0 +1,29 @@
+global proc AETEShowRoadSegNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "te_MCB_ShowRoadFromSelected()";
+
+ button -label "Show Road Segments" -command $command TEShowRoadSegsButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+
+global proc AETEShowRoadSegReplace( string $nodeName )
+{
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "te_MCB_ShowRoadFromSelected";
+
+ button -e -command $command TEShowRoadSegsButton;
+
+ select $names[0];
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AETreelineShapeNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETreelineShapeNodeTemplate.mel
new file mode 100644
index 0000000..766ed13
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETreelineShapeNodeTemplate.mel
@@ -0,0 +1,41 @@
+global proc AETreelineShapeNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Treeline Attributes" -collapse false;
+
+ editorTemplate -addControl "material";
+
+ editorTemplate -addControl "uscale";
+
+ editorTemplate -addControl "height";
+
+ editorTemplate -suppress "colour";
+
+ editorTemplate -suppress "alpha";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AETELocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "controlPoints";
+ editorTemplate -suppress "weights";
+ editorTemplate -suppress "uvSet";
+ editorTemplate -suppress "tweak";
+ editorTemplate -suppress "relativeTweak";
+ editorTemplate -suppress "currentUVSet";
+ editorTemplate -suppress "doubleSided";
+ editorTemplate -suppress "opposite";
+ editorTemplate -suppress "smoothShading";
+ editorTemplate -suppress "featureDisplacement";
+ editorTemplate -suppress "initialSampleRate";
+ editorTemplate -suppress "textureThreshold";
+ editorTemplate -suppress "normalThreshold";
+ editorTemplate -suppress "extraSampleRate";
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AETriggerVolumeNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETriggerVolumeNodeTemplate.mel
new file mode 100644
index 0000000..4166b0e
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AETriggerVolumeNodeTemplate.mel
@@ -0,0 +1,18 @@
+global proc AETriggerVolumeNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Trigger Volume Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+
+ editorTemplate -addControl "type";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBLocatorSuppress.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBLocatorSuppress.mel
new file mode 100644
index 0000000..e9784d8
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBLocatorSuppress.mel
@@ -0,0 +1,37 @@
+global proc AEWBLocatorSuppress( string $nodeName )
+{
+ editorTemplate -suppress "inputTranslate";
+ editorTemplate -suppress "input";
+ editorTemplate -suppress "caching";
+ editorTemplate -suppress "nodeState";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "template";
+ editorTemplate -suppress "ghosting";
+ editorTemplate -suppress "instObjGroups";
+ editorTemplate -suppress "compInstObjGroups";
+ editorTemplate -suppress "castsShadows";
+ editorTemplate -suppress "receiveShadows";
+ editorTemplate -suppress "depthJitter";
+ editorTemplate -suppress "motionBlur";
+ editorTemplate -suppress "renderInfo";
+ editorTemplate -suppress "primaryVisibility";
+ editorTemplate -suppress "visibleInReflections";
+ editorTemplate -suppress "visibleInRefractions";
+ editorTemplate -suppress "geometryAntialiasingOverride";
+ editorTemplate -suppress "antialiasingLevel";
+ editorTemplate -suppress "shadingSamplesOverride";
+ editorTemplate -suppress "shadingSamples";
+ editorTemplate -suppress "maxShadingSamples";
+ editorTemplate -suppress "volumeSamplesOverride";
+ editorTemplate -suppress "volumeSamples";
+ editorTemplate -suppress "maxVisibilitySamplesOverride";
+ editorTemplate -suppress "maxVisibilitySamples";
+ editorTemplate -suppress "boundingBoxScale";
+ editorTemplate -suppress "drawOverride";
+ editorTemplate -suppress "useObjectColor";
+ editorTemplate -suppress "objectColor";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "lodVisibility";
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBSelectTarget.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBSelectTarget.mel
new file mode 100644
index 0000000..d1cd428
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBSelectTarget.mel
@@ -0,0 +1,34 @@
+global proc wb_BCB_SelectTarget( string $nodeName )
+{
+ select $nodeName;
+ string $actNodes[] = `ls -sl -o`;
+
+ string $text = `textField -q -text WBTargetName`;
+
+ print ($text + "\n");
+
+ if ( $text != "" )
+ {
+ evalEcho ("setAttr " + $actNodes[0] + ".target -type \"string\" \"" + $text + "\"");
+ }
+
+ select $actNodes[0];
+}
+
+global proc AEWBTargetSelectNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ textField -ed true WBTargetName;
+ string $command = "wb_BCB_SelectTarget( \"" + $nodeName + "\" )";
+ button -label "Select Target" -command $command WBSelectTargetButton;
+
+ setParent ..;
+}
+
+global proc AEWBTargetSelectReplace( string $nodeName )
+{
+ textField -e -text "" WBTargetName;
+ string $command = "wb_BCB_SelectTarget( \"" + $nodeName + "\" )";
+ button -e -command $command WBSelectTargetButton;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBTriggerButton.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBTriggerButton.mel
new file mode 100644
index 0000000..ddb862a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEWBTriggerButton.mel
@@ -0,0 +1,94 @@
+global int $gIsItVisibler = 0;
+
+global proc AEWBTriggerButtonNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -label "Attach Triggers" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+
+global proc AEWBTriggerButtonReplace( string $nodeName )
+{
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonNewOcclude( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -label "Add Occlusion Volume" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonReplaceOcclude( string $nodeName )
+{
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonNewVisible( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 1)";
+
+ button -label "Add Visibler Volume" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonReplaceVisible( string $nodeName )
+{
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 1)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc int IsVisibler()
+{
+ global int $gIsItVisibler;
+
+ return $gIsItVisibler;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/AETemplates/AEZoneEventLocatorNodeTemplate.mel b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEZoneEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..869066a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/AETemplates/AEZoneEventLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEZoneEventLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Zone Attribute" -collapse false;
+ editorTemplate -addControl "zone";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/ajrAutoSave.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/ajrAutoSave.mel
new file mode 100644
index 0000000..d3f7f0d
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/ajrAutoSave.mel
@@ -0,0 +1,532 @@
+/* This file downloaded from Highend3d.com
+''
+'' Highend3d.com File Information:
+''
+'' Script Name: ajrAutoSave v1.3
+'' Author: Andy Rawling
+'' Last Updated: July 17, 2001
+'' Update/Change this file at:
+'' http://www.highend3d.com/maya/mel/?section=utilities#198
+''
+'' Please do not alter any information above this line
+'' it is generated dynamically by Highend3d.com and will
+'' be changed automatically on any updates.
+*/
+
+// ajrAutoSave.mel
+// v 1.3 July 16 2001
+//
+// Tested on Maya2.5Irix Maya2.5.1NT Maya3.0Irix
+//
+// Provides automatic backup of scene files.
+//
+// When this script is first called, it creates two MEL scriptJobs to run
+// short procedures whenever the user selects or de-selects an object, and
+// when they change the current time. These jobs trigger backups in two
+// ways, either based on the number of times the user selects objects, or
+// on the amount of time since the last save.
+// The script also modifies your main File menu, adding File->Autosave options...
+// to the end. Choosing this menu command brings up the configuration GUI
+// (by running the same script again, but that's not important right now).
+//
+// In selection mode, the script keeps a count of how many times the selection
+// has changed, and will trigger an automatic scene backup when the number of
+// selection changes passes the limit set by the user.
+//
+// In time mode, the script checks the time whenever the selection or the
+// current time is changed by the user. The scene is backed up when the amount
+// of time since the last save passes the limit
+//
+// This script is designed to be called from your 'userSetup.mel' script.
+//
+// Configuration
+// -------------
+// If the script is run again, it will bring up a GUI which allows you to
+// modify the way that AutoSave works. The options are:
+// o Enable AutoSave
+// o Save After XX minutes/selects
+// o Keep up to XX backups
+// o Save in XX
+// o notify when saving
+//
+//
+// Enable AutoSave: Check this option off to disable AutoSave (default=ON)
+// Save After XX (things): Set the number of things which happen before the
+// autosave is triggered - either the user changing which items are
+// selected, or the number of minutes since the last save (default=15)
+// (minutes/selects): What sort of things are we using to spot changes? Either
+// number of times the selection changes, or number of minutes
+// passed since the last save (default=minutes , but see the caveats
+// below)
+// Keep up to XX backups: AutoSave keeps a rolling sequence of backups. The
+// number of separate backups can be changed here
+// (default=5)
+// Save in XXXX: Choose the folder where you want the backups to be kept.
+// This can be relative to your current project (default="scenes")
+// notify when saving: Bring up a small window to tell you when a backup is being
+// made (default=OFF)
+//
+//
+// Caveats
+// -------
+// Maya has no clock event, so when the save is time-based the clock is only
+// checked when the selection or the current time (as in time slider) changes.
+//
+// Changes (* is a highend3d release)
+// -------
+// v1.3* Autosaving no longer clears the current tool - cheers to Roger Klado
+// Feedback line is now more informative as the GUI settings are changed.
+// v1.2 I've got M3.0, so here there are annotations all over the GUI. Removed
+// the 'Include in File menu` option from the GUI - it's always included
+// now. Notify defaults to off now (too many hardware render mess-ups)
+// v1.1 Layout is more Irix/Motif-friendly now (was a bit squashed)
+// v1.0* Fixed minor bug when the scene wasn't saved, choosing not to save
+// would switch the autosave off. New behavior is to nag the user again
+// after the trigger period. Now uses a timer as well as selection counter
+// to trigger backups.
+//
+// Disclaimer
+// ----------
+// This script is unsupported; neither me nor (especially) my employer accept
+// liability for damage or loss resulting from its use or misuse. Use it at
+// your own risk. That said - if you like it, spot a bug in it or think it
+// could be improved please let me know.
+//
+// Andy Rawling andrew.rawling@_CUT_THIS_BIT_OUT_bigfoot.com
+// Animator
+//
+
+global proc ajrAS_SelectionHasChanged() {
+// This is called even when AutoSave is disabled, it just doesn't perform the save in this case
+// We're checking for time passing as well as selection changes here!
+
+ if((`optionVar -exists "ajrAS_iSelectTrigger"`) && (`optionVar -exists "ajrAS_iEnabled"`) && (`optionVar -exists "ajrAS_iUseTime"`)) {
+
+ if((`optionVar -query "ajrAS_iUseTime"`)) {
+ // We're using time to trigger saves
+ global float $ajrAS_fLastSave; //Absolute time of the last save (or script startup)
+ float $fElapsed;
+
+ $fElapsed = `timerX -startTime $ajrAS_fLastSave`;
+ if(($fElapsed / 60.0) > `optionVar -query "ajrAS_iSelectTrigger"`) {
+ if(`optionVar -query "ajrAS_iEnabled"`)
+ if (`ajrAS_SaveBackupScene`)
+ $ajrAS_fLastSave = `timerX`;
+ }
+ } else {
+ // Using the number of selection changes to trigger
+ global int $ajrAS_iSelectCount; // The selection change counter
+
+ $ajrAS_iSelectCount ++;
+ if ($ajrAS_iSelectCount >= `optionVar -query "ajrAS_iSelectTrigger"`) {
+ if(`optionVar -query "ajrAS_iEnabled"`)
+ if (`ajrAS_SaveBackupScene`)
+ $ajrAS_iSelectCount = 0;
+ }
+ }
+ }
+}
+
+global proc ajrAS_CurrentTimeHasChanged() {
+// This is called even when AutoSave is disabled, it just doesn't perform the save in this case
+// We're only interested in time passing here
+
+ if((`optionVar -exists "ajrAS_iSelectTrigger"`) && (`optionVar -exists "ajrAS_iEnabled"`)) {
+
+ if((`optionVar -query "ajrAS_iUseTime"`)) {
+ global float $ajrAS_fLastSave; //Absolute time of the last save (or script startup)
+ float $fElapsed;
+
+ $fElapsed = `timerX -startTime $ajrAS_fLastSave`;
+ if(($fElapsed / 60.0) > `optionVar -query "ajrAS_iSelectTrigger"`) {
+ if(`optionVar -query "ajrAS_iEnabled"`)
+ if (`ajrAS_SaveBackupScene`)
+ $ajrAS_fLastSave = `timerX`;
+ }
+ }
+ }
+}
+
+global proc int ajrAS_SaveBackupScene() {
+// Save the backup file
+// This routine is called when the number of events reaches the level set by the user
+// to trigger a backup save.
+// The save routine appends "_AutoSave#1" to the scene name of the first backup, then
+// #2, #3 etc, until the number of saves reaches the maximum limit, when the number
+// resets to 1 again.
+// If the notifier is switched on, a message window is created for the duration of the\
+// save. Either way, a message is shown on the command feedback line
+//
+ global int $ajrAS_iBackupNumber; // Number of the current backup file
+ string $sSceneName; // Full name (including directory path) of the scene file
+ string $sBackupName; // Name (not inc. path or extension) of the backup scene
+ string $sBackupDir;
+ string $sWorkingTool;
+ int $iReturn = 0;
+
+ // If these values are not in the prefs, then this function should never have been called. Check anyway.
+ if((`optionVar -exists "ajrAS_iSaveCopies"`) && (`optionVar -exists "ajrAS_iNotify"`) && (`optionVar -exists "ajrAS_sBackupDir"`)) {
+
+ $sSceneName = `file -query -sceneName`;
+ // If the scene has no name (hasn't been saved yet) then prompt to do a "Save As"
+ if($sSceneName == "") {
+ string $sReturn = `confirmDialog -title "AutoSave"
+ -message "This scene has not been saved.\nAutoSave will not back up an unsaved scene\n\nDo you want to save your scene now?"
+ -button "Yes"
+ -button "No"
+ -button "Configure"
+ -defaultButton "Yes"
+ -cancelButton "No"
+ -dismissString "No"`;
+ switch($sReturn) {
+
+ case "Configure":
+ ajrAS_GUI;
+ break;
+
+ case "Yes":
+ projectViewer("SaveAs");
+ break;
+
+ case "No":
+ // Reset the event counter
+ // The user will be nagged again shortly
+ $iReturn = 1;
+ break;
+ }
+ } else {
+ $sBackupDir = `optionVar -query "ajrAS_sBackupDir"`;
+ if (`file -query -exists $sBackupDir`) {
+ $sWorkingTool = `currentCtx`;
+ $sBackupName = (`optionVar -query "ajrAS_sBackupDir"` + "/" + `file -query -namespace` + "_AutoSave#" + $ajrAS_iBackupNumber);
+ if(`optionVar -query "ajrAS_iNotify"`)
+ ajrAS_MakeNotifyWindow($sBackupName);
+ print("Auto saving file: " + $sBackupName + ".\n");
+ file -rename $sBackupName;
+ file -save -type mayaBinary -defaultExtensions true;
+ $iReturn = 1;
+ file -rename $sSceneName;
+ $ajrAS_iBackupNumber ++;
+ if ($ajrAS_iBackupNumber > `optionVar -query "ajrAS_iSaveCopies"`)
+ $ajrAS_iBackupNumber = 1;
+ if(`optionVar -query "ajrAS_iNotify"`) {
+ deleteUI ui_ajrAS_NotifyWindow;
+ }
+ setToolTo $sWorkingTool;
+ } else {
+ ajrAS_CheckBackupDir;
+ }
+ }
+ }
+ return ($iReturn);
+}
+
+global proc ajrAS_MakeNotifyWindow(string $sFileName) {
+
+ if (`window -exists ui_ajrAS_NotifyWindow`)
+ deleteUI ui_ajrAS_NotifyWindow;
+
+ window -title ("Saving backup: " + $sFileName + ", please wait...")
+ -iconName "Saving"
+ -widthHeight 500 25
+ -menuBar false
+ ui_ajrAS_NotifyWindow;
+
+ showWindow ui_ajrAS_NotifyWindow;
+}
+
+global proc ajrAS_Reset() {
+// Reset GUI fields & prefs to defaults.
+ checkBox -edit -value on ui_ajrAS_iEnabled;
+ intField -edit -value 15 ui_ajrAS_iSelectTrigger;
+ optionMenu -edit -select 2 ui_ajrAS_type;
+ intField -edit -value 5 ui_ajrAS_iSaveCopies;
+ checkBox -edit -value on ui_ajrAS_iNotify;
+ textField -edit -fileName "scenes" ui_ajrAS_sBackupDir;
+ ajrAS_Update;
+ $ajrAS_iSelectCount = 0;
+}
+
+global proc ajrAS_Update() {
+// Update the prefs settings
+ optionVar -intValue "ajrAS_iEnabled" `checkBox -query -value ui_ajrAS_iEnabled`;
+ optionVar -intValue "ajrAS_iSelectTrigger" `intField -query -value ui_ajrAS_iSelectTrigger`;
+ optionVar -intValue "ajrAS_iUseTime" (`optionMenu -query -value ui_ajrAS_type` == "minutes");
+ optionVar -intValue "ajrAS_iSaveCopies" `intField -query -value ui_ajrAS_iSaveCopies`;
+ optionVar -intValue "ajrAS_iNotify" `checkBox -query -value ui_ajrAS_iNotify`;
+ optionVar -stringValue "ajrAS_sBackupDir" `textField -query -fileName ui_ajrAS_sBackupDir`;
+ string $sReportStr = "AutoSave: ";
+ if(! `optionVar -query "ajrAS_iEnabled"`)
+ $sReportStr += ("disabled.\n");
+ else {
+ ajrAS_SelectionHasChanged;
+ ajrAS_CheckBackupDir;
+ $sReportStr += ("every " + `optionVar -query "ajrAS_iSelectTrigger"` + " ");
+ if((`optionVar -query "ajrAS_iUseTime"`)) {
+ global float $ajrAS_fLastSave; //Absolute time of the last save (or script startup)
+ $sReportStr += ("minutes (next in ");
+ $sReportStr += ((int)(`optionVar -query "ajrAS_iSelectTrigger"` - (`timerX -startTime $ajrAS_fLastSave` / 60.0)) + "), ");
+ } else {
+ global int $ajrAS_iSelectCount; // The selection change counter
+ $sReportStr += ("selects (next in ");
+ $sReportStr += ((`optionVar -query "ajrAS_iSelectTrigger"` - ($ajrAS_iSelectCount)) + "), ");
+ }
+ $sReportStr += ("keep " + `optionVar -query "ajrAS_iSaveCopies"` + " copies in " + `optionVar -query "ajrAS_sBackupDir"` + ".\n");
+ }
+ print $sReportStr;
+}
+
+global proc int ajrAS_SetBackupDir(string $sDirName, string $sDirType) {
+// Callback function for 'fileBrowser' call on backup directory chooser
+ textField -edit -fileName `workspace -projectPath $sDirName` ui_ajrAS_sBackupDir;
+ ajrAS_Update;
+ return true;
+}
+
+global proc int ajrAS_CheckBackupDir() {
+// Check that the backup location is valid
+// If not, give the option of creating the backup directory, changing the location
+// or just carrying on (in which cast the save doesn't happen)
+ string $sBackupDir;
+ int $iReturn;
+
+ $sBackupDir = `optionVar -query "ajrAS_sBackupDir"`;
+ if (! `file -query -exists $sBackupDir`) {
+ string $sQuestion;
+ string $sAnswer;
+ $sQuestion = "Your backup folder, (" + $sBackupDir + ") doesn't exist.\n" +
+ "Would you like to create this folder, or use select a new location?\n" +
+ "\n" +
+ "(If you choose to do neither, saving will be disabled)";
+
+ $sAnswer = `confirmDialog -title "AutoSave"
+ -message $sQuestion
+ -button "Create"
+ -button "Re-Select"
+ -button "Forget it"
+ -defaultButton "Re-Select"
+ -cancelButton "Forget It"
+ -dismissString "Forget It"`;
+
+ switch($sAnswer) {
+ case "Create":
+ // Try to create the folder (no return value to check success)
+ workspace -create `workspace -expandName $sBackupDir`;
+ // Call this procedure again to see if it worked
+ ajrAS_CheckBackupDir;
+ break;
+ case "Re-Select":
+ optionVar -stringValue "ajrAS_sBackupDir" "scenes";
+ if (`window -exists ui_ajrAS`)
+ textField -edit -fileName "scenes" ui_ajrAS_sBackupDir;
+ else
+ ajrAS_GUI;
+ break;
+ default:
+ if (`window -exists ui_ajrAS`)
+ checkBox -edit -value off ui_ajrAS_iEnabled;
+ optionVar -intValue "ajrAS_iEnabled" off;
+ $iReturn = 0;
+ break;
+ }
+
+ } else
+ $iReturn = 1;
+
+ return $iReturn;
+}
+
+global proc ajrAS_FileMenu() {
+// Add or remove the AutoSave item from the main File menu
+ global string $gMainFileMenu; // Name of Maya 'File' menu
+
+ if(`menuItem -exists ui_ajrAS_FileAutoSaveSeperator`)
+ deleteUI ui_ajrAS_FileAutoSaveSeperator;
+ if(`menuItem -exists ui_ajrAS_FileAutoSaveMenu`)
+ deleteUI ui_ajrAS_FileAutoSaveMenu;
+
+ menuItem -parent $gMainFileMenu
+ -divider true
+ ui_ajrAS_FileAutoSaveSeperator;
+ menuItem -parent $gMainFileMenu
+ -label "Auto Save options..."
+ -annotation "Auto Save: Configure automatic backups"
+ -command "ajrAutoSave"
+ ui_ajrAS_FileAutoSaveMenu;
+}
+
+global proc ajrAS_GUI() {
+// Call up the GUI
+ if (`window -exists ui_ajrAS`)
+ deleteUI ui_ajrAS;
+
+ window -title "AutoSave v1.3"
+ -iconName "AutoSave"
+ -widthHeight 280 300
+ -menuBar false
+ ui_ajrAS;
+
+ formLayout ui_ajrAS_mainForm;
+
+ frameLayout -borderStyle "in"
+ -labelVisible false
+ ui_ajrAS_mainFrame;
+
+ scrollLayout -childResizable true
+ -verticalScrollBarThickness 10
+ -horizontalScrollBarThickness 0;
+
+ columnLayout -adjustableColumn true
+ -cal "left";
+
+ frameLayout -labelVisible false
+ -borderStyle "etchedIn"
+ -manage true;
+
+ columnLayout -adjustableColumn true
+ -columnOffset "left" 30
+ -columnAlign "left";
+
+ checkBox -label "Enable AutoSave"
+ -value `optionVar -query ajrAS_iEnabled`
+ -onCommand "ajrAS_Update"
+ -offCommand "ajrAS_Update; $ajrAS_iSelectCount = 0;"
+ -annotation "Enable: Switch the autosave feature on/off"
+ ui_ajrAS_iEnabled;
+
+ setParent ..;
+ setParent ..;
+
+ frameLayout -label "Options"
+ -borderStyle "etchedIn"
+ ui_ajrAS_optionsFrame;
+
+ columnLayout -adjustableColumn true
+ -columnOffset "left" 30
+ -columnAlign "left";
+
+ rowColumnLayout -numberOfColumns 3
+ -columnWidth 1 70
+ -columnWidth 2 40
+ -columnWidth 3 100;
+
+ text "Save after";
+ intField -value `optionVar -query ajrAS_iSelectTrigger`
+ -width 35
+ -changeCommand "ajrAS_Update"
+ -annotation "Save after: Good values are 200 for selects, 30 for minutes"
+ ui_ajrAS_iSelectTrigger;
+ optionMenu ui_ajrAS_type;
+ menuItem -label "selects";
+ menuItem -label "minutes";
+ optionMenu -edit
+ -changeCommand "ajrAS_Update"
+ -annotation "Save after: Will you make backups as the minutes pass, or as you pick objects"
+ -select (`optionVar -query ajrAS_iUseTime` + 1)
+ ui_ajrAS_type;
+
+ text "Keep up to";
+ intField -value `optionVar -query ajrAS_iSaveCopies`
+ -annotation "Keep up to: How many rolling copies do you want to keep"
+ -width 35
+ -changeCommand "ajrAS_Update"
+ ui_ajrAS_iSaveCopies;
+ text " backups";
+
+ setParent ..;
+
+ rowLayout -numberOfColumns 3
+ -columnWidth3 70 100 50
+ -columnAttach3 "left" "left" "left"
+ -columnOffset3 0 0 5
+ -adjustableColumn 2;
+
+ text -label "Save in";
+ textField -fileName `optionVar -query ajrAS_sBackupDir`
+ -width 90
+ -changeCommand "ajrAS_Update"
+ -annotation "Save in: Path to your backup folder (can be relative to your project)"
+ ui_ajrAS_sBackupDir;
+ symbolButton -image "navButtonBrowse.xpm"
+ -annotation "Save in: Browse for the backup folder"
+ -command "fileBrowser(\"ajrAS_SetBackupDir\",\"AutoSave\", \"folder\", 4);"
+ browser;
+ setParent ..;
+
+ checkBox -label "notify when saving"
+ -annotation "Notify: Pop up an window when saving (may interfere with hardware rendering)"
+ -value `optionVar -query ajrAS_iNotify`
+ -onCommand "ajrAS_Update"
+ -offCommand "ajrAS_Update"
+ ui_ajrAS_iNotify;
+
+ setParent ..;
+
+ setParent ..;
+
+ setParent ..;
+ setParent ..;
+ setParent ..;
+
+ button -label "Close"
+ -command "ajrAS_Update; deleteUI ui_ajrAS"
+ ui_ajrAS_close;
+
+ button -label "Reset"
+ -command "ajrAS_Reset"
+ ui_ajrAS_reset;
+
+ formLayout -edit
+ -attachForm ui_ajrAS_mainFrame "left" 5
+ -attachForm ui_ajrAS_mainFrame "right" 5
+ -attachForm ui_ajrAS_mainFrame "top" 5
+ -attachForm ui_ajrAS_mainFrame "bottom" 35
+
+ -attachPosition ui_ajrAS_reset "left" 2 50
+ -attachForm ui_ajrAS_reset "right" 5
+ -attachNone ui_ajrAS_reset "top"
+ -attachForm ui_ajrAS_reset "bottom" 5
+
+ -attachForm ui_ajrAS_close "left" 5
+ -attachPosition ui_ajrAS_close "right" 2 50
+ -attachNone ui_ajrAS_close "top"
+ -attachForm ui_ajrAS_close "bottom" 5
+
+ ui_ajrAS_mainForm;
+
+ showWindow ui_ajrAS;
+}
+
+global proc ajrAutoSave() {
+// Called when Maya starts up, and when the user wants to change settings.
+// If the selection script job can't be found, then assume it's startup time & just
+// silently go into the preferred state; otherwise bring up the GUI
+ global int $ajrAS_iTimeJobNo; // The number of the time change script job
+ global int $ajrAS_iSelJobNo; // The number of the select change script job
+ global int $ajrAS_iBackupNumber;
+ global float $ajrAS_fLastSave; // Time of the last save, or script launch
+
+ // If these values are not in the prefs, then set them to the defaults
+ if(! `optionVar -exists "ajrAS_iEnabled"`)
+ optionVar -intValue "ajrAS_iEnabled" off;
+ if(! `optionVar -exists "ajrAS_iSelectTrigger"`)
+ optionVar -intValue "ajrAS_iSelectTrigger" 15;
+ if(! `optionVar -exists "ajrAS_iUseTime"`)
+ optionVar -intValue "ajrAS_iUseTime" on;
+ if(! `optionVar -exists "ajrAS_iSaveCopies"`)
+ optionVar -intValue "ajrAS_iSaveCopies" 5;
+ if(! `optionVar -exists "ajrAS_iNotify"`)
+ optionVar -intValue "ajrAS_iNotify" off;
+ if(! `optionVar -exists "ajrAS_sBackupDir"`)
+ optionVar -stringValue "ajrAS_sBackupDir" "scenes";
+
+ if ($ajrAS_iSelJobNo != 0)
+ ajrAS_GUI;
+ else {
+ $ajrAS_iBackupNumber = 1;
+ $ajrAS_fLastSave = `timerX`;
+ ajrAS_FileMenu;
+ $ajrAS_iTimeJobNo = `scriptJob -event timeChanged ajrAS_CurrentTimeHasChanged`;
+ $ajrAS_iSelJobNo = `scriptJob -event SelectionChanged ajrAS_SelectionHasChanged`;
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/copyToInst.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/copyToInst.mel
new file mode 100644
index 0000000..36fd6f4
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/copyToInst.mel
@@ -0,0 +1,302 @@
+// copyToInst.mel
+// Copy to Instance
+// Alias|Wavefront Script File
+//
+// Creation Date: 24 Jan. 2001
+// Author: (Novy) Gurdarshan Dhillon
+//
+//
+//
+// Description:
+// Copy to Instance
+// Changes duplicated objects to instanced objects
+// The user picks the original object and the list of duplicated
+// objects.
+//
+// Additional Features:
+//
+// Additional Files needed:
+//
+// Input Arguments:
+// None.
+// Return Values:
+// None.
+// copyToInst
+//
+
+global proc copyToInst()
+{
+ global string $copyToInst_orig;
+ global string $copyToInst_new;
+ global string $copyToInst_dup;
+ global string $copyToInst_origButton;
+ global string $copyToInst_newButton;
+ global string $copyToInst_dupButton;
+ global string $copyToInst_check;
+ global string $copyToInst_InstDup;
+ global string $copyToInst_dupName;
+ if (`window -exists copyToInst`)
+ {
+ deleteUI -window copyToInst;
+ }
+ window -title "Copy to Instance" -rtf true -w 590 -h 400 -sizeable true copyToInst;
+ scrollLayout scrollLayout;
+ columnLayout -rs 5;
+ rowColumnLayout -nc 4 -columnWidth 1 80 -columnWidth 2 200 -columnWidth 3 80 -columnWidth 4 200;
+ columnLayout -cw 80 -cat "left" 5;
+ $copyToInst_origButton = `button -label "Add Original" -w 75 -en 1 -command "CTI_addOrig"`;
+ $copyToInst_newButton = `button -label "Add New" -w 75 -en 0 -command "CTI_addNew"`;
+ text -l "";
+ $copyToInst_dupName = `checkBox -label "Get Dup" -v 0`;
+ $copyToInst_check = `checkBox -label "Set Pivots" -v 1`;
+ $copyToInst_InstDup = `checkBox -label "Instance" -v 1`;
+ text -l "off : Duplicate";
+ text -l "on : Instance";
+ setParent ..;
+ columnLayout -cw 200 -cat "left" 0;
+ $copyToInst_orig = `textField -ed 0 -w 200 orig`;
+ $copyToInst_new = `textField -ed 0 -w 200 new`;
+ setParent ..;
+ rowLayout -w 80 -h 50 -nc 1 -cl1 "center";;
+ $copyToInst_dupButton = `button -label "Add Duplicates" -w 80 -en 0 -command "CTI_addDup"`;
+ setParent ..;
+ rowLayout -w 200 -h 300 -nc 1 -cl1 "center";;
+ $copyToInst_dup = `textScrollList -w 200 -h 300 dup`;
+ setParent ..;
+ setParent ..;
+ columnLayout -w 560 -h 100 -cat "left" 5;
+ button -label "Create" -w 550 -en 1 -command "CTI_create";
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ window -edit -w 590 -h 400 copyToInst;
+ showWindow;
+}
+
+global proc CTI_addOrig()
+{
+ global string $copyToInst_orig;
+ global string $copyToInst_dup;
+ global string $copyToInst_origButton;
+ global string $copyToInst_newButton;
+ global string $copyToInst_dupButton;
+
+ string $object[];
+ int $numDup;
+ int $index;
+
+ clear($object);
+ $object = `ls -sl -tr`;
+ textField -edit -tx $object[0] $copyToInst_orig;
+ button -edit -en 1 $copyToInst_newButton;
+ $numDup = `textScrollList -q -ni $copyToInst_dup`;
+ textScrollList -edit -removeAll $copyToInst_dup;
+}
+
+global proc CTI_addNew()
+{
+ global string $copyToInst_new;
+ global string $copyToInst_dup;
+ global string $copyToInst_origButton;
+ global string $copyToInst_newButton;
+ global string $copyToInst_dupButton;
+
+ string $object[];
+ int $numDup;
+ int $index;
+
+ clear($object);
+
+ $object = `ls -sl -tr`;
+ textField -edit -tx $object[0] $copyToInst_new;
+ button -edit -en 1 $copyToInst_dupButton;
+}
+
+global proc CTI_addDup()
+{
+ global string $copyToInst_orig;
+ global string $copyToInst_new;
+ global string $copyToInst_dup;
+ global string $copyToInst_dupName;
+
+ string $object[];
+ string $original;
+ string $new;
+ int $index;
+ textScrollList -edit -removeAll $copyToInst_dup;
+ clear($object);
+ if (`checkBox -q -v $copyToInst_dupName`)
+ { selectInstance `textField -q -tx $copyToInst_orig`;}
+ $object = `ls -sl -tr`;
+ $original = `textField -query -tx $copyToInst_orig`;
+ $new = `textField -query -tx $copyToInst_new`;
+ for ($index=0; $index < size($object); $index++)
+ {
+ if($object[$index]!=$original && $object[$index]!=$new)
+ {
+ textScrollList -edit -append $object[$index] $copyToInst_dup;
+ }
+ }
+ select -clear;
+}
+
+global proc CTI_create()
+{
+ global string $copyToInst_orig;
+ global string $copyToInst_new;
+ global string $copyToInst_dup;
+ global string $copyToInst_check;
+ global string $copyToInst_InstDup;
+ string $objects[];
+ string $inst[];
+ string $inst_new[];
+ string $new;
+ string $original;
+ string $attr;
+ string $attr2;
+ float $orig_pivot[];
+ float $new_pivot[];
+ float $orig_trans[];
+ float $new_trans[];
+ float $trans[];
+
+ float $orig_scale_pivot[];
+ float $new_scale_pivot[];
+ float $orig_scale[];
+ float $new_scale[];
+ float $scale[];
+
+ float $orig_rot[];
+ float $orig_rotx;
+ float $orig_roty;
+ float $orig_rotz;
+ float $rot[];
+ float $x;
+ float $y;
+ float $z;
+ int $index;
+ int $numObj;
+
+ clear($objects); clear($trans); clear($rot); clear($inst); clear($inst_new);
+ clear($orig_pivot); clear($new_pivot); clear($orig_trans); clear($new_trans);
+
+ $original = `textField -query -tx $copyToInst_orig`;
+ $new = `textField -query -tx $copyToInst_new`;
+ $objects = `textScrollList -q -allItems $copyToInst_dup`;
+ $numObj = size($objects);
+ if(`checkBox -q -v $copyToInst_check` == 1)
+ {
+ $orig_pivot = `xform -q -rp $original`;
+ $new_pivot = `xform -q -rp $new`;
+ $orig_trans = `xform -q -t $original`;
+ $new_trans = `xform -q -t $new`;
+
+ $orig_scale_pivot = `xform -q -sp $original`;
+ $new_scale_pivot = `xform -q -sp $new`;
+ $orig_scale = `xform -q -s $original`;
+ $new_scale = `xform -q -s $new`;
+
+ $orig_rot = `xform -q -ro $original`;
+ $orig_rotx = $orig_rot[0];
+ $orig_roty = $orig_rot[1];
+ $orig_rotz = $orig_rot[2];
+// print $orig_trans;
+// print "---------\n";
+// print $new_trans;
+// print "---------\n";
+ }
+ else
+ {
+ $orig_pivot[0] = 0; $orig_pivot[1] = 0; $orig_pivot[2] = 0;
+ $new_pivot[0] = 0; $new_pivot[1] = 0; $new_pivot[2] = 0;
+ $orig_trans[0] = 0; $orig_trans[1] = 0; $orig_trans[2] = 0;
+ $new_trans[0] = 0; $new_trans[1] = 0; $new_trans[2] = 0;
+ $orig_scale_pivot[0] = 0; $orig_scale_pivot[1] = 0; $orig_scale_pivot[2] = 0;
+ $new_scale_pivot[0] = 0; $new_scale_pivot[1] = 0; $new_scale_pivot[2] = 0;
+ $orig_scale[0] = 0; $orig_scale[1] = 0; $orig_scale[2] = 0;
+ $new_scale[0] = 0; $new_scale[1] = 0; $new_scale[2] = 0;
+ $orig_rotx = 0;
+ $orig_roty = 0;
+ $orig_rotz = 0;
+ }
+ for($index=0; $index<$numObj; $index++)
+ {
+ clear($inst);
+ $attr = $objects[$index] + ".translate";
+ $trans = `xform -ws -q -rp $objects[$index]`;
+ $attr = $objects[$index] + ".rotate";
+ $rot = `getAttr $attr`;
+ $attr = $objects[$index] + ".scale";
+ $scale = `getAttr $attr`;
+ if(`checkBox -q -v $copyToInst_InstDup`)
+ { $inst = `instance $new`;}
+ else
+ { $inst = `duplicate $new`;}
+
+ $x = $trans[0] - $new_pivot[0];
+ $y = $trans[1] - $new_pivot[1];
+ $z = $trans[2] - $new_pivot[2];
+ xform -ws -t $x $y $z $inst[0];
+
+ $x = $rot[0] - $orig_rotx ;
+ $y = $rot[1] - $orig_roty;
+ $z = $rot[2] - $orig_rotz;
+ xform -a -ro $x $y $z $inst[0];
+
+ $x = $scale[0];
+ $y = $scale[1];
+ $z = $scale[2];
+ xform -ws -s $x $y $z $inst[0];
+ // $inst[0] = `rename $inst[0] $objects[$index]`;
+ $inst_new[$index] = $inst[0];
+ }
+ if(`checkBox -q -v $copyToInst_InstDup`==0)
+ {
+ for($obj in $inst_new)
+ {
+ string $newName = $obj + "Shape";
+ string $shape[] = `pickWalk -d "down" $obj`;
+ rename $shape[0] $newName;
+ }
+ }
+ if (size($new)>0)
+ {
+ group -n "inst" $inst_new;
+ }
+}
+
+global proc selectInstance(string $origObject)
+{
+ string $orig[];
+ clear($orig);
+ $orig[0] = $origObject;
+ select -r $origObject;
+ string $origShape[];
+ clear($origShape);
+ $origShape = `ls -sl -dag -lf`;
+ string $token[];
+ clear($token);
+ int $numTok;
+ $numTok = `tokenize $origShape[0] "|" $token`;
+// string $select[];
+// clear($select);
+ int $index;
+// int $count;
+// $count = 0;
+// if(`strcmp $orig[0] $token[0]`!=0)
+// { error "No Original Geometry Selected!!";}
+// else
+ {
+ string $objects[]= `ls -tr`;
+ for($object in $objects)
+ {
+ string $objShape[] = `ls -dag -lf $object`;
+ if(`strcmp $origShape[0] $objShape[0]` == 0)
+ {
+ select -add $object;
+ // $select[$count] = $object;
+ // $count++;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceTexture.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceTexture.mel
new file mode 100644
index 0000000..74541f9
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceTexture.mel
@@ -0,0 +1,44 @@
+global proc forceTexture ()
+{
+ for ($shader in `ls -mat`)
+ {
+ if($shader == "lambert1")
+ {
+ continue;
+ }
+ if($shader == "particleCloud1")
+ {
+ continue;
+ }
+
+ string $connections[] = `listConnections ($shader + ".color")`;
+ if(size($connections) > 0)
+ {
+ print ("Ignoring " + $shader + " since it already has a map...\n");
+ continue;
+ }
+ print ("Processing " + $shader + "\n");
+ float $colour[] = `getAttr ($shader + ".color")`;
+ int $colourR = $colour[0] * 255;
+ int $colourG = $colour[1] * 255;
+ int $colourB = $colour[2] * 255;
+ string $mapname = "R" + $colourR + "G" + $colourG + "B" + $colourB;
+ print ("Mapname " + $mapname+ "\n" );
+
+ shadingNode -asTexture ramp -name $mapname;
+ setAttr ($mapname +".colorEntryList[0].color") -type double3 $colour[0] $colour[1] $colour[2];
+ setAttr ($mapname +".colorEntryList[1].color") -type double3 $colour[0] $colour[1] $colour[2];
+ setAttr ($mapname +".colorEntryList[2].color") -type double3 $colour[0] $colour[1] $colour[2];
+ connectAttr ($mapname + ".outColor") ($shader + ".color");
+ if(`nodeType $shader` == "p3dSimpleShader")
+ {
+ setAttr ($shader +".proceduralXRes") 1;
+ setAttr ($shader +".proceduralYRes") 1;
+ }else
+ if(`nodeType $shader` == "lambert")
+ {
+ setAttr ($shader +".p3dProceduralTexXRes") 4;
+ setAttr ($shader +".p3dProceduralTexYRes") 4;
+ }
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel
new file mode 100644
index 0000000..c939c2d
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel
@@ -0,0 +1,381 @@
+//===========================================================================
+// Copyright ©2002 Radical Entertainment Ltd. All rights reserved.
+//
+// Created: 26 March, 2002
+//
+// Description: Forces unique names for all nodes in the scene, and ensures
+// that each Shape node derives its name (and numerical suffix)
+// from its Transform.
+//
+// Constraints:
+//
+// Creator: Bryan Ewert
+//
+//===========================================================================
+
+//===========================================================================
+// version
+//===========================================================================
+// Description: Returns the current version for this MEL script.
+// Used for version control.
+//
+// Constraints:
+//
+//===========================================================================
+proc float version()
+{
+ return ( 1.1 ); // 01 May 2002
+}
+
+//===========================================================================
+// depth
+//===========================================================================
+// Description: Determines the depth of the specified DAG; e.g. the depth
+// for "|group1|transform2|transformShape2" is 3.
+//
+// Constraints:
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (int): The depth of the path.
+//
+//===========================================================================
+proc int depth( string $node )
+{
+ int $depth = 0;
+
+ if ( `objExists $node` )
+ {
+ string $longA[] = `ls -l $node`;
+
+ string $tokens[];
+ $depth = `tokenize $longA[0] "|" $tokens`;
+ }
+
+ return $depth;
+}
+
+//===========================================================================
+// nameNoPath
+//===========================================================================
+// Description: Returns the short name for the specified node.
+// "|group1|transform2|transformShape2" would return
+// "transformShape2"
+//
+// Constraints: The pathless name may not be unique, and may not be
+// sufficient for Maya to resolve the DAG! This name is
+// intended for use in a rename operation, and not for
+// performing edit operations on the object.
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (string): The short path for the node.
+//
+//===========================================================================
+proc string nameNoPath( string $node )
+{
+ return `match "[^|]*$" $node`;
+}
+
+//===========================================================================
+// isUnique
+//===========================================================================
+// Description: Determines if the specified node has a unique name.
+//
+// Constraints:
+//
+// Parameters: string $node: Name of the node (may be full path, may not).
+//
+// Return: (int): TRUE (non-zero) if name is unique; else FALSE (zero).
+//
+//===========================================================================
+proc int isUnique( string $node )
+{
+ int $isUnique = true;
+
+ string $noPath = nameNoPath( $node );
+ string $wildcard = ( "*" + $noPath );
+ string $potentials[] = `ls $wildcard`;
+
+ int $numMatches = 0;
+ for ( $p in $potentials )
+ {
+ string $tokens[];
+ int $numTokens = `tokenize $p "|" $tokens`;
+ if ( $tokens[$numTokens-1] == $noPath )
+ {
+ $numMatches++;
+ }
+ }
+
+ $isUnique = ( $numMatches < 2 );
+
+ return $isUnique;
+}
+
+//===========================================================================
+// getUniqueName
+//===========================================================================
+// Description: Builds a unique name for the specified node by generating
+// a numerical suffix for the node. An existing numerical
+// suffix is stripped and replaced if the node's name is not
+// already unique.
+//
+// Constraints: The returned name does _not_ contain a path and may not be
+// sufficient for Maya to resolve the DAG! This name is
+// intended for use in a rename operation, and not for
+// performing edit operations on the object.
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (string): A unique name for the node.
+//
+//===========================================================================
+proc string getUniqueName( string $node )
+{
+ string $shortNode = nameNoPath( $node );
+ string $unique = $shortNode;
+
+ if ( !isUnique( $shortNode ) )
+ {
+ // strip numeric suffix
+ string $suffix = `match "[0-9]*$" $shortNode`;
+ int $sizeShortNode = `size $shortNode`;
+ int $sizeSuffix = `size $suffix`;
+ $shortNode = `substring $shortNode 1 ( $sizeShortNode - $sizeSuffix )`;
+
+ if ( !`objExists $shortNode` )
+ {
+ $unique = $shortNode;
+ }
+ else
+ {
+ string $newNode;
+ int $u = 1;
+ do
+ {
+ $newNode = ( $shortNode + ($u++) );
+ } while ( `objExists $newNode` );
+
+ $unique = $newNode;
+ }
+ }
+
+ return $unique;
+}
+
+//===========================================================================
+// getShape
+//===========================================================================
+// Description: Returns the shape node, if any, for the specified transform.
+//
+// Constraints: Considers only a single shape.
+//
+// Parameters: string $xform: The transform node.
+//
+// Return: (string): The shape node.
+//
+//===========================================================================
+proc string getShape( string $xform )
+{
+ string $shapes[];
+
+ $shapes[0] = $xform;
+
+ string $isTransform[] = `ls -transforms $xform`;
+
+ if ( `size $isTransform` > 0 )
+ // If given node is not a transform, assume it is a shape
+ // and pass it through
+ {
+ $shapes = `listRelatives -fullPath -shapes $xform`;
+ }
+
+ return $shapes[0];
+}
+
+//===========================================================================
+// getShapeName
+//===========================================================================
+// Description: Derives a name for the shape node given the specified
+// transform name. For example if the $node specified is
+// "pCube23" the shape name will be "pCubeShape23".
+//
+// Constraints: No checking is done to verify that $node is a transform.
+//
+// Parameters: string $node: The name for the transform node.
+//
+// Return: (string): The name for the shape node.
+//
+//===========================================================================
+proc string getShapeName( string $node )
+{
+ string $numeric = `match "[0-9]+$" $node`;
+
+ int $strlen = `size $node`;
+ int $numlen = `size $numeric`;
+ string $alpha = `substring $node 1 ( $strlen - $numlen )`;
+
+ string $shapeName = ( $alpha + "Shape" + $numeric );
+
+ return $shapeName;
+}
+
+//===========================================================================
+// performRename
+//===========================================================================
+// Description: Does the work for the rename operation -- generates unique
+// names for the transform and shape nodes, assesses whether
+// the names are non-unique and, if necessary, renames the
+// nodes.
+//
+// Constraints: Read-only nodes (such as Maya's startup cameras) are a real
+// pain in the keister because there is no way to detect them
+// reliably ('ls -readOnly' doesn't work for this). Currently
+// the workaround is to assess whether my "unique" name is
+// the same as Maya's current name and, if so, don't bother
+// attempting a rename operation.
+//
+// Parameters: string $node: The full path to the node being renamed.
+//
+// Return: (int): TRUE (non-zero) if successful; else FALSE.
+// TRUE doesn't necessary mean it was renamed; it may
+// also mean it did not need to be renamed.
+//
+//===========================================================================
+proc int performRename( string $node )
+{
+ int $bSuccess = false;
+
+ if ( `objExists $node` )
+ {
+ string $unique = getUniqueName( $node );
+ string $shape = getShape( $node );
+
+ if ( $shape != "" )
+ {
+ string $uniqueShape = getShapeName( $unique );
+ if ( $uniqueShape != nameNoPath( $shape ) )
+ {
+ eval( "rename " + $shape + " " + $uniqueShape );
+ }
+ }
+
+ if ( $unique != nameNoPath( $node ) )
+ {
+ eval( "rename " + $node + " " + $unique );
+ }
+
+ $bSuccess = true;
+ }
+
+ return $bSuccess;
+}
+
+//===========================================================================
+// performUniqueNames
+//===========================================================================
+// Description: Recursive procedure for assessing the scene and looping
+// through the transform nodes. The renaming is performed
+// from the top-down, and if a top-level node is renamed the
+// path to its children will no longer be valid. The cheap
+// way around this is to detect an invalid path and signal
+// a recursive call to this function. The number of retries
+// is capped to prevent any possibility of infinite recursion.
+//
+// Constraints:
+//
+// Parameters: int $progress: The current progress; i.e. the number of
+// nodes successfully processed so far.
+// int $retry: Number of retries (recursions) remaining.
+//
+// Return: (none)
+//
+//===========================================================================
+proc performUniqueNames( int $progress, int $retry )
+{
+ $retry = max( $retry, 0 );
+
+ int $bSuccess = true;
+
+ string $transforms[] = `ls -long -transforms`;
+ int $depth[];
+ int $maxDepth = 0;
+
+ for ( $t = 0; $t < `size $transforms`; $t++ )
+ {
+ $depth[$t] = depth( $transforms[$t] );
+ $maxDepth = max( $maxDepth, $depth[$t] );
+ }
+
+ for ( $d = 1; $d <= $maxDepth; $d++ )
+ {
+ for ( $t = 0; $t < `size $transforms`; $t++ )
+ {
+ if ( $depth[$t] == $d )
+ {
+ $bSuccess = performRename( $transforms[$t] ) && $bSuccess;
+
+ if ( $bSuccess ) $progress++;
+ }
+
+ progressWindow -e -progress $progress;
+ }
+ }
+
+ if ( !$bSuccess && $retry ) performUniqueNames( $progress, --$retry );
+}
+
+//===========================================================================
+// forceUniqueNames
+//===========================================================================
+// Description: Entry point for this script.
+//
+// Forces unique names for all nodes in the scene, and ensures
+// that each Shape node derives its name (and numerical suffix)
+// from its Transform.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc forceUniqueNames()
+{
+ int $numRetries = 8;
+
+ waitCursor -state on;
+
+ string $transforms[] = `ls -l -type "transform"`;
+
+ int $allProgress = ( `size $transforms` );
+ int $progress = 0;
+ int $progressThreshold = 256; // no progress window for fewer items.
+
+ if ( $allProgress > $progressThreshold )
+ {
+ progressWindow
+ -ii false // not interruptable, sorry.
+ -min 0
+ -max $allProgress
+ -title "Force Unique Names"
+ -status "Scanning for non-unique names."
+ ;
+ }
+
+ performUniqueNames( $progress, $numRetries );
+
+ if ( $allProgress > $progressThreshold )
+ {
+ progressWindow -endProgress;
+ }
+
+ waitCursor -state off;
+}
+
+
+/*
+source forceUniqueNames; forceUniqueNames;
+*/
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/backfaceoff.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/backfaceoff.bmp
new file mode 100644
index 0000000..cdcf12f
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/backfaceoff.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/movetex.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/movetex.bmp
new file mode 100644
index 0000000..30ae56d
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/movetex.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/optimizetex.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/optimizetex.bmp
new file mode 100644
index 0000000..af78381
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/optimizetex.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/p3d.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/p3d.bmp
new file mode 100644
index 0000000..8e4871e
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/p3d.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelighttool.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelighttool.bmp
new file mode 100644
index 0000000..4025c62
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelighttool.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelitoff.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelitoff.bmp
new file mode 100644
index 0000000..8b08d44
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/prelitoff.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/removetxt.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/removetxt.bmp
new file mode 100644
index 0000000..0cc5661
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/removetxt.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renamesh.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renamesh.bmp
new file mode 100644
index 0000000..f0160a3
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renamesh.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renametex.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renametex.bmp
new file mode 100644
index 0000000..b00e2b5
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/renametex.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/rnd.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/rnd.bmp
new file mode 100644
index 0000000..6ce51cc
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/rnd.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/setshape.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/setshape.bmp
new file mode 100644
index 0000000..7571fdb
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/setshape.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/unique.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/unique.bmp
new file mode 100644
index 0000000..d04b12b
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/unique.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/uvz.bmp b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/uvz.bmp
new file mode 100644
index 0000000..a992bce
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/icons/uvz.bmp
Binary files differ
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelight.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelight.mel
new file mode 100644
index 0000000..6da9772
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelight.mel
@@ -0,0 +1,126 @@
+/*===========================================================================
+ File: mappedPrelight.mel
+ Created: January 28, 2002
+ Author: Harold Westlund
+
+ Copyright (c) 2002 Radical Entertainment, Inc.
+ All rights reserved.
+
+=============================================================================
+
+ This procedure remaps vertex colour of a mesh. Colours within a
+ specified luminance range (low to high) are mapped to the corresponding
+ RGB color. Low-high-RGB sets are passed to this procedure as parater
+ arrays.
+
+ return value:
+ bool = success of this procedure.
+
+===========================================================================*/
+
+global proc int mappedPrelight (
+ float $map_low[],
+ float $map_high[],
+ float $map_red[],
+ float $map_green[],
+ float $map_blue[] )
+{
+ print "Remapping vertex colours.\n";
+
+ int $NUM_MAPS = size( $map_low );
+ if( size( $map_high ) != $NUM_MAPS ||
+ size( $map_red ) != $NUM_MAPS ||
+ size( $map_green ) != $NUM_MAPS ||
+ size( $map_blue ) != $NUM_MAPS )
+ {
+ return false;
+ }
+
+ string $selection[] = `ls -selection`;
+
+ string $mesh[] = `filterExpand -sm 12 -ex true`;
+
+ // Step through all selected meshes
+ for( $i = 0; $i < size($mesh); $i++ )
+ {
+ int $verticesA[] = `polyEvaluate -v ( $mesh[$i] )`;
+ int $numVerts = $verticesA[0];
+ clear $verticesA;
+
+ int $vfIdx = 0;
+ int $viList[];
+ int $fiList[];
+ float $redList[];
+ float $greenList[];
+ float $blueList[];
+
+ // Step through the vertices in the mesh
+ for( $j = 0; $j < $numVerts; $j++ )
+ {
+ // Find the faces which use the current vertex.
+ string $command = " " + $mesh[$i] + ".vtx["+$j+"]";
+ string $s[] = `polyInfo -vf $command`;
+ string $t[];
+ int $tokCount = `tokenize $s[0] $t`;
+ clear $s;
+
+ // Step through the vertexFaces for this vertex
+ for( $k = 2; $k < $tokCount; $k++ )
+ {
+ string $vf = " " + $mesh[$i] + ".vtxFace["+$j+"]["+$t[$k]+"]";
+ float $rgb[] = `polyColorPerVertex -q -r -g -b $vf`;
+ float $red = $rgb[0];
+ float $green = $rgb[1];
+ float $blue = $rgb[2];
+ clear $rgb;
+
+ // Find the lumninance
+ float $y = .299 * $red + .587 * $green + .114 * $blue;
+
+ // Apply the appropriate color maps.
+ int $mIdx;
+ for ( $mIdx = 0; $mIdx < $NUM_MAPS; $mIdx++ )
+ {
+ if ( ($y <= ( $map_high[$mIdx] ) ) &&
+ ($y >= ( $map_low[$mIdx] ) ) )
+ {
+ // Luminance is within specified range
+ $red = $map_red[$mIdx];
+ $green = $map_green[$mIdx];
+ $blue = $map_blue[$mIdx];
+
+ // Write color back to vertexFace
+// polyColorPerVertex -e -rgb $red $green $blue $vf;
+ break;
+ }
+ }
+ $viList[$vfIdx] = $j;
+ $fiList[$vfIdx] = $t[$k];
+ $redList[$vfIdx] = $red;
+ $greenList[$vfIdx] = $green;
+ $blueList[$vfIdx] = $blue;
+
+ $vfIdx++;
+
+ }
+ clear $t;
+
+ }
+ // Use the collected information to colour the mesh.
+ polyColorPerVertexArray( $viList, $fiList, $redList,
+ $greenList, $blueList, $mesh[$i] );
+ clear $viList;
+ clear $fiList;
+ clear $redList;
+ clear $greenList;
+ clear $blueList;
+ }
+ clear $mesh;
+
+ select $selection;
+
+ print "Finished remapping.\n";
+
+ return true;
+}
+
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelightWindow.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelightWindow.mel
new file mode 100644
index 0000000..c3b39cb
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/mappedPrelightWindow.mel
@@ -0,0 +1,1118 @@
+/*===========================================================================
+ File: mappedPrelightWindow.mel
+ Created: January 28, 2002
+ Author: Harold Westlund
+
+ Copyright (c) 2002 Radical Entertainment, Inc.
+ All rights reserved.
+
+ Updated: April 12, 2002
+ Version: 1.2.0
+
+=============================================================================
+
+ mappedPrelightWindow is the user interface for mappedPrelight.
+
+ This program provides a means to map from a specified cbv brightness
+ range to another colour. Up to six maps may be specifed and used in
+ any combination.
+
+===========================================================================*/
+
+// Gather global data from other functions and apply to the window.
+global proc P3Dmp_updateAllMappedPrelightGlobal( int $mpNumMaps )
+{
+ // Prepare for forced min value if checked.
+ P3Dmp_forceValues ( $mpNumMaps );
+}
+
+
+// Add Context Sensitive Help
+global proc P3Dmp_buildMappedPrelightContextHelpItems(string $nameRoot, string $menuParent)
+{
+ menuItem -label "Help on Mapped Prelight..."
+ -enableCommandRepeat false
+ -command "showHelp -d \"UserGuide/ModelingPoly/PolyColoring3.html\"";
+}
+
+// Prelight the selected object using default options.
+global proc P3Dmp_performPrelight ()
+{
+ toggleMaterialMapping(0);
+ polyGeoSampler
+ -sf 0
+ -su
+ -colorBlend overwrite
+ -alphaBlend overwrite;
+ toggleMaterialMapping(1);
+}
+
+// Prelight conditional upon prelight checkbox being checked
+// Either way, set the persistent data.
+global proc P3Dmp_conditionalPerformPrelight ()
+{
+ int $usePrelight;
+ $usePrelight = `checkBox -q -v performPrelightCheckBox`;
+ optionVar -intValue P3D_mpPerformPrelight $usePrelight;
+
+ if ($usePrelight)
+ {
+ print "Performing prelight\n";
+
+ P3Dmp_performPrelight();
+ }
+}
+
+//==================================================================
+//
+// Modify the UI through interaction
+//
+//==================================================================
+
+// Force the minimum value of one map to be the maximum value
+// of the previous map.
+global proc P3Dmp_forceValues ( int $mapID )
+{
+ int $forceMinValue;
+ $forceMinValue = `checkBox -q -v forceMinValueCheckBox`;
+
+ int $lastMapUsed = 0;
+
+ // Check every map's UI settings
+ int $i;
+ for( $i = 1; $i <= $mapID; $i++ )
+ {
+ if( $forceMinValue == true )
+ {
+ int $mapUse;
+ $mapUse = `checkBox -q -v ( "mpMap" + $i + "CheckBox" )`;
+ if($mapUse)
+ {
+ // Nothing is done to the first map in use.
+ // Other maps have the min set to the max of the
+ // last in use map, and then the min is disabled.
+ if( $lastMapUsed != 0 )
+ {
+ float $mapMin = `floatField -q -v ("mpMap" + $lastMapUsed + "MaxField")`;
+ floatField -edit -v $mapMin ("mpMap" + $i + "MinField");
+ floatField -edit -enable 0 ("mpMap" + $i + "MinField");
+ }
+ else
+ {
+ floatField -edit -enable 1 ("mpMap" + $i + "MinField");
+ }
+
+ $lastMapUsed = $i;
+ }
+
+ }
+ else
+ {
+ int $mapUse;
+ $mapUse = `checkBox -q -v ( "mpMap" + $i + "CheckBox" )`;
+ if($mapUse)
+ {
+
+ floatField -edit -enable 1 ("mpMap" + $i + "MinField");
+ }
+
+ }
+ }
+}
+
+// Turn a particular map on or off.
+global proc P3Dmp_changeMapUse ( int $mapID )
+{
+ string $mapName = ( "mpMap" + $mapID );
+
+ string $checkBox = ( $mapName + "CheckBox" );
+
+ string $layout = ( $mapName + "DetailsLayout" );
+
+ int $isOn = `checkBox -q -v $checkBox`;
+
+ // Now enable or disable the map.
+ columnLayout -edit
+ -enable $isOn
+ $layout;
+
+ // Changing the map use will affect forced minimums.
+ P3Dmp_forceValues ( $mapID );
+}
+
+// Apply the numeric RGB values to the colour slider.
+global proc P3Dmp_changeMapRGB ( int $mapID, string $srcDst)
+{
+ string $mapName = ( "mpMap" + $mapID + $srcDst );
+
+ string $RedField = ( $mapName + "RedField" );
+ string $GreenField = ( $mapName + "GreenField" );
+ string $BlueField = ( $mapName + "BlueField" );
+
+ float $red, $green, $blue;
+ $red = `floatField -q -v $RedField`;
+ $green = `floatField -q -v $GreenField`;
+ $blue = `floatField -q -v $BlueField`;
+
+ colorSliderButtonGrp -edit
+ -rgbValue $red $green $blue
+ ( $mapName + "ColorSlider" );
+}
+
+// Apply the colour slider values to the numeric RGB values.
+global proc P3Dmp_changeMapRGBSlider ( int $mapID, string $srcDst )
+{
+ string $mapName = ( "mpMap" + $mapID + $srcDst );
+
+ float $rgb[3];
+
+ $rgb = `colorSliderButtonGrp -q -rgbValue ( $mapName + "ColorSlider" )`;
+
+ string $RedField = ( $mapName + "RedField" );
+ string $GreenField = ( $mapName + "GreenField" );
+ string $BlueField = ( $mapName + "BlueField" );
+
+ $red = `floatField -edit -v ( $rgb[0] ) $RedField`;
+ $green = `floatField -edit -v ( $rgb[1] ) $GreenField`;
+ $blue = `floatField -edit -v ( $rgb[2] ) $BlueField`;
+
+ clear $rgb;
+}
+
+// Apply the prelight maps in the range specified to the selected objects.
+global proc P3Dmp_applyPrelightMaps( int $minMapNum, int $maxMapNum )
+{
+ int $i;
+ int $numMapsInUse;
+ float $mapsMin[], $mapsMax[];
+ float $mapsRed[], $mapsGreen[], $mapsBlue[];
+ float $mapMin, $mapMax;
+ float $mapRed, $mapGreen, $mapBlue;
+
+ waitCursor -state on;
+
+ for( $i = $minMapNum; $i <= $maxMapNum; $i++ )
+ {
+ string $mapName = ( "mpMap" + $i );
+ int $mapUse;
+
+ string $checkBox = ( $mapName + "CheckBox" );
+ string $MinField = ( $mapName + "MinField" );
+ string $MaxField = ( $mapName + "MaxField" );
+ string $RedField = ( $mapName + "SrcRedField" );
+ string $GreenField = ( $mapName + "SrcGreenField" );
+ string $BlueField = ( $mapName + "SrcBlueField" );
+
+ $mapUse = `checkBox -q -v $checkBox`;
+ $mapMin = `floatField -q -v $MinField`;
+ $mapMax = `floatField -q -v $MaxField`;
+ $mapRed = `floatField -q -v $RedField`;
+ $mapGreen = `floatField -q -v $GreenField`;
+ $mapBlue = `floatField -q -v $BlueField`;
+
+ if ($mapUse)
+ {
+ $mapsMin[$numMapsInUse] = $mapMin;
+ $mapsMax[$numMapsInUse] = $mapMax;
+ $mapsRed[$numMapsInUse] = $mapRed;
+ $mapsGreen[$numMapsInUse] = $mapGreen;
+ $mapsBlue[$numMapsInUse] = $mapBlue;
+
+ $numMapsInUse++;
+ }
+
+ string $varName = ( "P3D_" + $mapName );
+ optionVar -intValue ( $varName + "Use" ) $mapUse;
+ optionVar -floatValue ( $varName + "Min" ) $mapMin;
+ optionVar -floatValue ( $varName + "Max" ) $mapMax;
+ optionVar -floatValue ( $varName + "SrcRed" ) $mapRed;
+ optionVar -floatValue ( $varName + "SrcGreen" ) $mapGreen;
+ optionVar -floatValue ( $varName + "SrcBlue" ) $mapBlue;
+
+ }
+
+ // Perform prelighting if selected
+ P3Dmp_conditionalPerformPrelight();
+
+ // Store current UI settings
+ int $forceMinValue, $useAveSides;
+ $forceMinValue = `checkBox -q -v forceMinValueCheckBox`;
+ $useAveSides = `checkBox -q -v useAverageSideCheckBox`;
+ optionVar -intValue P3D_mpforceMinValue $forceMinValue;
+ optionVar -intValue P3D_mpUseAveSides $useAveSides;
+
+ if( $useAveSides )
+ {
+ mappedAvePrelight $mapsMin $mapsMax $mapsRed $mapsGreen $mapsBlue;
+ }
+ else {
+ mappedPrelight $mapsMin $mapsMax $mapsRed $mapsGreen $mapsBlue;
+ }
+
+ clear $mapsMin;
+ clear $mapsMax;
+ clear $mapsRed;
+ clear $mapsGreen;
+ clear $mapsBlue;
+
+ waitCursor -state off;
+}
+
+// Apply the colour maps in the range specified to the selected objects.
+global proc P3Dmp_applyColourMaps( int $minMapNum, int $maxMapNum, int $forward )
+{
+ int $i;
+ int $numMapsInUse;
+ float $mapsTolerance[];
+ float $mapsSrcRed[], $mapsSrcGreen[], $mapsSrcBlue[];
+ float $mapsDstRed[], $mapsDstGreen[], $mapsDstBlue[];
+ float $mapTolerance;
+ float $mapSrcRed, $mapSrcGreen, $mapSrcBlue;
+ float $mapDstRed, $mapDstGreen, $mapDstBlue;
+
+ waitCursor -state on;
+
+ for( $i = $minMapNum; $i <= $maxMapNum; $i++ )
+ {
+ string $mapName = ( "mpMap" + $i );
+ int $mapUse;
+
+ string $checkBox = ( $mapName + "CheckBox" );
+ string $SrcRedField = ( $mapName + "SrcRedField" );
+ string $SrcGreenField = ( $mapName + "SrcGreenField" );
+ string $SrcBlueField = ( $mapName + "SrcBlueField" );
+ string $ToleranceField = ( $mapName + "ToleranceField" );
+ string $DstRedField = ( $mapName + "DstRedField" );
+ string $DstGreenField = ( $mapName + "DstGreenField" );
+ string $DstBlueField = ( $mapName + "DstBlueField" );
+
+ $mapUse = `checkBox -q -v $checkBox`;
+ $mapSrcRed = `floatField -q -v $SrcRedField`;
+ $mapSrcGreen = `floatField -q -v $SrcGreenField`;
+ $mapSrcBlue = `floatField -q -v $SrcBlueField`;
+ $mapTolerance = `floatField -q -v $ToleranceField`;
+ $mapDstRed = `floatField -q -v $DstRedField`;
+ $mapDstGreen = `floatField -q -v $DstGreenField`;
+ $mapDstBlue = `floatField -q -v $DstBlueField`;
+
+ if ($mapUse)
+ {
+ $mapsSrcRed[$numMapsInUse] = $mapSrcRed;
+ $mapsSrcGreen[$numMapsInUse] = $mapSrcGreen;
+ $mapsSrcBlue[$numMapsInUse] = $mapSrcBlue;
+ $mapsTolerance[$numMapsInUse] = $mapTolerance;
+ $mapsDstRed[$numMapsInUse] = $mapDstRed;
+ $mapsDstGreen[$numMapsInUse] = $mapDstGreen;
+ $mapsDstBlue[$numMapsInUse] = $mapDstBlue;
+
+ $numMapsInUse++;
+ }
+
+ string $varName = ( "P3D_" + $mapName );
+ optionVar -intValue ( $varName + "Use" ) $mapUse;
+ optionVar -floatValue ( $varName + "SrcRed" ) $mapSrcRed;
+ optionVar -floatValue ( $varName + "SrcGreen" ) $mapSrcGreen;
+ optionVar -floatValue ( $varName + "SrcBlue" ) $mapSrcBlue;
+ optionVar -floatValue ( $varName + "Tolerance" ) $mapTolerance;
+ optionVar -floatValue ( $varName + "DstRed" ) $mapDstRed;
+ optionVar -floatValue ( $varName + "DstGreen" ) $mapDstGreen;
+ optionVar -floatValue ( $varName + "DstBlue" ) $mapDstBlue;
+
+ }
+
+ // Do the action
+ if( $forward == 1 )
+ {
+ mappedColour $mapsSrcRed $mapsSrcGreen $mapsSrcBlue $mapsDstRed $mapsDstGreen $mapsDstBlue $mapsTolerance;
+ }
+ else
+ {
+ mappedColour $mapsDstRed $mapsDstGreen $mapsDstBlue $mapsSrcRed $mapsSrcGreen $mapsSrcBlue $mapsTolerance;
+ }
+
+ clear $mapsSrcRed;
+ clear $mapsSrcGreen;
+ clear $mapsSrcBlue;
+ clear $mapsTolerance;
+ clear $mapsDstRed;
+ clear $mapsDstGreen;
+ clear $mapsDstBlue;
+
+ waitCursor -state off;
+}
+
+// Deselect all maps and set their colour values to zero.
+global proc P3Dmp_resetAllValues ( int $mpNumMaps )
+{
+ string $cancel = `confirmDialog -message "Reset map values to zero. Are you sure?"
+ -button "Yes" -button "No"
+ -defaultButton "No" -cancelButton "No" -dismissString "No"`;
+
+ if ($cancel == "No")
+ return;
+
+ int $i;
+
+ for( $i = 1; $i <= $mpNumMaps; $i++ )
+ {
+ string $mapName = ( "mpMap" + $i );
+ int $mapUse;
+
+ string $checkBox = ( $mapName + "CheckBox" );
+ string $MinField = ( $mapName + "MinField" );
+ string $MaxField = ( $mapName + "MaxField" );
+ string $SrcRedField = ( $mapName + "SrcRedField" );
+ string $SrcGreenField = ( $mapName + "SrcGreenField" );
+ string $SrcBlueField = ( $mapName + "SrcBlueField" );
+ string $ToleranceField = ( $mapName + "ToleranceField" );
+ string $DstRedField = ( $mapName + "DstRedField" );
+ string $DstGreenField = ( $mapName + "DstGreenField" );
+ string $DstBlueField = ( $mapName + "DstBlueField" );
+
+ checkBox -edit -v 0 $checkBox;
+ floatField -edit -v 0 $MinField;
+ floatField -edit -v 0 $MaxField;
+ floatField -edit -v 0 $SrcRedField;
+ floatField -edit -v 0 $SrcGreenField;
+ floatField -edit -v 0 $SrcBlueField;
+ floatField -edit -v 0.01 $ToleranceField;
+ floatField -edit -v 0 $DstRedField;
+ floatField -edit -v 0 $DstGreenField;
+ floatField -edit -v 0 $DstBlueField;
+
+ P3Dmp_changeMapUse ( $i );
+ P3Dmp_changeMapRGB ( $i, "Src" );
+ P3Dmp_changeMapRGB ( $i, "Dst" );
+
+ string $varName = ( "P3D_" + $mapName );
+ optionVar -intValue ( $varName + "Use" ) 0;
+ optionVar -floatValue ( $varName + "Min" ) 0;
+ optionVar -floatValue ( $varName + "Max" ) 0;
+ optionVar -floatValue ( $varName + "SrcRed" ) 0;
+ optionVar -floatValue ( $varName + "SrcGreen" ) 0;
+ optionVar -floatValue ( $varName + "SrcBlue" ) 0;
+ optionVar -floatValue ( $varName + "Tolerance" ) 0.01;
+ optionVar -floatValue ( $varName + "DstRed" ) 0;
+ optionVar -floatValue ( $varName + "DstGreen" ) 0;
+ optionVar -floatValue ( $varName + "DstBlue" ) 0;
+ }
+}
+
+//==================================================================
+//
+// File IO
+//
+//==================================================================
+
+// Read in a colour map from file.
+global proc P3Dmp_openColourMap ( int $mpNumMaps, string $srcDst, string $fileName, string $fileType )
+{
+ if( $fileName == "" )
+ {
+ print ("Open cancelled.\n");
+ return; // Dialogue cancelled
+ }
+ print ("Retrieving map.\n");
+
+ int $i;
+
+ int $n_lines;
+ string $lines[];
+ int $fileId = `fopen $fileName "r"`;
+
+ if ( $fileId != 0 )
+ {
+ // Store each valid data line of the file in array.
+ string $nextLine = `fgetline $fileId`;
+ while( size( $nextLine ) > 0 )
+ {
+ // Discard comments and blank lines
+ string $ch = `substring $nextLine 1 1`;
+ if( $ch != "#" && $ch != "\n" )
+ {
+ $lines[$n_lines] = $nextLine;
+ $n_lines++;
+ }
+
+ // Get the next line
+ $nextLine = `fgetline $fileId`;
+ }
+ fclose($fileId);
+ }
+ else
+ {
+ print ("Unable to read from " + $fileName + "\n");
+ return;
+ }
+
+ int $maxMapNumber = $lines[0];
+
+ // Ensure that the correct number of valid lines were read.
+ if( ( $maxMapNumber * 3 ) != ( $n_lines - 1 ) )
+ {
+ warning -sl true ( "Invalid data in file: " + $fileName );
+ warning "Map not loaded";
+
+ return;
+ }
+
+ int $mapUse[];
+ float $mapMin[], $mapMax[], $mapTolerance[];
+ float $mapRed[], $mapGreen[], $mapBlue[];
+ int $lineNumber = 1;
+ int $readError = false;
+
+ // Read in the data for each map.
+ // Perform simple check for data format error.
+ for( $i = 1; $i <= $maxMapNumber; $i++ )
+ {
+ $mapUse[$i] = $lines[$lineNumber++];
+
+ string $minmax[];
+ tokenize $lines[$lineNumber++] $minmax;
+ if( size($minmax) != 2 && size($minmax) != 3 )
+ {
+ $readError = true;
+ break;
+ }
+
+ $mapMin[$i] = $minmax[0];
+ $mapMax[$i] = $minmax[1];
+ if( size($minmax) == 2 )
+ {
+ $mapTolerance[$i] = 0.01;
+ }
+ else
+ {
+ $mapTolerance[$i] = $minmax[2];
+ }
+
+ clear $minmax;
+
+ string $rgb[];
+ tokenize $lines[$lineNumber++] $rgb;
+ if( size($rgb) != 3 )
+ {
+ $readError = true;
+ break;
+ }
+ $mapRed[$i] = $rgb[0];
+ $mapGreen[$i] = $rgb[1];
+ $mapBlue[$i] = $rgb[2];
+ clear $rgb;
+ }
+ if( $readError )
+ {
+ warning -sl true ( "Invalid data in file: " + $fileName );
+ warning "Map not loaded";
+
+ return;
+ }
+
+ clear $lines;
+
+ // Now update the UI and Maya's persistent data.
+ for( $i = 1; $i <= $maxMapNumber; $i++ )
+ {
+ string $mapName = ( "mpMap" + $i );
+ string $mapName2 = ( $mapName + $srcDst );
+ string $varName = ( "P3D_" + $mapName );
+ string $varName2 = ( $varName + $srcDst );
+
+ if( $srcDst == "Src" )
+ {
+ optionVar -intValue ( $varName + "Use" ) $mapUse[$i];
+ optionVar -floatValue ( $varName + "Min" ) $mapMin[$i];
+ optionVar -floatValue ( $varName + "Max" ) $mapMax[$i];
+ optionVar -floatValue ( $varName + "Tolerance" ) $mapTolerance[$i];
+ }
+ optionVar -floatValue ( $varName2 + "Red" ) $mapRed[$i];
+ optionVar -floatValue ( $varName2 + "Green" ) $mapGreen[$i];
+ optionVar -floatValue ( $varName2 + "Blue" ) $mapBlue[$i];
+
+ if( $srcDst == "Src" )
+ {
+ checkBox -edit -v ( $mapUse[$i] ) ( $mapName + "CheckBox" );
+ floatField -edit -v ( $mapMin[$i] ) ( $mapName + "MinField" );
+ floatField -edit -v ( $mapMax[$i] ) ( $mapName + "MaxField" );
+ floatField -edit -v ( $mapTolerance[$i] ) ( $mapName + "ToleranceField" );
+ }
+ floatField -edit -v ( $mapRed[$i] ) ( $mapName2 + "RedField" );
+ floatField -edit -v ( $mapGreen[$i] ) ( $mapName2 + "GreenField" );
+ floatField -edit -v ( $mapBlue[$i] ) ( $mapName2 + "BlueField" );
+ P3Dmp_changeMapUse ( $i );
+ P3Dmp_changeMapRGB ( $i, $srcDst );
+ }
+
+ clear $mapUse;
+ clear $mapMin;
+ clear $mapMax;
+ clear $mapTolerance;
+ clear $mapRed;
+ clear $mapGreen;
+ clear $mapBlue;
+
+ print ("Open complete.\n");
+}
+
+// Write out a colour map to file.
+global proc P3Dmp_saveColourMap ( int $mpNumMaps, string $srcDst, string $fileName, string $fileType )
+{
+ if( $fileName == "" )
+ {
+ print ("Save cancelled.\n");
+ return; // Dialogue cancelled
+ }
+ print ("Saving map.\n");
+
+ int $i;
+
+ int $fileId = `fopen $fileName "w"`;
+
+ if ( $fileId != 0 )
+ {
+ // Save out the descriptive information
+ string $username = strip( `system "echo %USERNAME%"` );
+ string $date = strip( `system "date /t"` );
+ string $time = strip( `system "time /t"` );
+ fprint $fileId ( "## Generated by " + $username + "\r\n" );
+ fprint $fileId ( "## on " + $date + "\r\n" );
+ fprint $fileId ( "## at " + $time + "\r\n" );
+ fprint $fileId ( "##\r\n" );
+ fprint $fileId ( "## This file contains the map specifications for the\r\n" );
+ fprint $fileId ( "## Maya mappedPrelightWindow mel script.\r\n" );
+ fprint $fileId ( "##\r\n" );
+
+ // Save the number of maps.
+ fprint $fileId ( "# Number of maps\r\n" );
+ fprint $fileId ( "" + $mpNumMaps + "\r\n" );
+
+ for( $i = 1; $i <= $mpNumMaps; $i++ )
+ {
+ string $mapName = ( "mpMap" + $i );
+ string $mapName2 = ( $mapName + $srcDst );
+
+ int $mapUse;
+ float $mapMin, $mapMax, $tolerance;
+ float $mapRed, $mapGreen, $mapBlue;
+
+ $mapUse = `checkBox -q -v ( $mapName + "CheckBox" )`;
+ $mapMin = `floatField -q -v ( $mapName + "MinField" )`;
+ $mapMax = `floatField -q -v ( $mapName + "MaxField" )`;
+ $mapTolerance = `floatField -q -v ( $mapName + "ToleranceField" )`;
+ $mapRed = `floatField -q -v ( $mapName2 + "RedField" )`;
+ $mapGreen = `floatField -q -v ( $mapName2 + "GreenField" )`;
+ $mapBlue = `floatField -q -v ( $mapName2 + "BlueField" )`;
+
+ // Write out the information for this map.
+ fprint $fileId ( "\r\n" );
+ fprint $fileId ( "## Map " + $i + "\r\n" );
+ fprint $fileId ( "# UseMap\r\n" );
+ fprint $fileId ( "" + $mapUse + "\r\n" );
+ fprint $fileId ( "# Min Max Tolerance\r\n" );
+ fprint $fileId ( "" + $mapMin + " " + $mapMax +
+ " " + $mapTolerance + "\r\n" );
+ fprint $fileId ( "# Red Green Blue\r\n" );
+ fprint $fileId ( "" + $mapRed + " " + $mapGreen +
+ " " + $mapBlue + "\r\n" );
+
+ // Save the to Maya's persistent data
+ string $varName = ( "P3D_" + $mapName );
+ string $varName2 = ( "P3D_" + $mapName2 );
+
+ // Save the data to persistent variables
+ optionVar -intValue ( $varName + "Use" ) $mapUse;
+ optionVar -floatValue ( $varName + "Min" ) $mapMin;
+ optionVar -floatValue ( $varName + "Max" ) $mapMax;
+ optionVar -floatValue ( $varName + "Tolerance" ) $mapTolerance;
+ optionVar -floatValue ( $varName2 + "Red" ) $mapRed;
+ optionVar -floatValue ( $varName2 + "Green" ) $mapGreen;
+ optionVar -floatValue ( $varName2 + "Blue" ) $mapBlue;
+ }
+ fclose($fileId);
+ }
+ else
+ {
+ print ("Unable to write to " + $fileName + "\n");
+ return;
+ }
+
+ print ("Save complete.\n");
+}
+
+//==================================================================
+//
+// Starting the UI creation section
+//
+//==================================================================
+
+proc createSamplingOptions ( string $parent )
+{
+ setUITemplate -pushTemplate attributeEditorTemplate;
+ setParent $parent;
+
+ // Place sampling options here.
+
+ setParent ..;
+ setUITemplate -popTemplate;
+}
+
+proc createBasicPrelight ()
+{
+ setUITemplate -pushTemplate attributeEditorTemplate;
+
+ columnLayout
+ -adjustableColumn true
+ mpCreateBasicPrelightLayout;
+ {
+ columnLayout -rs 5-cat "left" 150;
+ {
+ int $performPrelight;
+ if ( `optionVar -exists P3D_mpPerformPrelight` )
+ $performPrelight = `optionVar -q P3D_mpPerformPrelight `;
+ checkBox
+ -value $performPrelight
+ -al left
+ -w 200
+ -label "Prelight on each Apply"
+ performPrelightCheckBox;
+ button
+ -label " Prelight "
+ -height 22
+ -command P3Dmp_performPrelight
+ mpPrelightButton;
+ } setParent ..;
+ } setParent ..;
+
+ setUITemplate -popTemplate;
+}
+
+// Create the UI for one map.
+proc createMapLayout ( int $mapID, int $mpNumMaps )
+{
+ setUITemplate -pushTemplate attributeEditorTemplate;
+
+ string $mapName = ( "mpMap" + $mapID );
+ float $rgbWidth = 45;
+ float $toleranceWidth = 30;
+ float $buttonWidth = 20;
+
+ rowColumnLayout -numberOfColumns 2
+ -rat 1 "top" 5
+ -co 1 "left" 5
+ -columnWidth 1 65
+ -cal 2 "left"
+ -columnWidth 2 500
+ ( $mapName + "Layout" );
+
+ {
+ string $checkCallback = ( "P3Dmp_changeMapUse (" + $mapID + ");" +
+ "P3Dmp_forceValues (" + $mpNumMaps + ")" );
+
+ int $mapUse=0;
+ float $mapMin=0, $mapMax=0;
+ float $mapSrcRed=0, $mapSrcGreen=0, $mapSrcBlue=0;
+ float $mapTolerance=0.01;
+ float $mapDstRed=0, $mapDstGreen=0, $mapDstBlue=0;
+
+ string $varName = ( "P3D_" + $mapName );
+ if ( `optionVar -exists ( $varName + "Use" ) ` )
+ $mapUse = `optionVar -q ( $varName + "Use" ) `;
+ if ( `optionVar -exists ( $varName + "Min" ) ` )
+ $mapMin = `optionVar -q ( $varName + "Min" ) `;
+ if ( `optionVar -exists ( $varName + "Max" ) ` )
+ $mapMax = `optionVar -q ( $varName + "Max" ) `;
+ if ( `optionVar -exists ( $varName + "SrcRed" ) ` )
+ $mapSrcRed = `optionVar -q ( $varName + "SrcRed" ) `;
+ if ( `optionVar -exists ( $varName + "SrcGreen" ) ` )
+ $mapSrcGreen = `optionVar -q ( $varName + "SrcGreen" ) `;
+ if ( `optionVar -exists ( $varName + "SrcBlue" ) ` )
+ $mapSrcBlue = `optionVar -q ( $varName + "SrcBlue" ) `;
+ if ( `optionVar -exists ( $varName + "Tolerance" ) ` )
+ $mapTolerance = `optionVar -q ( $varName + "Tolerance" ) `;
+ if ( `optionVar -exists ( $varName + "DstRed" ) ` )
+ $mapDstRed = `optionVar -q ( $varName + "DstRed" ) `;
+ if ( `optionVar -exists ( $varName + "DstGreen" ) ` )
+ $mapDstGreen = `optionVar -q ( $varName + "DstGreen" ) `;
+ if ( `optionVar -exists ( $varName + "DstBlue" ) ` )
+ $mapDstBlue = `optionVar -q ( $varName + "DstBlue" ) `;
+
+ checkBox
+ -v $mapUse
+ -label ( "Map " + $mapID + ":" )
+ -cc ( $checkCallback )
+ ( $mapName + "CheckBox" );
+
+ columnLayout
+ -adjustableColumn true
+ -rs 3
+ ( $mapName + "DetailsLayout" );
+ {
+ rowColumnLayout -numberOfColumns 10
+ -columnOffset 1 "left" 10
+ -columnWidth 1 ( $rgbWidth + 10 )
+ -columnWidth 2 $rgbWidth
+ -columnOffset 3 "left" 5
+ -columnWidth 3 ( $buttonWidth + 10 )
+ -columnOffset 3 "right" 5
+ -columnWidth 4 $rgbWidth
+ -columnWidth 5 $rgbWidth
+ -columnWidth 6 $rgbWidth
+ -columnWidth 7 ( $buttonWidth + $toleranceWidth + $buttonWidth + 10 )
+ -columnWidth 8 $rgbWidth
+ -columnWidth 9 $rgbWidth
+ -columnWidth 10 ( $rgbWidth + 10 )
+ -columnOffset 10 "right" 10
+ ( $mapName + "SelectSubLayout" );
+ {
+ text -al "center" "Min (0-1)";
+ text -al "center" "Max (0-1)";
+ text -al "center" " ";
+ text -l "Red" -al "center" "SrcRed";
+ text -l "Green" -al "center" "SrcGreen";
+ text -l "Blue" -al "center" "SrcBlue";
+ text -al "center" "Tolerance";
+ text -l "Red" -al "center" "DstRed";
+ text -l "Green" -al "center" "DstGreen";
+ text -l "Blue" -al "center" "DstBlue";
+
+ string $minMaxCallback = ( "P3Dmp_forceValues (" + $mpNumMaps + ")" );
+ string $srcRGBCallback = ( "P3Dmp_changeMapRGB ( " + $mapID + ", \"Src\"" + " )" );
+ string $dstRGBCallback = ( "P3Dmp_changeMapRGB ( " + $mapID + ", \"Dst\"" + " )" );
+ string $buttonCallback = ( "P3Dmp_applyPrelightMaps ( " + $mapID + ", " + $mapID + ")" );
+ string $forwardCallback = ( "P3Dmp_applyColourMaps ( " + $mapID + ", " + $mapID + ", 1 )" );
+ string $backwardCallback = ( "P3Dmp_applyColourMaps ( " + $mapID + ", " + $mapID + ", 0 )" );
+
+ floatField -value $mapMin
+ -cc $minMaxCallback
+ ( $mapName + "MinField" );
+ floatField -value $mapMax
+ -cc $minMaxCallback
+ ( $mapName + "MaxField" );
+ button -l "=>" -c $buttonCallback
+ ( $mapName + "ApplyUpToMap" );
+ floatField -value $mapSrcRed -cc $srcRGBCallback
+ ( $mapName + "SrcRedField" );
+ floatField -value $mapSrcGreen -cc $srcRGBCallback
+ ( $mapName + "SrcGreenField" );
+ floatField -value $mapSrcBlue -cc $srcRGBCallback
+ ( $mapName + "SrcBlueField" );
+
+ rowColumnLayout -numberOfColumns 3
+ -columnOffset 1 "left" 5
+ -columnWidth 1 ( $buttonWidth + 5 )
+ -columnWidth 2 $toleranceWidth
+ -columnWidth 3 ( $buttonWidth + 5 )
+ -columnOffset 3 "right" 5
+ ( $mapName + "ToleranceSubLayout" );
+ {
+ button -l "<-" -c $backwardCallback
+ ( $mapName + "ApplyForward" );
+ floatField -value $mapTolerance
+ ( $mapName + "ToleranceField" );
+ button -l "->" -c $forwardCallback
+ ( $mapName + "ApplyBackward" );
+ } setParent ..;
+
+ floatField -value $mapDstRed -cc $dstRGBCallback
+ ( $mapName + "DstRedField" );
+ floatField -value $mapDstGreen -cc $dstRGBCallback
+ ( $mapName + "DstGreenField" );
+ floatField -value $mapDstBlue -cc $dstRGBCallback
+ ( $mapName + "DstBlueField" );
+
+ } setParent ..; // rowColumnLayout -numberOfColumns 10
+
+ rowColumnLayout -numberOfColumns 2
+ -columnOffset 1 "left" 0
+ -columnWidth 1 325
+ -columnWidth 2 300
+ -columnOffset 2 "right" 10
+ ( $mapName + "ColorsSublayout" );
+ {
+ string $srcColorSliderCallback = ( "P3Dmp_changeMapRGBSlider (" + $mapID + ", \"Src\"" + ")" );
+ string $dstColorSliderCallback = ( "P3Dmp_changeMapRGBSlider (" + $mapID + ", \"Dst\"" + ")" );
+ colorSliderButtonGrp
+ -rgbValue $mapSrcRed $mapSrcGreen $mapSrcBlue
+ -cat 1 "left" 115
+ -cw 1 10
+ -cw 2 50
+ -cw 3 115
+ -cat 4 "left" 500
+ -cw 4 180
+ -label ""
+ -symbolButtonDisplay false
+ -cc $srcColorSliderCallback
+ ( $mapName + "SrcColorSlider" );
+ colorSliderButtonGrp
+ -rgbValue $mapDstRed $mapDstGreen $mapDstBlue
+ -cw 1 10
+ -cw 2 50
+ -cw 3 115
+ -cat 4 "left" 500
+ -cw 4 180
+ -label ""
+ -symbolButtonDisplay false
+ -cc $dstColorSliderCallback
+ ( $mapName + "DstColorSlider" );
+
+ } setParent ..; // rowColumnLayout -numberOfColumns 2
+
+ } setParent ..; // columnLayout
+
+ columnLayout -edit
+ -enable $mapUse
+ ( $mapName + "DetailsLayout" );
+
+ } setParent ..; //rowColumnLayout -numberOfColumns 2
+
+ setUITemplate -popTemplate;
+}
+
+// Create the maps section of the UI
+proc createMappedPrelight ( int $mpNumMaps )
+{
+ setUITemplate -pushTemplate attributeEditorTemplate;
+
+ columnLayout
+ -adjustableColumn true
+ mpLayout;
+ {
+ columnLayout -rs 5 -cat "left" 150;
+ {
+ int $forceMinValue;
+ if ( `optionVar -exists P3D_mpforceMinValue` )
+ $forceMinValue = `optionVar -q P3D_mpforceMinValue`;
+ string $forceCallback = ( "P3Dmp_forceValues ( " + $mpNumMaps + " ) " );
+ checkBox
+ -value $forceMinValue
+ -al left
+ -w 200
+ -label "Force minimum values"
+ -cc $forceCallback
+ forceMinValueCheckBox;
+ int $useAveSides;
+ if ( `optionVar -exists P3D_mpUseAveSides` )
+ $useAveSides = `optionVar -q P3D_mpUseAveSides`;
+ checkBox
+ -value $useAveSides
+ -al left
+ -w 200
+ -label "Use average of side vertex colours"
+ useAverageSideCheckBox;
+ string $averageCallback = "waitCursor -st on; avePrelight; waitCursor -st off;";
+ button
+ -label " Set to average "
+ -height 22
+ -command $averageCallback
+ mpAverageSideButton;
+ } setParent ..;
+
+ separator;
+ rowColumnLayout -numberOfColumns 2
+ -rat 1 "top" 5
+ -co 1 "left" 212
+ -columnWidth 1 312
+ -cal 2 "left"
+ -columnWidth 2 330
+ "P3mp_colourHeader";
+ {
+ text -al "center" "Colour 1";
+ text -al "center" "Colour 2";
+ } setParent ..;
+
+ int $i;
+ for ( $i = 1; $i <= $mpNumMaps ; $i++ )
+ {
+ separator;
+ createMapLayout ( $i, $mpNumMaps );
+ }
+
+ } setParent ..;
+
+ setUITemplate -popTemplate;
+}
+
+// Create the main window for all prelighting.
+global proc mappedPrelightWindow()
+{
+ int $mpNumMaps = 6;
+ string $windowName = "mappedPrelightWindow";
+ string $windowTitle = "Mapped Prelight (ver. 1.2.0 April 12, 2002)";
+ string $iconTitle = "Map Prelight";
+ int $windowWidth = 450;
+ int $windowHeight = 500;
+ int $windowPosTop = 200;
+ int $windowPosLft = 220;
+
+ // If the window already exists, just make it visible.
+ if (`window -exists $windowName`)
+ {
+ showWindow $windowName;
+ P3Dmp_updateAllMappedPrelightGlobal( $mpNumMaps );
+ return;
+ }
+
+ // No window exists so build it.
+ window
+ -t $windowTitle
+ -in $iconTitle
+ -wh $windowWidth $windowHeight
+ -tlc $windowPosTop $windowPosLft
+ -mb true
+ $windowName;
+
+ // Create the menus
+ menu -l "File";
+ menuItem -l "New colour map"
+ -c ( "P3Dmp_resetAllValues( " + $mpNumMaps + " )" );
+ string $openColour1Callback = ("fileBrowserDialog -m 0 -fc \"P3Dmp_openColourMap " +
+ $mpNumMaps + " Src \" -ft map -an Open" );
+ menuItem -l "Open colour 1..."
+ -c $openColour1Callback;
+ string $openColour1Callback = ("fileBrowserDialog -m 0 -fc \"P3Dmp_openColourMap " +
+ $mpNumMaps + " Dst \" -ft map -an Open" );
+ menuItem -l "Open colour 2..."
+ -c $openColour1Callback;
+ menuItem -d true;
+ string $saveColour1Callback = ("fileBrowserDialog -m 1 -fc \"P3Dmp_saveColourMap " +
+ $mpNumMaps + " Src \" -ft map -an Save" );
+ menuItem -l "Save colour 1..."
+ -c $saveColour1Callback;
+ string $saveColour2Callback = ("fileBrowserDialog -m 1 -fc \"P3Dmp_saveColourMap " +
+ $mpNumMaps + " Dst \" -ft map -an Save" );
+ menuItem -l "Save colour 2..."
+ -c $saveColour2Callback;
+
+// menu -l "Edit";
+
+ // Create the help menu
+ addContextHelpProc "mappedPrelightWindow" "P3Dmp_buildMappedPrelightContextHelpItems";
+ doHelpMenu "mappedPrelightWindow" "mappedPrelightWindow";
+
+ // Create main form
+ setUITemplate -pushTemplate attributeEditorTemplate;
+
+ formLayout
+ mpMainForm;
+ {
+ scrollLayout
+ -hst 0 mpMainLayout;
+ {
+ columnLayout -adjustableColumn true mpMainColumnLayout;
+ {
+ // Sampling Options
+ frameLayout -label "Sampling Options"
+ -cll 1 -cl 1
+ -preExpandCommand "createSamplingOptions (\"mpSamplingOptionsFrame\")"
+ mpSamplingOptionsFrame;
+ {
+ } setParent ..;
+
+ // Basic Prelight
+ frameLayout -label "Basic Prelight"
+ -cll 1 -cl 1
+ mpBasicPrelight;
+ {
+ createBasicPrelight();
+ } setParent ..;
+
+ // Mapped Prelight
+ frameLayout -label "Mapped Prelight"
+ -cll 1 -cl 0
+ mpMappedPrelight;
+ {
+ createMappedPrelight ( $mpNumMaps );
+ } setParent ..; // mpMainColumnLayout
+ } setParent..; // mpMainLayout
+ } setParent..; // mpMainForm
+ } setParent..; // $windowName
+
+ // Create the main window action buttons
+
+ formLayout
+ -numberOfDivisions 5
+ mpActionButtons;
+ {
+
+ button
+ -label "Prelight => Colour 1"
+ -height 26
+ -command ( "P3Dmp_applyPrelightMaps( 1, " + $mpNumMaps + " )" )
+ mpApplyButton;
+ button
+ -label "Colour 1 <- Colour 2"
+ -command ( "P3Dmp_applyColourMaps( 1, " + $mpNumMaps + ", 0 )" )
+ -height 26
+ mpBackwardButton;
+ button
+ -label "Colour 1 -> Colour 2"
+ -command ( "P3Dmp_applyColourMaps( 1, " + $mpNumMaps + ", 1 )" )
+ -height 26
+ mpForwardButton;
+ button
+ -label "Reset"
+ -height 26
+ -command ( "P3Dmp_resetAllValues( " + $mpNumMaps + " )" )
+ mpResetButton;
+ button
+ -label "Close"
+ -height 26
+ -command ( "deleteUI " + $windowName )
+ mpCloseButton;
+
+ formLayout
+ -edit
+ -af mpApplyButton left 5
+ -ap mpApplyButton right 2 1
+ -af mpApplyButton top 5
+ -af mpApplyButton bottom 5
+
+ -ap mpBackwardButton left 3 1
+ -ap mpBackwardButton right 2 2
+ -af mpBackwardButton top 5
+ -af mpBackwardButton bottom 5
+
+ -ap mpForwardButton left 3 2
+ -ap mpForwardButton right 2 3
+ -af mpForwardButton top 5
+ -af mpForwardButton bottom 5
+
+ -ap mpResetButton left 3 3
+ -ap mpResetButton right 2 4
+ -af mpResetButton top 5
+ -af mpResetButton bottom 5
+
+ -ap mpCloseButton left 3 4
+ -af mpCloseButton right 5
+ -af mpCloseButton top 5
+ -af mpCloseButton bottom 5
+ mpActionButtons;
+ } setParent ..; // mpActionButtons
+
+ // Set the layout
+ formLayout -edit
+ -af mpMainLayout "top" 0
+ -af mpMainLayout "left" 0
+ -af mpMainLayout "right" 0
+ -ac mpMainLayout "bottom" 5 mpActionButtons
+
+ -an mpActionButtons "top"
+ -af mpActionButtons "bottom" 5
+ -af mpActionButtons "left" 5
+ -af mpActionButtons "right" 5
+ mpMainForm;
+
+ setUITemplate -popTemplate ;
+
+ // Make sure associated procedures are loaded
+ source mappedPrelight;
+
+ // Make the window visible
+ showWindow $windowName;
+
+ // Apply any other global settings to the window.
+ P3Dmp_updateAllMappedPrelightGlobal( $mpNumMaps );
+}
+
+
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/nameSpaceGui.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/nameSpaceGui.mel
new file mode 100644
index 0000000..6648922
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/nameSpaceGui.mel
@@ -0,0 +1,74 @@
+global string $g_P3DNameSpaceField;
+
+global proc P3DRemoveNameSpaceTool_RemoveNameSpace(string $selectedNodes[], string $nameSpace)
+{
+ print "called P3DRemoveNameSpaceTool_RemoveNameSpace for:";
+ print $selectedNodes;
+ print "\n";
+ for($node in $selectedNodes)
+ {
+ string $newName = `substitute $nameSpace $node ""`;
+ if($newName != "")
+ {
+ rename -is $node $newName;
+ }
+ }
+}
+
+global proc P3DRemoveNameSpaceTool_RemoveSelected()
+{
+ global string $g_P3DNameSpaceField;
+ string $nameSpace = `textField -q -text $g_P3DNameSpaceField`;
+ string $selectedNodes[] = `ls -sl`;
+
+ P3DRemoveNameSpaceTool_RemoveNameSpace( $selectedNodes, $nameSpace );
+}
+
+global proc P3DRemoveNameSpaceTool_RemoveHierarchy()
+{
+ global string $g_P3DNameSpaceField;
+ string $nameSpace = `textField -q -text $g_P3DNameSpaceField`;
+ select -add -hi;
+ string $selectedNodes[] = `ls -sl`;
+
+ P3DRemoveNameSpaceTool_RemoveNameSpace( $selectedNodes, $nameSpace );
+}
+
+
+global proc P3DRemoveNameSpaceTool_GUICreate()
+{
+ string $windowName = "P3DRemoveNameSpaceTool";
+
+ global string $g_P3DNameSpaceField;
+
+ if (`window -query -exists $windowName`!=1)
+ {
+ window
+ -width 300
+ -height 140
+ -minimizeButton false
+ -maximizeButton false
+ -sizeable false
+ -title $windowName
+ $windowName;
+
+ columnLayout
+ -adjustableColumn true
+ -columnAlign "left"
+ -cat "left" 5;
+
+ text -l "NameSpace";
+ $g_P3DNameSpaceField = `textField -width 200`;
+
+ button
+ -label "Remove Selected"
+ -command "P3DRemoveNameSpaceTool_RemoveSelected()";
+ button
+ -label "Remove Hierarchy"
+ -command "P3DRemoveNameSpaceTool_RemoveHierarchy()";
+
+ showWindow $windowName;
+ }
+}
+
+P3DRemoveNameSpaceTool_GUICreate(); \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/optimizeShaders.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/optimizeShaders.mel
new file mode 100644
index 0000000..8ddc804
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/optimizeShaders.mel
@@ -0,0 +1,1046 @@
+//===========================================================================
+// Copyright ©2002 Radical Entertainment Ltd. All rights reserved.
+//
+// Created: 17 April, 2002
+//
+// Component: optimizeShaders.mel
+//
+// Description: Sorts file textures by their '.fileTextureName' attributes,
+// and for those whose input file matches compares all input
+// attributes to see if they can be considered equivalent.
+// Equivalent file textures are "merged" so one serves the
+// duties previously served by both.
+//
+// Materials and Shading Groups are evaluated and optimized
+// in similar fashion.
+//
+// Constraints:
+//
+// Creator: Bryan Ewert
+//
+//===========================================================================
+
+
+//===========================================================================
+// version
+//===========================================================================
+// Description: Returns the current version for this MEL script.
+// Used for version control.
+//
+// Constraints: Used with assertCurrent().
+//
+//===========================================================================
+proc float version()
+{
+ return ( 1.1 );
+}
+
+// ////////////////////////////////////////////////////////////////
+// rootNode
+//
+// Description: Strips the dot-suffix of the specified string.
+// e.g. "object.attribute" is returned as "object"
+proc string rootNode( string $object )
+{
+ string $buffer[];
+ tokenize $object "." $buffer;
+ return $buffer[0];
+}
+
+//===========================================================================
+// hasInput
+//===========================================================================
+// Description: Returns TRUE if specified attribute has an input connection.
+//
+// Constraints:
+//
+// Parameters: string $node: The node.
+// string $attr: The attribute.
+//
+// Return: TRUE if specified attribute has an input connection;
+// else FALSE.
+//
+//===========================================================================
+proc int hasInput( string $node, string $attr )
+{
+ int $hasInput = false;
+ if ( `attributeQuery -node $node -exists $attr` )
+ {
+ string $c[] = `listConnections -d false -s true ( $node + "." + $attr )`;
+ $hasInput = ( $c[0] != "" );
+ }
+ return $hasInput;
+}
+
+//===========================================================================
+// isMinorType
+//===========================================================================
+// Description: Compares the type of the specified node against those in
+// a static list. If the type matches it is considered a
+// minor type. This is used to determine the "significance"
+// of a connection to a node. If a node's connections serve
+// only nodes of these types then it is assumed that the node
+// may be safely deleted without impacting scene requirements.
+//
+// Constraints:
+//
+// Parameters: string $node: The node to evaluate.
+//
+// Return: (int): TRUE if specified node is a minor type; else FALSE.
+//
+//===========================================================================
+proc int isMinorType( string $node )
+{
+ int $isMinorType = false;
+
+ string $minorNodeTypes[] =
+ {
+ "defaultLightList",
+ "defaultRenderUtilityList",
+ "defaultShaderList",
+ "defaultTextureList",
+ "lightLinker",
+ "materialInfo",
+ "partition"
+ };
+
+ string $nodeType = `nodeType $node`;
+
+ for ( $minor in $minorNodeTypes )
+ {
+ if ( $minor == $nodeType )
+ {
+ $isMinorType = true;
+ break;
+ }
+ }
+
+ return $isMinorType;
+}
+
+//===========================================================================
+// hasOnlyMinorOutputConnections
+//===========================================================================
+// Description: Considers all output connections from the specified node
+// and determines if all of them may be considered "minor."
+// A minor connection is one which serves only the node in
+// question and not other parts of the scene. If a node
+// provides no connections to other significant nodes in the
+// scene it may be considered safe to delete without impacting
+// scene requirements.
+//
+// Constraints:
+//
+// Parameters: string $node: The node to evaluate.
+//
+// Return: (int): TRUE if all output connections are minor, or if node
+// has no output connections; FALSE if at least one
+// non-minor connection exists.
+//
+//===========================================================================
+proc int hasOnlyMinorOutputConnections( string $node )
+{
+ int $onlyMinorTypes = true;
+
+ string $outputs[] = `listConnections -s false -d true $node`;
+ for ( $c in $outputs )
+ {
+ if ( !isMinorType( $c ) )
+ {
+ $onlyMinorTypes = false;
+ break;
+ }
+ }
+
+ return $onlyMinorTypes;
+}
+
+//===========================================================================
+// safeDelete
+//===========================================================================
+// Description: Deletes the specified node _only_ if it is considered to have
+// little impact on the scene.
+//
+// All nodes providing input connections to the specified node
+// are evaluated in iterative fashion.
+//
+// Constraints:
+//
+// Parameters: string $node: The node that will be deleted.
+//
+// Return: (none)
+//
+//===========================================================================
+proc safeDelete( string $node )
+{
+ if ( `objExists $node` )
+ {
+ string $inputs[] = `listConnections -s true -d false $node`;
+
+ if ( hasOnlyMinorOutputConnections( $node ) )
+ {
+ delete $node;
+ }
+
+ for ( $i in $inputs )
+ {
+ safeDelete( $i );
+ }
+ }
+}
+
+//===========================================================================
+// compareInt
+//===========================================================================
+// Description: Performs an integer comparison for one attribute on
+// two nodes.
+//
+// Constraints: This handles all "int" relatives; e.g. enum, short, bool.
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareInt( string $node1, string $node2, string $attr )
+{
+ int $i1 = `getAttr ( $node1 + "." + $attr )`;
+ int $i2 = `getAttr ( $node2 + "." + $attr )`;
+ return ( $i1 == $i2 );
+}
+
+//===========================================================================
+// compareFloat
+//===========================================================================
+// Description: Performs a float comparison for one attribute on
+// two nodes.
+//
+// Constraints: This handles all "float" relatives; e.g. doubleAngle
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareFloat( string $node1, string $node2, string $attr )
+{
+ float $f1 = `getAttr ( $node1 + "." + $attr )`;
+ float $f2 = `getAttr ( $node2 + "." + $attr )`;
+ return ( $f1 == $f2 );
+}
+
+//===========================================================================
+// compareFloat2
+//===========================================================================
+// Description: Performs a float2 comparison (i.e. array of two floats)
+// for one attribute on two nodes.
+//
+// Constraints:
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareFloat2( string $node1, string $node2, string $attr )
+{
+ float $f1[2] = `getAttr ( $node1 + "." + $attr )`;
+ float $f2[2] = `getAttr ( $node2 + "." + $attr )`;
+ return ( ( $f1[0] == $f2[0] ) && ( $f1[1] == $f2[1] ) );
+}
+
+//===========================================================================
+// compareFloat3
+//===========================================================================
+// Description: Performs a vector comparison for one attribute on
+// two nodes. This would commonly be used to compare
+// color attributes.
+//
+// Constraints:
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareFloat3( string $node1, string $node2, string $attr )
+{
+ float $f1[3] = `getAttr ( $node1 + "." + $attr )`;
+ float $f2[3] = `getAttr ( $node2 + "." + $attr )`;
+ return ( ( $f1[0] == $f2[0] ) && ( $f1[1] == $f2[1] ) && ( $f1[2] == $f2[2] ) );
+}
+
+//===========================================================================
+// compareString
+//===========================================================================
+// Description: Performs a string comparison for one attribute on
+// two nodes.
+//
+// Constraints:
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareString( string $node1, string $node2, string $attr )
+{
+ string $s1 = `getAttr ( $node1 + "." + $attr )`;
+ string $s2 = `getAttr ( $node1 + "." + $attr )`;
+ return ( $s1 == $s2 );
+}
+
+//===========================================================================
+// compareConnections
+//===========================================================================
+// Description: Compares the connections for one attribute on two nodes.
+//
+// If neither attribute is connected, the attributes match.
+//
+// If one attribute is connected but the other is not, then
+// the attributes do not match.
+//
+// If both attributes are connected there is a match only if
+// both connections are to the same node.
+//
+// Constraints:
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareConnections( string $node1, string $node2, string $attr )
+{
+ // If neither has this attribute, consider it a match.
+ if ( !`attributeQuery -node $node1 -exists $attr` && !`attributeQuery -node $node2 -exists $attr` )
+ {
+ return true;
+ }
+
+ // If one has the attribute, but the other doesn't, no match.
+ if (
+ ( `attributeQuery -node $node1 -exists $attr` && !`attributeQuery -node $node2 -exists $attr` ) ||
+ ( !`attributeQuery -node $node1 -exists $attr` && `attributeQuery -node $node2 -exists $attr` )
+ )
+ {
+ return false;
+ }
+
+ string $c1[] = `listConnections -d false -s true ( $node1 + "." + $attr )`;
+ string $c2[] = `listConnections -d false -s true ( $node2 + "." + $attr )`;
+
+ // TRUE if neither or connected, or both are connected to the same node.
+ return ( $c1[0] == $c2[0] );
+}
+
+//===========================================================================
+// compareAttributes
+//===========================================================================
+// Description: Compares the value for one attribute on two nodes.
+// The attribute type is used to determine the type of
+// comparison performed. The attribute must exist on both
+// nodes, and the attribute type must be the same for both
+// nodes, else the two do not match.
+//
+// Constraints:
+//
+// Parameters: string $node1: The first node.
+// string $node2: The second node.
+// string $attr: The attribute for both nodes which is compared.
+//
+// Return: (int): TRUE if attributes match; else FALSE.
+//
+//===========================================================================
+proc int compareAttributes( string $node1, string $node2, string $attr )
+{
+ int $isEqual = true;
+
+ // If neither has this attribute, consider it a match.
+ if ( !`attributeQuery -node $node1 -exists $attr` && !`attributeQuery -node $node2 -exists $attr` )
+ {
+ // Some objects have different attributes than others (e.g. lambert and layered shaders)
+// warning( "! Attributes don't exist in compareAttributes( " + $node1 + ", " + $node2 + " ) !" );
+ return true;
+ }
+
+ // If one has the attribute, but the other doesn't, no match.
+ if (
+ ( `attributeQuery -node $node1 -exists $attr` && !`attributeQuery -node $node2 -exists $attr` ) ||
+ ( !`attributeQuery -node $node1 -exists $attr` && `attributeQuery -node $node2 -exists $attr` )
+ )
+ {
+ // This would be a bug. The script should take care that this will not happen.
+ warning( "! Attribute mismatch in compareAttributes( " + $node1 + ", " + $node2 + " ) !" );
+ return false;
+ }
+
+ // If one is connected but the other isn't, don't consider them equal.
+ if ( ( hasInput( $node1, $attr ) && !hasInput( $node2, $attr ) ) ||
+ ( !hasInput( $node1, $attr ) && hasInput( $node2, $attr ) )
+ )
+ {
+// warning( "! Connection mismatch in compareAttributes( " + $node1 + ", " + $node2 + " ) !" );
+ return false;
+ }
+
+ string $attrType1 = `getAttr -type ( $node1 + "." + $attr )`;
+ string $attrType2 = `getAttr -type ( $node2 + "." + $attr )`;
+
+ if ( $attrType1 != $attrType2 ) return false;
+
+ switch ( $attrType1 )
+ {
+ case "bool":
+ case "enum":
+ case "short":
+ {
+ $isEqual = compareInt( $node1, $node2, $attr );
+ break;
+ }
+ case "doubleAngle":
+ case "float":
+ {
+ $isEqual = compareFloat( $node1, $node2, $attr );
+ break;
+ }
+ case "float2":
+ {
+ $isEqual = compareFloat2( $node1, $node2, $attr );
+ break;
+ }
+ case "float3":
+ {
+ // As if this will work... likely a colour attribute and
+ // this will just compare black to black.
+ $isEqual = compareFloat3( $node1, $node2, $attr );
+ break;
+ }
+ case "string":
+ {
+ $isEqual = compareString( $node1, $node2, $attr );
+ break;
+ }
+ default:
+ {
+ error ( "Unsupported attribute type: " + $attrType1 );
+ break;
+ }
+ }
+
+ return $isEqual;
+}
+
+//===========================================================================
+// mergeShadingGroup
+//===========================================================================
+// Description: The two Shading Groups have been deemed to be equal.
+// The members for the latter are assigned to the former and
+// the latter is deleted from the scene.
+//
+// Constraints:
+//
+// Parameters: string $sg1: The Shading Group to keep.
+// string $sg2: The Shading Group to discard.
+//
+// Return: (none)
+//
+//===========================================================================
+proc mergeShadingGroup( string $sg1, string $sg2 )
+{
+ string $members[] = `sets -q $sg2`;
+ if ( `size $members` > 0 ) // just to avert useless Maya warning
+ {
+ sets -forceElement $sg1 $members;
+ }
+ safeDelete( $sg2 );
+}
+
+//===========================================================================
+// compareShadingGroups
+//===========================================================================
+// Description: Compares the connections and attributes for two specified
+// Shading Groups and evaluates if they can be considered
+// equivalent. If equivalent, the two are merged.
+//
+// Constraints: If the two Shading Groups are equal, $sg2 will likely be
+// deleted from the scene and will not exist when this function
+// call returns.
+//
+// Parameters: string $sg1: The first Shading Group.
+// string $sg2: The second Shading Group.
+//
+// Return: (int): TRUE if the two Shading Groups are equal; else FALSE.
+// If TRUE it is likely that $sg2 was deleted.
+//
+//===========================================================================
+proc int compareShadingGroups( string $sg1, string $sg2 )
+{
+ int $isEqual = true;
+
+ // Has same alpha?
+ $isEqual = $isEqual && compareConnections( $sg1, $sg2, "surfaceShader" );
+
+ $isEqual = $isEqual && compareConnections( $sg1, $sg2, "volumeShader" );
+
+ $isEqual = $isEqual && compareConnections( $sg1, $sg2, "displacementShader" );
+
+ $isEqual = $isEqual && compareAttributes( $sg1, $sg2, "memberWireframeColor" );
+
+ if ( $isEqual )
+ {
+ mergeShadingGroup( $sg1, $sg2 );
+ }
+
+ return $isEqual;
+}
+
+//===========================================================================
+// mergeMaterial
+//===========================================================================
+// Description: The two Materials have been deemed to be equal.
+// The former adopts the output connections for the latter and
+// the latter is deleted from the scene.
+//
+// Constraints:
+//
+// Parameters: string $sg1: The Material to keep.
+// string $sg2: The Material to discard.
+//
+// Return: (none)
+//
+//===========================================================================
+proc mergeMaterial( string $mat1, string $mat2 )
+{
+ string $c1[] = `listConnections ( $mat1 + ".outColor" )`;
+ string $c2[] = `listConnections ( $mat2 + ".outColor" )`;
+
+ // If no connection, or if connections are already the same, take no action.
+ if ( ( $c1[0] != "" && $c2[0] != "" ) && ( $c1[0] != $c2[0] ) )
+ {
+ // Deprecate and delete $mat2
+ string $cc[] = `listConnections -source false -d true -plugs true ( $mat2 + ".outColor" )`;
+ disconnectAttr ( $mat2 + ".outColor" ) $cc[0];
+
+ connectAttr ( $mat1 + ".outColor" ) $cc[0];
+
+ safeDelete( $mat2 );
+ }
+}
+
+//===========================================================================
+// compareMaterials
+//===========================================================================
+// Description: Compares the connections and attributes for two specified
+// Materials and evaluates if they can be considered
+// equivalent. If equivalent, the two are merged.
+//
+// Constraints: If the two Materials are equal, $mat2 will likely be
+// deleted from the scene and will not exist when this function
+// call returns.
+//
+// Parameters: string $mat1: The first Material.
+// string $mat2: The second Material.
+//
+// Return: (int): TRUE if the two Materials are equal; else FALSE.
+// If TRUE it is likely that $mat2 was deleted.
+//
+//===========================================================================
+proc int compareMaterials( string $mat1, string $mat2 )
+{
+ int $isEqual = true;
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "color" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "color" );
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "transparency" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "transparency" );
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "ambient" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "ambient" );
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "diffuse" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "diffuse" );
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "emissive" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "emissive" );
+
+ $isEqual = $isEqual && compareConnections( $mat1, $mat2, "specular" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "specular" );
+
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "shininess" );
+
+ // Pure3D attributes
+ // '.pddiShaderName' will short-circuit the remainder if shader types aren't equal.
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "pddiShaderName" );
+
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "alphaCompare" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "alphaTest" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "blendMode" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "doubleSided" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "dynamicallyLit" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "filterMode" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "isLightMapped" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "isLit" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "isTranslucent" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "K" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "L" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "mipmapmax" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "mipmapmin" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "mmsharpness" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "prelightMode" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "proceduralXRes" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "proceduralYRes" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "shadeMode" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "shininess" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "uvMode" );
+ $isEqual = $isEqual && compareAttributes( $mat1, $mat2, "vertexShaderName" );
+
+ if ( $isEqual )
+ {
+ // Navigate to each Material and compare them.
+ string $out1[] = `listConnections ( $mat1 + ".outColor" )`;
+ string $out2[] = `listConnections ( $mat2 + ".outColor" )`;
+
+ mergeMaterial( $mat1, $mat2 );
+
+ compareShadingGroups( $out1[0], $out2[0] );
+ }
+
+ return $isEqual;
+}
+
+//===========================================================================
+// mergeFile
+//===========================================================================
+// Description: The two file textures have been deemed to be equal.
+// The former adopts the output connections for the latter and
+// the latter is deleted from the scene.
+//
+// Constraints:
+//
+// Parameters: string $file1: The file texture to keep.
+// string $file2: The file texture to discard.
+//
+// Return: (none)
+//
+//===========================================================================
+proc mergeFile( string $file1, string $file2 )
+{
+ string $c1[] = `listConnections ( $file1 + ".outColor" )`;
+ string $c2[] = `listConnections ( $file2 + ".outColor" )`;
+
+ // If no connection, or if connections are already the same, take no action.
+ if ( ( $c1[0] != "" && $c2[0] != "" ) && ( $c1[0] != $c2[0] ) )
+ {
+ string $cc[] = `listConnections -source false -d true -plugs true ( $file2 + ".outColor" )`;
+ disconnectAttr ( $file2 + ".outColor" ) $cc[0];
+
+ connectAttr ( $file1 + ".outColor" ) $cc[0];
+
+ safeDelete( $file2 );
+ }
+}
+
+//===========================================================================
+// compareFiles
+//===========================================================================
+// Description: Compares the connections and attributes for two specified
+// file textures and evaluates if they can be considered
+// equivalent. If equivalent, the two are merged.
+//
+// Constraints: If the two file textures are equal, $file2 will likely be
+// deleted from the scene and will not exist when this function
+// call returns.
+//
+// Parameters: string $file1: The first file texture.
+// string $file2: The second file texture.
+//
+// Return: (int): TRUE if the two file textures are equal; else FALSE.
+// If TRUE it is likely that $file2 was deleted.
+//
+//===========================================================================
+global proc int compareFiles( string $file1, string $file2 )
+{
+ int $isEqual = true;
+
+ // Compare place2d attributes
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "coverage" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "mirror" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "noiseUV" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "offset" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "uvFilterSize" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "repeatUV" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "rotateFrame" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "rotateUV" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "stagger" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "translateFrame" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "wrapU" );
+ $isEqual = $isEqual && compareAttributes( $file1, $file2, "wrapV" );
+
+ if ( $isEqual )
+ {
+ // Navigate to each Material and compare them.
+ string $out1[] = `listConnections ( $file1 + ".outColor" )`;
+ string $out2[] = `listConnections ( $file2 + ".outColor" )`;
+
+ mergeFile( $file1, $file2 );
+
+ if ( $out1[0] != "" && $out2[0] != "" )
+ {
+ $isEqual = compareMaterials( $out1[0], $out2[0] );
+ }
+ }
+
+ return $isEqual;
+}
+
+//===========================================================================
+// getSortedShadingGroups
+//===========================================================================
+// Description: It is only relevant to compare two Shading Groups for merging
+// if they share the same Surface Shader. This returns an array
+// of all Shading Groups sorted by the names of the nodes
+// connected to their .surfaceShader inputs.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (string[]): Array of all Shading Groups, sorted by their
+// '.surfaceShader' inputs.
+//
+//===========================================================================
+proc string[] getSortedShadingGroups()
+{
+ string $allShadingGroups[];
+
+ string $shadingGroups[] = `ls -type "shadingEngine"`;
+
+ for ( $f in $shadingGroups )
+ {
+ string $cc[] = `listConnections -d false -s true ( $f + ".surfaceShader" )`;
+ $allShadingGroups[`size $allShadingGroups`] = ( $cc[0] + "*" + $f );
+ }
+
+ $allShadingGroups = `sort $allShadingGroups`;
+ clear $shadingGroups;
+
+ for ( $f in $allShadingGroups )
+ {
+ string $tokens[];
+ tokenize $f "*" $tokens;
+
+ $shadingGroups[`size $shadingGroups`] = $tokens[1];
+ }
+
+ return $shadingGroups;
+}
+
+//===========================================================================
+// getSortedMaterials
+//===========================================================================
+// Description: It is only relevant to compare two Materials for merging
+// if they share the same Color connection. This returns an
+// array of all Materials sorted by the names of the nodes
+// connected to their .color inputs.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (string[]): Array of all Materials, sorted by their
+// '.color' inputs.
+//
+//===========================================================================
+proc string[] getSortedMaterials()
+{
+ string $allMaterials[];
+
+ string $materials[] = `ls -materials`;
+
+ for ( $f in $materials )
+ {
+ string $cc[] = `listConnections -d false -s true ( $f + ".color" )`;
+ $allMaterials[`size $allMaterials`] = ( $cc[0] + "*" + $f );
+ }
+
+ $allMaterials = `sort $allMaterials`;
+ clear $materials;
+
+ for ( $f in $allMaterials )
+ {
+ string $tokens[];
+ tokenize $f "*" $tokens;
+
+ $materials[`size $materials`] = $tokens[1];
+ }
+
+ return $materials;
+}
+
+//===========================================================================
+// getSortedFileTextures
+//===========================================================================
+// Description: It is only relevant to compare two file textures for merging
+// if they share the same input file. This returns an array
+// of all file textures sorted by the names of their source
+// files, obtained from the '.fileTextureName' attribute.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (string[]): Array of all file textures, sorted by their
+// '.fileTextureName' inputs.
+//
+//===========================================================================
+proc string[] getSortedFileTextures()
+{
+ string $allFiles[];
+
+ string $files[] = `ls -type "file"`;
+
+ for ( $f in $files )
+ {
+ string $ftn = `getAttr ( $f + ".fileTextureName" )`;
+ $allFiles[`size $allFiles`] = ( $ftn + "*" + $f );
+ }
+
+ $allFiles = `sort $allFiles`;
+ clear $files;
+
+ for ( $f in $allFiles )
+ {
+ string $tokens[];
+ tokenize $f "*" $tokens;
+
+ $files[`size $files`] = $tokens[1];
+ }
+
+ return $files;
+}
+
+//===========================================================================
+// optimizeShadingGroups
+//===========================================================================
+// Description: Entry point to optimize Shading Groups.
+//
+// Constraints: Will not attempt to merge Materials that could serve to
+// optimize Shading Groups. Only Shading Groups already sharing
+// a common Material will be merged.
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+proc optimizeShadingGroups()
+{
+ waitCursor -state on;
+
+ string $sgs[] = getSortedShadingGroups();
+
+ int $startSG = `size $sgs`;
+
+ int $f;
+ for ( $f = 0; $f < `size $sgs` - 1; $f++ )
+ {
+ // Previous optimization may have deleted this node
+ string $sg1 = "";
+ while ( $f < `size $sgs` - 1 )
+ {
+ if ( `objExists $sgs[$f]` )
+ {
+ $sg1 = $sgs[$f];
+ break;
+ }
+
+ $f++;
+ }
+
+ if ( $sg1 == "" ) break;
+
+ string $sg2 = $sgs[$f+1];
+
+ compareShadingGroups( $sg1, $sg2 );
+ }
+
+ $sgs = `ls -type "shadingEngine"`;
+ int $endSG = `size $sgs`;
+
+ print ( "optimizeShadingGroups removed " + ( $startSG- $endSG ) + " shadingGroups.\n" );
+
+ waitCursor -state off;
+}
+
+//===========================================================================
+// optimizeMaterials
+//===========================================================================
+// Description: Entry point to optimize Materials.
+//
+// Constraints: Will not attempt to merge file textures that could serve to
+// optimize Materials. Only Materials already sharing a
+// common file texture node will be merged.
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc optimizeMaterials()
+{
+ waitCursor -state on;
+
+ string $materials[] = getSortedMaterials();
+ int $startCount = `size $materials`;
+
+ int $f;
+ for ( $f = 0; $f < `size $materials` - 1; $f++ )
+ {
+ // Previous optimization may have deleted this node
+ string $mat1 = "";
+ while ( $f < `size $materials` - 1 )
+ {
+ if ( `objExists $materials[$f]` )
+ {
+ $mat1 = $materials[$f];
+ break;
+ }
+
+ $f++;
+ }
+
+ if ( $mat1 == "" ) break;
+
+ string $mat2 = $materials[$f+1];
+
+ compareMaterials( $mat1, $mat2 );
+ }
+
+ $materials = `ls -materials`;
+ int $endCount = `size $materials`;
+
+ print ( "optimizeMaterials removed " + ( $startCount - $endCount ) + " materials.\n" );
+
+ waitCursor -state off;
+}
+
+//===========================================================================
+// optimizeFileTextures
+//===========================================================================
+// Description: Entry point to optimize file textures.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc optimizeFileTextures()
+{
+ waitCursor -state on;
+
+ string $files[] = getSortedFileTextures();
+ string $materials[] = `ls -materials`;
+ string $sgs[] = `ls -type "shadingEngine"`;
+
+ int $startFiles = `size $files`;
+ int $startMaterials = `size $materials`;
+ int $startSG = `size $sgs`;
+
+ int $f;
+ for ( $f = 0; $f < `size $files` - 1; $f++ )
+ {
+ // Previous optimization may have deleted this node
+ string $file1 = $files[$f];
+ $file2 = "";
+
+ if ( !`objExists $file1` ) continue;
+
+ int $g = $f+1;
+ while ( $g < `size $files` - 1 )
+ {
+ if ( `objExists $files[$g]` )
+ {
+ $file2 = $files[$g];
+ break;
+ }
+
+ $g++;
+ }
+
+ if ( $file1 != "" && $file2 != "" )
+ {
+ string $ftn1 = `getAttr( $file1 + ".fileTextureName" )`;
+ string $ftn2 = `getAttr( $file2 + ".fileTextureName" )`;
+
+ if ( $ftn1 == $ftn2 )
+ {
+ $isEqual = compareFiles( $file1, $file2 );
+ }
+ }
+ }
+
+ $files = `ls -type "file"`;
+ $materials = `ls -materials`;
+ $sgs = `ls -type "shadingEngine"`;
+
+ int $endFiles = `size $files`;
+ int $endMaterials = `size $materials`;
+ int $endSG = `size $sgs`;
+
+ print ( "optimizeFileTextures removed: " + ( $startFiles - $endFiles ) + " file textures; " + ( $startMaterials - $endMaterials ) + " materials; " + ( $startSG - $endSG ) + " shadingGroups.\n" );
+
+ waitCursor -state off;
+}
+
+//===========================================================================
+// optimizeShaders
+//===========================================================================
+// Description: Sorts file textures by their '.fileTextureName' attributes,
+// and for those whose input file matches compares all input
+// attributes to see if they can be considered equivalent.
+// Equivalent file textures are "merged" so one serves the
+// duties previously served by both.
+//
+// Materials and Shading Groups are evaluated and optimized
+// in similar fashion.
+//
+// Constraints: Note that optimizing file textures implies optimization for
+// the Material connected to the optimized file texture, which
+// consequently optimizes the Shading Groups connected to
+// the optimized Material.
+//
+// It is not uncommon that the optimizeMaterials() and
+// optimizeShadingGroups() calls here will yield no additional
+// results after optimizeFileTextures() has completed its run.
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc optimizeShaders()
+{
+ optimizeFileTextures();
+ optimizeMaterials();
+ optimizeShadingGroups();
+}
+
+/*
+source optimizeShaders; optimizeShaders;
+*/
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameScripts.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameScripts.mel
new file mode 100644
index 0000000..88045b8
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameScripts.mel
@@ -0,0 +1,313 @@
+// Rename Shape and BV node
+// Alias|Wavefront Script File
+//
+// Creation Date: 2001
+// Author: (Novy) Gurdarshan Dhillon
+//
+//
+//
+// Description:
+// Rename the transform, shape, and BV nodes in a hierarchy
+// to a specified name.
+//
+//
+//
+// Input Arguments:
+// None.
+// Return Values:
+// None.
+// renameShape
+//
+
+global proc renameShape(string $newName)
+{
+ if (`size($newName)`>0)
+ {
+ string $objects[] = `ls -sl`;
+
+ for ($object in $objects)
+ {
+ string $children[];
+ clear ($children);
+ int $count = 1;
+ int $count2 = 1;
+ if(`nodeType $object` == "transform")
+ {
+ $object = `rename $object $newName`;
+ print ("\nTopnode : " + $object);
+ //for each object in list get the sub objects.
+ $children = `listRelatives -ad -pa $object`;
+ }
+ if(`nodeType $object` == "joint")
+ {
+ $children[0]= $object;
+ }
+ for($child in $children)
+ {
+ // check if the subobjects are transform and continue
+ string $postfix = "";
+ if(`nodeType $child` == "transform")
+ {
+ print ("\nTransform : " + $child);
+ $child = `rename $child ($newName + $count)`;
+ string $shapes[] = `listRelatives -s $child`;
+ for ($shape in $shapes)
+ {
+ if(`nodeType $shape` == "mesh")
+ {
+ print ("\nMesh : " + $shape);
+ rename $shape ($newName + $count + "Shape");
+ }
+ }
+ $count++;
+ }
+ // check if the sub objects are joints and continue
+ else if(`nodeType $child` == "joint")
+ {
+ print ("\nTransform : " + $child);
+ $child = `rename $child ($newName + $count + "_BV")`;
+ string $shapes[] = `listRelatives -s $child`;
+ for ($shape in $shapes)
+ {
+ if(`nodeType $shape` == "p3dBoundVolShape")
+ {
+ print ("\nMesh : " + $shape);
+ rename $shape ($newName + $count + "_BV" + "Shape");
+ }
+ }
+ $count++;
+ }
+ }
+ }
+ }
+}
+
+
+// Rename Texture node
+// Alias|Wavefront Script File
+//
+// Creation Date: 20 March. 2001
+// Author: (Novy) Gurdarshan Dhillon
+//
+//
+//
+// Description:
+// Renames the texture node to corrisponde to the
+// image file that it contains. Also outputs the
+// images resolution.
+//
+//
+//
+// Input Arguments:
+// None.
+// Return Values:
+// None.
+// renameTexture
+//
+
+global proc renameTexture()
+{
+ string $files[] = `ls -type "file"`;
+ string $imageName;
+ print ("\nRename Info");
+ for ($file in $files)
+ {
+ print ("\n-------------------------------------");
+ $imageName = `getAttr ($file + ".fileTextureName")`;
+ string $path[];
+ string $token[];
+ tokenize $imageName "/" $path;
+ tokenize $path[(`size $path` -1)] "." $token;
+ $file = `rename $file ($token[0] + "_t")`;
+ string $fileConnections[] = `listConnections ($file + ".outColor")`;
+
+ float $res[] = `getAttr ($file + ".outSize")`;
+ print ("\nFile: " + $imageName + " " + $res[0] + " × " + $res[1]);
+ print ("\nFile Texture Node: " + $file);
+ for ($con in $fileConnections)
+ {
+ string $match1;
+ string $match2;
+ string $nodeType = `nodeType $con`;
+ $match1 = `match "Texture" $nodeType`;
+ $match2 = `match "Shader" $nodeType`;
+ if (`size $match1` > 0)
+ {
+ if(`nodeType $con` == "layeredTexture")
+ {
+ string $layeredShaderColor1Con[] = `listConnections ($con + ".inputs[0].color")`;
+ if(`nodeType $layeredShaderColor1Con[0]` == "file")
+ {
+ string $image = `getAttr ($layeredShaderColor1Con[0] + ".fileTextureName")`;
+ string $path[];
+ string $token[];
+ int $size = `tokenize $image "/" $path`;
+ tokenize $path[$size -1] "." $token;
+ $con = `rename $con ($token[0] + "_layered")`;
+ print ("\nLayered Texture Node: " + $con);
+ }
+ }
+ }
+ else if (`size $match2` > 0)
+ {
+ string $shadingEngines[];
+ string $token[];
+ if(`nodeType $con` == "pure3dLayeredShader")
+ {
+ string $layeredShaderColor1Con[] = `listConnections ($con + ".bottomtex")`;
+ if(`nodeType $layeredShaderColor1Con[0]` == "file")
+ {
+ string $image = `getAttr ($layeredShaderColor1Con[0] + ".fileTextureName")`;
+ string $path[];
+ int $size = `tokenize $image "/" $path`;
+ tokenize $path[$size -1] "." $token;
+ $con = `rename $con ($token[0] + "_m")`;
+ $shadingEngines = `listConnections ($con + ".outColor")`;
+ print ("\nMaterial Node: " + $con);
+ }
+ }
+ else
+ {
+ string $layeredShaderColor1Con[] = `listConnections ($con + ".color")`;
+ if(`nodeType $layeredShaderColor1Con[0]` == "file")
+ {
+ string $image = `getAttr ($layeredShaderColor1Con[0] + ".fileTextureName")`;
+ string $path[];
+ int $size = `tokenize $image "/" $path`;
+ tokenize $path[$size -1] "." $token;
+ $con = `rename $con ($token[0] + "_m")`;
+ $shadingEngines = `listConnections ($con + ".outColor")`;
+ print ("\nMaterial Node: " + $con);
+ }
+ }
+ for ($se in $shadingEngines)
+ {
+ $se = `rename $se ($token[0] + "_shg")`;
+ print ("\nShading Engine: " + $se);
+ }
+ }
+ }
+ }
+}
+
+
+global proc fileRes()
+{
+ string $textures[] = `ls -type "file"`;
+ for($texture in $textures)
+ {
+ string $attr = $texture + ".fileTextureName";
+ string $file = `getAttr $attr`;
+ string $attr = $texture + ".outSize";
+ float $res[] = `getAttr $attr`;
+ print ("\n" + $file + " " + $res[0] + " × " + $res[1]);
+ }
+}
+
+global proc removeShapefromNode()
+{
+ string $transforms[] = `ls -sl -tr -l`;
+ if(size($transforms))
+ {
+ for($transform in $transforms)
+ {
+ string $relatives[] = `listRelatives -ad -f $transform`;
+ if (size($relatives))
+ {
+ for ($child in $relatives)
+ {
+ if(`nodeType($child)` == "mesh")
+ {
+ string $path[];
+ int $num = `tokenize $child "|" $path`;
+ rename $child $path[$num-2];
+ }
+ }
+ }
+ else
+ {
+ error("Empty Transform Node!");
+
+ }
+ }
+ }
+ else
+ {error ("Please select a transform node.");}
+}
+
+global proc renameTextureOld()
+{
+ string $textures[] = `ls -type "file" -type "ramp"`;
+ for($texture in $textures)
+ {
+ string $attr;
+ string $image[];
+ string $file;
+ int $num;
+ int $size;
+ string $name;
+ string $fileNode;
+ if (`nodeType $texture` == "file")
+ {
+ $attr = $texture + ".fileTextureName";
+ $file = `getAttr $attr`;
+
+ $num = `tokenize $file "/" $image`;
+ $num = `tokenize $image[$num-1] "." $image`;
+ $attr = $texture + ".outSize";
+ float $res[] = `getAttr $attr`;
+ print ("\nFile: " + $file + " " + $res[0] + " × " + $res[1]);
+ $size = size($image[0]);
+ $name = `substring $image[0] 1 ($size)`;
+ $fileNode = `rename $texture ($name + "_t")`;
+ print ("\nFileNode: " + $fileNode);
+ }
+ else if(`nodeType $texture` == "ramp")
+ {
+ print ("ramp " + $texture);
+ $image[0] = $texture;
+ $fileNode = $texture;
+ }
+ $attr = $fileNode + ".outColor";
+ string $shaders[] = `listConnections -d 1 -s 0 $attr`;
+ // string $shader = $shaders[(size($shaders)-1)];
+ for ($shader in $shaders)
+ {
+ if ($shader != "lambert1" || $shader != "particleCloud1")
+ {
+ string $colorCon[];
+ if (`nodeType $shader` != "layeredTexture")
+ {
+ $colorCon = `listConnections ($shader + ".color")`;
+ //if (size($colorCon[0]) > 0)
+ {
+ $name = $image[0] + "_m";
+ }
+ }
+ else
+ {
+ $colorCon = `listConnections ($shader + ".inputs[0].color")`;
+ if (size($colorCon[0]) > 0)
+ {
+ $name = $image[0] + "_layered";
+ }
+ }
+
+ string $shadeNode = `rename $shader ($name)`;
+ print ("\nShading Node: " + $shadeNode);
+ $attr = $shadeNode + ".outColor";
+ string $engines[] = `listConnections -d 1 -s 0 $attr`;
+ if (size($engines))
+ {
+ for ($engine in $engines)
+ {
+ $name = $image[0] + "_shg";
+ string $engineNode = `rename $engine ($name)`;
+ print ("\nShading Engine: " + $engineNode);
+ }
+ }
+ }
+ }
+ print ("\n----------------------------------------\n");
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameTexture.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameTexture.mel
new file mode 100644
index 0000000..4cf0db4
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/renameTexture.mel
@@ -0,0 +1,94 @@
+// renameTexture.mel
+// Rename Texture node
+// Alias|Wavefront Script File
+//
+// Creation Date: 20 March. 2001
+// Author: (Novy) Gurdarshan Dhillon
+//
+//
+//
+// Description:
+// Renames the texture node to corrisponde to the
+// image file that it contains. Also outputs the
+// images resolution.
+//
+//
+//
+// Input Arguments:
+// None.
+// Return Values:
+// None.
+// renameTexture
+//
+
+
+global proc renameTexture()
+{
+ string $textures[] = `ls -type "file" -type "ramp"`;
+ for($texture in $textures)
+ {
+ string $attr;
+ string $image[];
+ string $file;
+ int $num;
+ int $size;
+ string $name;
+ string $fileNode;
+ if (`nodeType $texture` == "file")
+ {
+ $attr = $texture + ".fileTextureName";
+ $file = `getAttr $attr`;
+
+ $num = `tokenize $file "/" $image`;
+ $num = `tokenize $image[$num-1] "." $image`;
+ $attr = $texture + ".outSize";
+ float $res[] = `getAttr $attr`;
+ print ("\nFile: " + $file + " " + $res[0] + " × " + $res[1]);
+ $size = size($image[0]);
+ $name = `substring $image[0] 1 ($size)`;
+ $fileNode = `rename $texture ($name + "_t")`;
+ print ("\nFileNode: " + $fileNode);
+ }
+ else if(`nodeType $texture` == "ramp")
+ {
+ print ("ramp " + $texture);
+ $image[0] = $texture;
+ $fileNode = $texture;
+ }
+ $attr = $fileNode + ".outColor";
+ string $shaders[] = `listConnections -d 1 -s 0 -p 1 $attr`;
+ // string $shader = $shaders[(size($shaders)-1)];
+ for ($shader in $shaders)
+ {
+ string $info[]; tokenize $shader "." $info;
+ if($info[1] == "color")
+ {
+ $name = $image[0] + "_m";
+ string $shadeNode = `rename $info[0] ($name)`;
+ print ("\nShading Node: " + $shadeNode);
+ $attr = $shadeNode + ".outColor";
+ string $engines[] = `listConnections -d 1 -s 0 $attr`;
+ for ($engine in $engines)
+ {
+ $name = $image[0] + "_shg";
+ string $engineNode = `rename $engine ($name)`;
+ print ("\nShading Engine: " + $engineNode);
+ }
+ }
+ }
+ print ("\n----------------------------------------\n");
+ }
+}
+
+global proc fileRes()
+{
+ string $textures[] = `ls -type "file"`;
+ for($texture in $textures)
+ {
+ string $attr = $texture + ".fileTextureName";
+ string $file = `getAttr $attr`;
+ string $attr = $texture + ".outSize";
+ float $res[] = `getAttr $attr`;
+ print ("\n" + $file + " " + $res[0] + " × " + $res[1]);
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceSimpleShaderWithLambert.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceSimpleShaderWithLambert.mel
new file mode 100644
index 0000000..7f56139
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceSimpleShaderWithLambert.mel
@@ -0,0 +1,152 @@
+//===========================================================================
+// Copyright ©2002 Radical Entertainment Ltd. All rights reserved.
+//
+// Created: 11 April, 2002
+//
+// Component: replaceSimpleShaderWithLambert.mel
+//
+// Description: Replaces all pure3dSimpleShaders with Maya's lambert.
+//
+// Constraints: Attributes that map 1:1 are restored; anything else isn't.
+//
+// Creator: Bryan Ewert
+//
+//===========================================================================
+
+proc string rootNode( string $object )
+{
+ string $buffer[];
+ tokenize $object "." $buffer;
+ return $buffer[0];
+}
+
+//===========================================================================
+// arrayMatch
+//===========================================================================
+// Description: This is copied directly from Maya's "replaceNode.mel"
+//
+//===========================================================================
+proc int arrayMatch( string $array[], string $match )
+{
+ for ($item in $array)
+ if ($item == $match)
+ return true;
+
+ return false;
+}
+
+//===========================================================================
+// myReplaceNode
+//===========================================================================
+// Description: This is mostly copied directly from Maya's "replaceNode.mel"
+//
+// As is usual with Maya scripts, it spewed unnecessary warnings
+// when connections were automatically disconnected or
+// reconnected, and I just don't like Script Editor spew when
+// nothing is actually wrong.
+//
+// All that I changed was to replace the catch() wrappers with
+// less verbose isConnected() wrappers.
+//
+//===========================================================================
+proc myReplaceNode( string $originalNode, string $replaceNode )
+{
+ // Copy the scalar values
+
+ string $originalAttrs[] =
+ `listAttr -scalar -multi -read -visible $originalNode`;
+
+ string $replaceAttrs[] =
+ `listAttr -scalar -multi -write -visible $replaceNode`;
+
+ for ($attr in $originalAttrs) {
+ if (arrayMatch($replaceAttrs, $attr)) {
+ float $value = `getAttr ($originalNode+"."+$attr)`;
+ catch(`setAttr ($replaceNode+"."+$attr) $value`);
+ }
+ }
+
+ string $connections[];
+
+ // Process the source connections
+
+ $connections = `listConnections -source true -destination false
+ -connections true -plugs true $originalNode`;
+
+ for ($i = 0; $i < size($connections); $i += 2) {
+ string $originalPlug = $connections[$i];
+ string $srcPlug = $connections[$i+1];
+
+ string $replacePlug =
+ substitute($originalNode, $originalPlug, $replaceNode);
+
+ catch(`connectAttr $srcPlug $replacePlug`);
+ }
+
+ // Process the destination connections
+
+ $connections = `listConnections -source false -destination true
+ -connections true -plugs true $originalNode`;
+
+ for ($i = 0; $i < size($connections); $i += 2) {
+ string $originalPlug = $connections[$i];
+ string $dstPlug = $connections[$i+1];
+
+ string $replacePlug =
+ substitute($originalNode, $originalPlug, $replaceNode);
+
+ // First, break connections between original and dstPlug.
+ // Maya's 'replaceNode.mel' just wrapped this in a catch(),
+ // which spewed warnings if plug automatically disconnected
+ // due to a previous disconnect.
+ if ( `isConnected $originalPlug $dstPlug` )
+ {
+ disconnectAttr $originalPlug $dstPlug;
+ }
+
+ // Maya's 'replaceNode.mel' just wrapped this in a catch(),
+ // which spewed warnings if plug was automatically connected.
+ if ( !`isConnected $replacePlug $dstPlug` )
+ {
+ connectAttr $replacePlug $dstPlug;
+ }
+ }
+}
+
+//===========================================================================
+// replaceSimpleShaderWithLambert
+//===========================================================================
+// Description: Replaces all pure3dSimpleShaders with Maya's lambert.
+//
+// Constraints: Attributes that map 1:1 are restored; anything else isn't.
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc replaceSimpleShaderWithLambert()
+{
+ string $ss[] = `ls -type "pure3dSimpleShader"`;
+
+ for ( $shaderNode in $ss )
+ {
+ string $alpha[] = `listConnections ( $shaderNode + ".transparency" )`;
+
+ // This would be the desired Material type
+ string $replaceType = "lambert";
+
+ string $replaceWith = `createNode $replaceType`;
+
+ myReplaceNode $shaderNode $replaceWith;
+
+ delete $shaderNode;
+
+ // Rename the new node to match the original.
+ rename $replaceWith $shaderNode;
+ }
+}
+
+/*
+source replaceSimpleShaderWithLambert; replaceSimpleShaderWithLambert;
+*/
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceTex.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceTex.mel
new file mode 100644
index 0000000..19369cc
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/replaceTex.mel
@@ -0,0 +1,38 @@
+
+/*
+ |
+ | $Source: replaceTex.mel $
+ |
+ | $Author: jschleifer $
+ | $Revision: /main/1 $
+ | $Date: 1997/11/06 10:46:33 $
+ |
+ | Original Author:
+ | Jason Schleifer
+ |
+ | Description:
+ | Replaces strings in texture filenames. Works really well if you
+ | need to fix paths.
+ |
+ | Usage:
+ | replaceTex <old string> <new string>
+ |
+ | ex:
+ |
+ | replaceTex "/this/is/an/explicit/path" "";
+ |
+*/
+
+global proc replaceTex (string $old, string $new)
+{
+ for ($item in `ls -type file`)
+ {
+ string $name = `getAttr ($item + ".fileTextureName")`;
+ $name = `substitute $old $name $new`;
+ print ("setAttr -type \"string\" " + $item + ".fileTextureName \"" + $name + "\";\n");
+ $cmd = ("setAttr -type \"string\" " + $item + ".fileTextureName \"" + $name + "\";\n");
+
+ eval $cmd;
+ }
+
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.mel
new file mode 100644
index 0000000..7420382
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.mel
@@ -0,0 +1,578 @@
+/* rndPoints V1.6 - Maya2.0
+
+This script may be freely distributed. Modify at your own risk.
+
+Author: Dirk Bialluch (DirkBi@Software2000.de)
+
+Creation date: 21.12.98
+Last update: 15.10.00
+
+Description:
+ Please refer to integrated help window.
+
+History:
+ V1.1
+ NEW
+ -added lattice points and polygon vertices
+ V1.2
+ NEW
+ -set world space axes
+ V1.3
+ NEW
+ -store UI values
+ -transform mode added (world/object space)
+ -set intensity range
+ -use seed value checkbox added
+ -show min/max value
+ V1.4
+ ENHANCED
+ -store UI values as soon as UI element changes
+ NEW
+ -randomize along normal, u & v tangent
+ V1.5
+ FIXED
+ -"Use Seed Value" flag will now be recognized
+ NEW
+ -added threshold value for point randomization
+ V1.6
+ CHANGED
+ -UI point count display removed, due to performance issues
+ ENHANCED
+ -poly vertices can now be randomized along the uv direction
+ NEW
+ -major UI update
+ -reset UI
+ -help window
+*/
+
+//
+// Create UI **********************************************************************************
+//
+
+global proc rndPoints ()
+{
+ // set select tool
+ global string $gSelect;
+ setToolTo $gSelect;
+
+ int $uiLabelWidth = 140;
+ int $uiInputWidth = 240;
+ int $uiWidth = $uiLabelWidth + $uiInputWidth + 40;
+
+ if (`window -exists rp_ui` == true)
+ deleteUI rp_ui;
+
+ window
+ -maximizeButton 0
+ -resizeToFitChildren 0
+ -title "Randomize Points V1.6"
+ -iconName "Randomize Points"
+ -menuBar true
+ -menuBarVisible true
+ rp_ui;
+ menu
+ -label "Edit"
+ -tearOff false;
+ menuItem
+ -label "Reset Settings"
+ -c "rp_storeRecallUI reset; rndPoints";
+ menu
+ -label "Help"
+ -tearOff 0;
+ menuItem
+ -label "Help with Randomize Points tool"
+ -c "rp_help 1";
+ menuItem
+ -divider true;
+ menuItem
+ -label "Script Information"
+ -c "rp_help 2";
+
+ string $rp_form = `formLayout -numberOfDivisions 100`;
+ string $rp_scroll = `scrollLayout -hst 16 -vst 16 -childResizable true -minChildWidth $uiWidth`;
+ columnLayout -adjustableColumn true -rowSpacing 5;
+ frameLayout
+ -label "Settings"
+ -labelAlign "center"
+ -cll true
+ -lw $uiWidth
+ -mh 3
+ -borderStyle "etchedIn"
+ -cc "rp_adjustUI nop"
+ -ec "rp_adjustUI nop"
+ -bv true
+ rp_sFrame;
+ columnLayout -adjustableColumn true;
+ rowLayout
+ -numberOfColumns 3
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text -l "Intensity";
+ floatSliderGrp
+ -field true
+ -precision 4
+ -value .1
+ -minValue 0
+ -maxValue 1
+ -fieldMinValue 0
+ -fieldMaxValue 10000
+ -sliderStep .1
+ -cc "rp_adjustUI nop"
+ -dc "rp_adjustUI nop"
+ rp_intensity;
+ text -l "WS";
+ setParent ..;
+ rowLayout
+ -numberOfColumns 3
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text -l "Intensity Range";
+ floatSliderGrp
+ -field true
+ -precision 4
+ -value 0
+ -minValue -100
+ -maxValue 100
+ -sliderStep 5
+ -cc "rp_adjustUI nop"
+ -dc "rp_adjustUI nop"
+ rp_intensityRange;
+ text -l "-/+ %";
+ setParent ..;
+ rowLayout
+ -numberOfColumns 4
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 ( $uiInputWidth / 2 )
+ -columnWidth 3 ( $uiInputWidth / 2 );
+ text -l "Min/Max Value";
+ floatField
+ -w ( $uiInputWidth / 2 )
+ -precision 4
+ -editable false
+ rp_min;
+ floatField
+ -w ( $uiInputWidth / 2 )
+ -precision 4
+ -editable false
+ rp_max;
+ text -label "Info";
+ setParent ..;
+
+ separator -h 10;
+
+ rowLayout
+ -numberOfColumns 3
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text -l "Threshold";
+ floatSliderGrp
+ -field true
+ -precision 4
+ -value 0
+ -minValue 0
+ -maxValue 1
+ -sliderStep .1
+ -cc "rp_adjustUI nop"
+ -dc "rp_adjustUI nop"
+ rp_threshold;
+ text -l "0-1";
+ setParent ..;
+
+ separator -h 10;
+
+ rowLayout
+ -numberOfColumns 2
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text -label "Use Seed Value";
+ checkBox
+ -label ""
+ -value true
+ -cc "rp_adjustUI nop"
+ rp_useSeed;
+ setParent ..;
+ rowLayout
+ -numberOfColumns 2
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text -l "Seed Value";
+ intSliderGrp
+ -field true
+ -value 1234
+ -minValue 0
+ -maxValue 99999
+ -cc "rp_adjustUI nop"
+ rp_seed;
+ setParent ..;
+
+ separator -h 10;
+
+ rowLayout
+ -numberOfColumns 2
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 $uiInputWidth;
+ text
+ -label "Transform Mode";
+ radioButtonGrp
+ -numberOfRadioButtons 3
+ -cw 1 100
+ -cw 2 105
+ -labelArray3 "World Space" "Object Space" "Distance"
+ -select 1
+ -cc "rp_adjustUI nop"
+ rp_transMode;
+ setParent ..;
+
+ separator -h 10;
+
+ rowLayout
+ -numberOfColumns 4
+ -cat 1 "right" 5
+ -columnWidth 1 $uiLabelWidth
+ -columnWidth 2 50
+ -columnWidth 3 50;
+ text -label "Enable Axes";
+ checkBox
+ -label "X"
+ -value true
+ -cc "rp_adjustUI nop"
+ rp_x;
+ checkBox
+ -label "Y"
+ -value true
+ -cc "rp_adjustUI nop"
+ rp_y;
+ checkBox
+ -label "Z"
+ -value true
+ -cc "rp_adjustUI nop"
+ rp_z;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+
+ button
+ -label "Randomize Points"
+ -command "rp_main"
+ rp_execButton;
+
+ button
+ -label "Close"
+ -command "deleteUI rp_ui"
+ rp_closeButton;
+
+ // set form layouts
+ formLayout -edit
+ -attachForm $rp_scroll "top" 2
+ -attachForm $rp_scroll "left" 2
+ -attachControl $rp_scroll "bottom" 2 rp_execButton
+ -attachForm $rp_scroll "right" 2
+
+ -attachNone rp_execButton "top"
+ -attachForm rp_execButton "left" 2
+ -attachForm rp_execButton "bottom" 2
+ -attachPosition rp_execButton "right" 2 50
+
+ -attachNone rp_closeButton "top"
+ -attachPosition rp_closeButton "left" 2 50
+ -attachForm rp_closeButton "bottom" 2
+ -attachForm rp_closeButton "right" 2
+ $rp_form;
+
+ rp_storeRecallUI recall;
+
+ // check UI settings after restoring values
+ rp_adjustUI nop;
+
+ showWindow rp_ui;
+}
+
+global proc rp_storeRecallUI ( string $mode )
+{
+ string $floatFieldList[] = {
+ };
+
+ string $intFieldList[] = {
+ };
+
+ string $optionMenuList[] = {
+ };
+
+ string $floatSliderGrpList[] = {
+ "rp_intensity",
+ "rp_intensityRange",
+ "rp_threshold"
+ };
+
+ string $intSliderGrpList[] = {
+ "rp_seed"
+ };
+
+ string $checkBoxList[] = {
+ "rp_useSeed",
+ "rp_x",
+ "rp_y",
+ "rp_z"
+ };
+
+ string $radioButtonGrpList[] = {
+ "rp_transMode"
+ };
+
+ string $frameLayoutList[] = {
+ "rp_sFrame"
+ };
+
+ int $cnt;
+
+ if ( $mode == "store" )
+ {
+ for ( $cnt = 0; $cnt < size( $floatFieldList ); $cnt++ )
+ optionVar -floatValue $floatFieldList[$cnt] `floatField -q -value $floatFieldList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $intFieldList ); $cnt++ )
+ optionVar -intValue $intFieldList[$cnt] `intField -q -value $intFieldList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $floatSliderGrpList ); $cnt++ )
+ optionVar -floatValue $floatSliderGrpList[$cnt] `floatSliderGrp -q -value $floatSliderGrpList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $intSliderGrpList ); $cnt++ )
+ optionVar -intValue $intSliderGrpList[$cnt] `intSliderGrp -q -value $intSliderGrpList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $checkBoxList ); $cnt++ )
+ optionVar -intValue $checkBoxList[$cnt] `checkBox -q -value $checkBoxList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $optionMenuList ); $cnt++ )
+ optionVar -intValue $optionMenuList[$cnt] `optionMenu -q -select $optionMenuList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $radioButtonGrpList ); $cnt++ )
+ optionVar -intValue $radioButtonGrpList[$cnt] `radioButtonGrp -q -select $radioButtonGrpList[$cnt]`;
+
+ for ( $cnt = 0; $cnt < size( $frameLayoutList ); $cnt++ )
+ optionVar -intValue $frameLayoutList[$cnt] `frameLayout -q -collapse $frameLayoutList[$cnt]`;
+ }
+
+ if ( $mode == "recall" )
+ {
+ for ( $cnt = 0; $cnt < size( $floatFieldList ); $cnt++ )
+ if ( `optionVar -exists $floatFieldList[$cnt]` )
+ floatField -e -value `optionVar -q $floatFieldList[$cnt]` $floatFieldList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $intFieldList ); $cnt++ )
+ if ( `optionVar -exists $intFieldList[$cnt]` )
+ intField -e -value `optionVar -q $intFieldList[$cnt]` $intFieldList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $floatSliderGrpList ); $cnt++ )
+ if ( `optionVar -exists $floatSliderGrpList[$cnt]` )
+ floatSliderGrp -e -value `optionVar -q $floatSliderGrpList[$cnt]` $floatSliderGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $intSliderGrpList ); $cnt++ )
+ if ( `optionVar -exists $intSliderGrpList[$cnt]` )
+ intSliderGrp -e -value `optionVar -q $intSliderGrpList[$cnt]` $intSliderGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $checkBoxList ); $cnt++ )
+ if ( `optionVar -exists $checkBoxList[$cnt]` )
+ checkBox -e -value `optionVar -q $checkBoxList[$cnt]` $checkBoxList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $optionMenuList ); $cnt++ )
+ if ( `optionVar -exists $optionMenuList[$cnt]` )
+ optionMenu -e -select `optionVar -q $optionMenuList[$cnt]` $optionMenuList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $radioButtonGrpList ); $cnt++ )
+ if ( `optionVar -exists $radioButtonGrpList[$cnt]` )
+ radioButtonGrp -e -select `optionVar -q $radioButtonGrpList[$cnt]` $radioButtonGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $frameLayoutList ); $cnt++ )
+ if ( `optionVar -exists $frameLayoutList[$cnt]` )
+ frameLayout -e -collapse `optionVar -q $frameLayoutList[$cnt]` $frameLayoutList[$cnt];
+ }
+
+ if ( $mode == "reset" )
+ {
+ for ( $cnt = 0; $cnt < size( $floatFieldList ); $cnt++ )
+ optionVar -remove $floatFieldList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $intFieldList ); $cnt++ )
+ optionVar -remove $intFieldList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $floatSliderGrpList ); $cnt++ )
+ optionVar -remove $floatSliderGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $intSliderGrpList ); $cnt++ )
+ optionVar -remove $intSliderGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $checkBoxList ); $cnt++ )
+ optionVar -remove $checkBoxList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $optionMenuList ); $cnt++ )
+ optionVar -remove $optionMenuList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $radioButtonGrpList ); $cnt++ )
+ optionVar -remove $radioButtonGrpList[$cnt];
+
+ for ( $cnt = 0; $cnt < size( $frameLayoutList ); $cnt++ )
+ optionVar -remove $frameLayoutList[$cnt];
+ }
+}
+
+//
+// Adjust UI settings
+//
+
+global proc rp_adjustUI ( string $function )
+{
+ if ( `checkBox -q -v rp_useSeed` )
+ intSliderGrp -e -enable true rp_seed;
+ else
+ intSliderGrp -e -enable false rp_seed;
+
+ if ( ( `checkBox -q -v rp_x` || `checkBox -q -v rp_y` || `checkBox -q -v rp_z` ) && `floatSliderGrp -q -value rp_intensity` )
+ button -e -enable true rp_execButton;
+ else
+ button -e -enable false rp_execButton;
+
+ if ( `radioButtonGrp -q -select rp_transMode` == 1 )
+ floatSliderGrp -e -extraLabel "WS" rp_intensity;
+ else
+ floatSliderGrp -e -extraLabel "OS" rp_intensity;
+
+ if ( `radioButtonGrp -q -select rp_transMode` == 3 )
+ {
+ checkBox -e -label "U" rp_x;
+ checkBox -e -label "V" rp_y;
+ checkBox -e -label "N" rp_z;
+ }
+ else
+ {
+ checkBox -e -label "X" rp_x;
+ checkBox -e -label "Y" rp_y;
+ checkBox -e -label "Z" rp_z;
+ }
+
+ // calculate min/max displacement value
+ float $intensity = `floatSliderGrp -q -value rp_intensity`;
+ float $intensityRange = `floatSliderGrp -q -value rp_intensityRange`;
+
+ float $min = -($intensity / 2) + ($intensity * $intensityRange / 200);
+ float $max = $intensity / 2 + ($intensity * $intensityRange / 200);
+
+ floatField -e -value $min rp_min;
+ floatField -e -value $max rp_max;
+
+ rp_storeRecallUI store;
+}
+
+
+//
+// Main function
+//
+
+global proc rp_main ()
+{
+ // get settings from UI
+ float $min = `floatField -q -value rp_min`;
+ float $max = `floatField -q -value rp_max`;
+ int $seed = `intSliderGrp -q -value rp_seed`;
+ int $useSeed = `checkBox -q -v rp_useSeed`;
+ int $enX = `checkBox -q -v rp_x`;
+ int $enY = `checkBox -q -v rp_y`;
+ int $enZ = `checkBox -q -v rp_z`;
+ int $transMode = `radioButtonGrp -q -select rp_transMode`;
+ float $threshold = `floatSliderGrp -q -value rp_threshold`;
+
+ // init random function for repeatable results
+ if ( $useSeed )
+ seed $seed;
+
+ string $objList[];
+
+ // get selected points
+ if ( $transMode != 3 )
+ // filter cv, poly vertices and lattice points
+ $objList = `filterExpand -ex true -sm 28 -sm 31 -sm 46`;
+ else
+ // filter cv and poly vertices
+ $objList = `filterExpand -ex true -sm 28 -sm 31`;
+
+ int $listSize = size($objList);
+
+ waitCursor -state on;
+
+ // transform CV
+ float $xmin, $ymin, $zmin, $xmax, $ymax, $zmax;
+ int $count;
+ string $u = "";
+ string $v = "";
+ string $n = "";
+
+ int $threshArray[] = {};
+
+ for ($count = 0; $count < $listSize; $count++)
+ {
+ float $threshRnd = `rand 0 1`;
+
+ if ( $threshRnd >= $threshold )
+ {
+ $threshArray[$count] = 1;
+
+ $xmin = $ymin = $zmin = $xmax = $ymax = $zmax = 0;
+ if ($enX)
+ {
+ $xmin = $min;
+ $xmax = $max;
+ }
+ if ($enY)
+ {
+ $ymin = $min;
+ $ymax = $max;
+ }
+ if ($enZ)
+ {
+ $zmin = $min;
+ $zmax = $max;
+ }
+
+ if ( $transMode == 1 )
+ move -r -ws `rand $xmin $xmax` `rand $ymin $ymax` `rand $zmin $zmax` $objList[$count];
+ else if ( $transMode == 2 )
+ move -r -os `rand $xmin $xmax` `rand $ymin $ymax` `rand $zmin $zmax` $objList[$count];
+ else
+ {
+ $u += "-u " + ( `rand $xmin $xmax` ) + " ";
+ $v += "-v " + ( `rand $ymin $ymax` ) + " ";
+ $n += "-n " + ( `rand $zmin $zmax` ) + " ";
+ }
+ }
+ }
+
+ if ( $transMode == 3)
+ {
+ string $pointList = "";
+
+ for ( $cnt = 0; $cnt < size ( $threshArray ); $cnt++ )
+ {
+ if ( $threshArray[$cnt] )
+ $pointList += ( $objList[$cnt] + " " );
+ }
+
+ if ( size ( $pointList ) )
+ {
+ eval ( "moveVertexAlongDirection " + $n + $pointList );
+ eval ( "moveVertexAlongDirection " + $u + $pointList );
+ eval ( "moveVertexAlongDirection " + $v + $pointList );
+ }
+ }
+
+ waitCursor -state off;
+}
+
+// end of script
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.xpm b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.xpm
new file mode 100644
index 0000000..c8b61b6
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rndPoints.xpm
@@ -0,0 +1,828 @@
+/* XPM */
+static char *RNDPTS_xpm[]={
+"32 32 793 2",
+" c #22651C",
+" 0 c #508427",
+" 1 c #5A8E2B",
+" 2 c #598D2C",
+" 3 c #5B902E",
+" 4 c #5A8F2F",
+" 5 c #5A8E30",
+" 6 c #52882B",
+" 7 c #2E7722",
+" 8 c #226F20",
+" 9 c #226E20",
+" a c #58882F",
+" b c #5A852B",
+" c c #4F7B25",
+" d c #567D26",
+" e c #557B25",
+" f c #527824",
+" g c #507522",
+" h c #37681C",
+" i c #1C5C1B",
+" j c #1C5A1A",
+" k c #366921",
+" l c #4E6E1E",
+" m c #4D6C1D",
+" n c #4C6B1C",
+" o c #4B6A1B",
+" p c #4A691A",
+" q c #49671A",
+" r c #426418",
+" s c #205617",
+" t c #195317",
+" u c #185217",
+" v c #41751D",
+" w c #F3CB55",
+" x c #FED863",
+" y c #FFE36E",
+" z c #FFF581",
+" A c #FFFE8E",
+" B c #FFFF9B",
+" C c #FFFF9C",
+" D c #E5E37C",
+" E c #64892B",
+" F c #20691F",
+" G c #D7CC5B",
+" H c #FFE575",
+" I c #F9D365",
+" J c #F0CA5D",
+" K c #E3BD51",
+" L c #D7B347",
+" M c #D1AD42",
+" N c #C6A439",
+" O c #878423",
+" P c #1F5919",
+" Q c #9BAD4F",
+" R c #BA9C39",
+" S c #AF8E29",
+" T c #AB8B27",
+" U c #A78824",
+" V c #A38522",
+" W c #A18220",
+" X c #9E801F",
+" Y c #907B1B",
+" Z c #446013",
+" & c #185117",
+"0 c #40771D",
+"00 c #ECC44E",
+"01 c #F8CF59",
+"02 c #DDBD51",
+"03 c #D9C259",
+"04 c #D9CA60",
+"05 c #D9CF67",
+"06 c #E5E076",
+"07 c #FFFB8B",
+"08 c #E3D863",
+"09 c #3C701E",
+"0a c #D4C250",
+"0b c #FEDB6B",
+"0c c #F1CC5E",
+"0d c #CBAE44",
+"0e c #C2A53D",
+"0f c #BB9E37",
+"0g c #BA9B36",
+"0h c #C7A43A",
+"0i c #C19F36",
+"0j c #606F19",
+"0k c #A8B456",
+"0l c #B99C3A",
+"0m c #AE8E29",
+"0n c #97801E",
+"0o c #9A831D",
+"0p c #98821C",
+"0q c #96801B",
+"0r c #A08321",
+"0s c #9C7F1D",
+"0t c #947B18",
+"0u c #1F4811",
+"0v c #3E721C",
+"0w c #E2BB46",
+"0x c #EEC651",
+"0y c #B39721",
+"0z c #6F630F",
+"0A c #6A5E0F",
+"0B c #968326",
+"0C c #FFEA77",
+"0D c #F2DB6A",
+"0E c #687514",
+"0F c #CCB449",
+"0G c #F7D162",
+"0H c #B69C34",
+"0I c #74670F",
+"0J c #685C0F",
+"0K c #675C0E",
+"0L c #7D6D14",
+"0M c #CBAC3E",
+"0N c #BF9D34",
+"0O c #6F6515",
+"0P c #9A9A3C",
+"0Q c #B99C35",
+"0R c #AE8E28",
+"0S c #6A600B",
+"0T c #63590D",
+"0U c #5F560C",
+"0V c #6F620D",
+"0W c #D3BF67",
+"0X c #9F8321",
+"0Y c #9A7D1C",
+"0Z c #253207",
+"0& c #3B6E1C",
+"1 c #DBB641",
+"10 c #E6BF4A",
+"11 c #E1BC45",
+"12 c #D8B849",
+"13 c #D7B84D",
+"14 c #D9BB51",
+"15 c #F6D35E",
+"16 c #FEDA67",
+"17 c #D9B94C",
+"18 c #615E0D",
+"19 c #C9AD42",
+"1a c #ECC758",
+"1b c #B59B2E",
+"1c c #0D1D07",
+"1d c #081907",
+"1e c #1B280B",
+"1f c #D8B549",
+"1g c #BD9C33",
+"1h c #736716",
+"1i c #959535",
+"1j c #B89B32",
+"1k c #AD8E27",
+"1l c #3A3F08",
+"1m c #081B08",
+"1n c #122308",
+"1o c #E9D97D",
+"1p c #9F8323",
+"1q c #9A7E1B",
+"1r c #243107",
+"1s c #39691B",
+"1t c #D5B03C",
+"1u c #DFB943",
+"1v c #E4BE49",
+"1w c #E9C34E",
+"1x c #EDC753",
+"1y c #EEC854",
+"1z c #F3CD5A",
+"1A c #F3CD5B",
+"1B c #C9AB37",
+"1C c #303809",
+"1D c #C3A73B",
+"1E c #E4C050",
+"1F c #B1972B",
+"1G c #0C1D07",
+"1H c #081908",
+"1I c #0D2B0D",
+"1J c #20320E",
+"1K c #D6B047",
+"1L c #BC9B31",
+"1M c #726615",
+"1N c #959434",
+"1O c #B79B31",
+"1P c #AC8D26",
+"1Q c #393E08",
+"1R c #16290A",
+"1S c #F9E47A",
+"1T c #9F8322",
+"1U c #233107",
+"1V c #38661A",
+"1W c #D1AC38",
+"1X c #D9B43E",
+"1Y c #A68C24",
+"1Z c #917B1D",
+"1& c #927C1D",
+"2 c #8B771B",
+"20 c #A88E2F",
+"21 c #E8C350",
+"22 c #DDBA48",
+"23 c #48490D",
+"24 c #BBA237",
+"25 c #DCB949",
+"26 c #AC9228",
+"27 c #0C1C07",
+"28 c #103310",
+"29 c #194D18",
+"2a c #2B5719",
+"2b c #D1AD40",
+"2c c #BA9A2F",
+"2d c #706515",
+"2e c #938C33",
+"2f c #B6982F",
+"2g c #AB8D25",
+"2h c #383D08",
+"2i c #081A08",
+"2j c #1B340E",
+"2k c #FAE470",
+"2l c #233007",
+"2m c #386519",
+"2n c #CCA934",
+"2o c #D4AF39",
+"2p c #AF951E",
+"2q c #1F2C09",
+"2r c #081A07",
+"2s c #524F13",
+"2t c #DEBB48",
+"2u c #D7B443",
+"2v c #6D650E",
+"2w c #B59C37",
+"2x c #D4B242",
+"2y c #A88F25",
+"2z c #0F2E0E",
+"2A c #184917",
+"2B c #2A5318",
+"2C c #CDAB3B",
+"2D c #B8982D",
+"2E c #6D6213",
+"2F c #948732",
+"2G c #B5962E",
+"2H c #AA8C24",
+"2I c #5D5917",
+"2J c #5C5816",
+"2K c #636317",
+"2L c #C7B04A",
+"2M c #9C801B",
+"2N c #967B19",
+"2O c #192807",
+"2P c #396418",
+"2Q c #C9A631",
+"2R c #CFAB36",
+"2S c #AF931E",
+"2T c #4F4F12",
+"2U c #D7B441",
+"2V c #D0AE3D",
+"2W c #6C630E",
+"2X c #B19636",
+"2Y c #CEAD3D",
+"2Z c #A48B23",
+"2& c #0C1B07",
+"3 c #0C250B",
+"30 c #174716",
+"31 c #295018",
+"32 c #C9A837",
+"33 c #B5962B",
+"34 c #6B6012",
+"35 c #93832F",
+"36 c #B3942C",
+"37 c #A98B23",
+"38 c #A78921",
+"39 c #A48720",
+"3a c #A1841E",
+"3b c #9F831D",
+"3c c #9D811C",
+"3d c #665B0E",
+"3e c #081C08",
+"3f c #2A5B1A",
+"3g c #A48929",
+"3h c #A88D29",
+"3i c #A18A18",
+"3j c #22350C",
+"3k c #0D290C",
+"3l c #0E2E0E",
+"3m c #3E4715",
+"3n c #AB902F",
+"3o c #AA9229",
+"3p c #655D0D",
+"3q c #8F7B27",
+"3r c #A9912B",
+"3s c #927E1A",
+"3t c #111F07",
+"3u c #0B210A",
+"3v c #164415",
+"3w c #214915",
+"3x c #AE9529",
+"3y c #9D8720",
+"3z c #635C0F",
+"3A c #7A6F1B",
+"3B c #9C861F",
+"3C c #96821A",
+"3D c #958119",
+"3E c #938017",
+"3F c #927F16",
+"3G c #907F15",
+"3H c #827411",
+"3I c #55510B",
+"3J c #0F2008",
+"3K c #1A5519",
+"3L c #102108",
+"3M c #283109",
+"3N c #293109",
+"3O c #194F18",
+"3P c #195018",
+"3Q c #222E09",
+"3R c #2A3109",
+"3S c #55290A",
+"3T c #343615",
+"3U c #2B3109",
+"3V c #272E09",
+"3W c #071707",
+"3X c #0C240B",
+"3Y c #164115",
+"3Z c #154015",
+"3& c #2C3D0E",
+"4 c #152108",
+"40 c #142108",
+"41 c #262E08",
+"42 c #262F08",
+"43 c #252F08",
+"44 c #263008",
+"45 c #112108",
+"46 c #174A15",
+"47 c #154414",
+"48 c #194E17",
+"49 c #184C17",
+"4a c #184A17",
+"4b c #394726",
+"4c c #4A2F16",
+"4d c #D45629",
+"4e c #914C1D",
+"4f c #0E1C0A",
+"4g c #3D371C",
+"4h c #3B401D",
+"4i c #153E14",
+"4j c #133912",
+"4k c #081808",
+"4l c #071807",
+"4m c #081807",
+"4n c #195318",
+"4o c #184D17",
+"4p c #184B17",
+"4q c #174917",
+"4r c #174816",
+"4s c #DD9762",
+"4t c #E98A54",
+"4u c #6B4E22",
+"4v c #604F22",
+"4w c #544D22",
+"4x c #43411C",
+"4y c #C66232",
+"4z c #C5602F",
+"4A c #1A3F15",
+"4B c #143C14",
+"4C c #2A4419",
+"4D c #614F25",
+"4E c #1D1F0B",
+"4F c #222B0F",
+"4G c #1F220C",
+"4H c #171F0A",
+"4I c #101D09",
+"4J c #195118",
+"4K c #0C260B",
+"4L c #0F300E",
+"4M c #174916",
+"4N c #6E8C5A",
+"4O c #688054",
+"4P c #7E5B28",
+"4Q c #835726",
+"4R c #585225",
+"4S c #554E23",
+"4T c #5F582B",
+"4U c #BDA46C",
+"4V c #A37542",
+"4W c #695123",
+"4X c #515524",
+"4Y c #4D5424",
+"4Z c #7F5626",
+"4& c #DF6430",
+"5 c #523915",
+"50 c #273515",
+"51 c #1F3012",
+"52 c #AE5424",
+"53 c #F46A30",
+"54 c #303714",
+"55 c #192A0F",
+"56 c #16280E",
+"57 c #92481C",
+"58 c #F9672B",
+"59 c #413713",
+"5a c #0E2D0D",
+"5b c #184F17",
+"5c c #174A16",
+"5d c #234C1B",
+"5e c #E18C6A",
+"5f c #DF7756",
+"5g c #6D6331",
+"5h c #626632",
+"5i c #5D602C",
+"5j c #565226",
+"5k c #694E25",
+"5l c #C25C32",
+"5m c #8D4520",
+"5n c #4E4B22",
+"5o c #4F4C22",
+"5p c #605D2B",
+"5q c #846B36",
+"5r c #80602C",
+"5s c #615E2A",
+"5t c #5F612B",
+"5u c #61622C",
+"5v c #885D28",
+"5w c #985824",
+"5x c #5F612A",
+"5y c #5E6029",
+"5z c #5D5F28",
+"5A c #9C5622",
+"5B c #AF3810",
+"5C c #204012",
+"5D c #144113",
+"5E c #184D16",
+"5F c #174C16",
+"5G c #174B16",
+"5H c #164515",
+"5I c #5C421B",
+"5J c #54280B",
+"5K c #626737",
+"5L c #626736",
+"5M c #5E6231",
+"5N c #777450",
+"5O c #7D7956",
+"5P c #5D4A22",
+"5Q c #584A22",
+"5R c #4F4A22",
+"5S c #514C23",
+"5T c #925C30",
+"5U c #EF8A52",
+"5V c #82592B",
+"5W c #60612D",
+"5X c #63642E",
+"5Y c #946931",
+"5Z c #FA7E40",
+"5& c #8F612C",
+"6 c #61632B",
+"60 c #60622A",
+"61 c #5D6029",
+"62 c #EA6129",
+"63 c #E5662B",
+"64 c #144013",
+"65 c #164715",
+"66 c #224718",
+"67 c #4C5326",
+"68 c #51572A",
+"69 c #565B2D",
+"6a c #575C2F",
+"6b c #575C2E",
+"6c c #CC8C79",
+"6d c #ECB5A4",
+"6e c #633C1A",
+"6f c #504A24",
+"6g c #534E26",
+"6h c #565128",
+"6i c #645128",
+"6j c #874D24",
+"6k c #705D2D",
+"6l c #646230",
+"6m c #666330",
+"6n c #895C2A",
+"6o c #AF4F21",
+"6p c #7A602B",
+"6q c #64652E",
+"6r c #62642C",
+"6s c #67612A",
+"6t c #A44519",
+"6u c #9A320C",
+"6v c #133F12",
+"6w c #50733D",
+"6x c #CCD59D",
+"6y c #836B42",
+"6z c #40481F",
+"6A c #454C22",
+"6B c #484E24",
+"6C c #4C5126",
+"6D c #505529",
+"6E c #563C1C",
+"6F c #661F08",
+"6G c #393217",
+"6H c #4F4A26",
+"6I c #56512B",
+"6J c #887E4F",
+"6K c #C2A870",
+"6L c #7C6B3F",
+"6M c #686136",
+"6N c #6D6739",
+"6O c #76683A",
+"6P c #98733F",
+"6Q c #7E713A",
+"6R c #6B6D36",
+"6S c #696B34",
+"6T c #666831",
+"6U c #6E6830",
+"6V c #90642C",
+"6W c #3F4718",
+"6X c #133E12",
+"6Y c #164915",
+"6Z c #164815",
+"6& c #164615",
+"7 c #72491E",
+"70 c #D36844",
+"71 c #8B3916",
+"72 c #3E451D",
+"73 c #3E451E",
+"74 c #40471F",
+"75 c #414720",
+"76 c #454A21",
+"77 c #454421",
+"78 c #3C391B",
+"79 c #413D1E",
+"7a c #4F4927",
+"7b c #57512E",
+"7c c #9D5530",
+"7d c #D67447",
+"7e c #754E2C",
+"7f c #7A744A",
+"7g c #827A50",
+"7h c #957548",
+"7i c #F27F46",
+"7j c #C16D3A",
+"7k c #757744",
+"7l c #767843",
+"7m c #71733D",
+"7n c #916531",
+"7o c #F3632B",
+"7p c #BF5D27",
+"7q c #183F13",
+"7r c #29260B",
+"7s c #373413",
+"7t c #3D441C",
+"7u c #3D441D",
+"7v c #75795D",
+"7w c #B0B0A2",
+"7x c #5A5337",
+"7y c #3F3B1C",
+"7z c #443F1F",
+"7A c #4B4625",
+"7B c #55502D",
+"7C c #5B5230",
+"7D c #634A2B",
+"7E c #7C724A",
+"7F c #837C54",
+"7G c #898359",
+"7H c #977C52",
+"7I c #893F1F",
+"7J c #804F2D",
+"7K c #807D51",
+"7L c #828451",
+"7M c #7D804C",
+"7N c #806436",
+"7O c #9F3D18",
+"7P c #69350D",
+"7Q c #164614",
+"7R c #154514",
+"7S c #314218",
+"7T c #2C3614",
+"7U c #3A421B",
+"7V c #3C431C",
+"7W c #3C441C",
+"7X c #AB6A52",
+"7Y c #E8ADA1",
+"7Z c #6B371D",
+"7& c #3C391A",
+"8 c #403C1D",
+"80 c #464221",
+"81 c #4F4A28",
+"82 c #595330",
+"83 c #645E38",
+"84 c #6E6741",
+"85 c #77714A",
+"86 c #7F7850",
+"87 c #827C53",
+"88 c #847E54",
+"89 c #827C52",
+"8a c #7F7950",
+"8b c #7D794D",
+"8c c #7B7D4B",
+"8d c #595D35",
+"8e c #0D2C0D",
+"8f c #113810",
+"8g c #164714",
+"8h c #918E53",
+"8i c #6D733F",
+"8j c #3A431A",
+"8k c #3B431B",
+"8l c #3B431C",
+"8m c #3D431C",
+"8n c #2F2E11",
+"8o c #461B06",
+"8p c #2D220D",
+"8q c #3D391B",
+"8r c #413D1D",
+"8s c #474221",
+"8t c #ABA88F",
+"8u c #BEBC96",
+"8v c #685C37",
+"8w c #605A34",
+"8x c #67613B",
+"8y c #6D6740",
+"8z c #716B43",
+"8A c #736D45",
+"8B c #756F47",
+"8C c #767048",
+"8D c #757047",
+"8E c #746E45",
+"8F c #716C43",
+"8G c #595A34",
+"8H c #0A2009",
+"8I c #10330F",
+"8J c #3C4F1D",
+"8K c #EB935C",
+"8L c #DA6B3C",
+"8M c #3F3E17",
+"8N c #3B431A",
+"8O c #3C421C",
+"8P c #303215",
+"8Q c #2A2811",
+"8R c #3E3A1B",
+"8S c #423E1E",
+"8T c #BB6D53",
+"8U c #E49F7D",
+"8V c #5F4624",
+"8W c #5C5631",
+"8X c #645E37",
+"8Y c #CF9860",
+"8Z c #DE995E",
+"8& c #74623A",
+"9 c #6B653E",
+"90 c #6B663E",
+"91 c #6B653D",
+"92 c #68633B",
+"93 c #8B6034",
+"94 c #2F290F",
+"95 c #154614",
+"96 c #513A0F",
+"97 c #6A380E",
+"98 c #174214",
+"99 c #214216",
+"9a c #304218",
+"9b c #39431B",
+"9c c #616646",
+"9d c #6E7255",
+"9e c #4A502B",
+"9f c #3E431D",
+"9g c #3D3C1B",
+"9h c #423E1D",
+"9i c #464220",
+"9j c #473719",
+"9k c #48250D",
+"9l c #59532D",
+"9m c #5D5730",
+"9n c #605A33",
+"9o c #C8461F",
+"9p c #DC6333",
+"9q c #5D502D",
+"9r c #666139",
+"9s c #726037",
+"9t c #FB7338",
+"9u c #FF7538",
+"9v c #1F240C",
+"9w c #144313",
+"9x c #144213",
+"9y c #163F13",
+"9z c #B6A08E",
+"9A c #FBF1EF",
+"9B c #874F30",
+"9C c #3F451D",
+"9D c #3F421D",
+"9E c #403C1C",
+"9F c #433F1E",
+"9G c #474220",
+"9H c #4C4723",
+"9I c #4F4A25",
+"9J c #534D28",
+"9K c #56502A",
+"9L c #59542D",
+"9M c #5C562F",
+"9N c #4E4423",
+"9O c #493317",
+"9P c #5D5832",
+"9Q c #625C35",
+"9R c #625D35",
+"9S c #73542D",
+"9T c #A52807",
+"9U c #C5350F",
+"9V c #101F09",
+"9W c #081D08",
+"9X c #133E13",
+"9Y c #4F350D",
+"9Z c #98310F",
+"9& c #443910",
+"a c #223E16",
+"a0 c #333C19",
+"a1 c #6A664A",
+"a2 c #565130",
+"a3 c #4E4924",
+"a4 c #514C26",
+"a5 c #544E29",
+"a6 c #57512B",
+"a7 c #59532C",
+"a8 c #5A552E",
+"a9 c #5E5931",
+"aa c #5E5932",
+"ab c #4D4A27",
+"ac c #1D1F09",
+"ad c #144413",
+"ae c #143F13",
+"af c #133D12",
+"ag c #133C12",
+"ah c #133B12",
+"ai c #0B1B09",
+"aj c #2C341E",
+"ak c #FFFFFF",
+"al c #F3E4D9",
+"am c #534622",
+"an c #504A25",
+"ao c #534D27",
+"ap c #554F29",
+"aq c #56512A",
+"ar c #58522B",
+"as c #59542C",
+"at c #5A552D",
+"au c #5B562E",
+"av c #5C572F",
+"aw c #5B562F",
+"ax c #13230D",
+"ay c #091D08",
+"az c #154413",
+"aA c #131A07",
+"aB c #A22F13",
+"aC c #AA3E23",
+"aD c #19250E",
+"aE c #2E3317",
+"aF c #434220",
+"aG c #534E27",
+"aH c #7A683C",
+"aI c #BF935C",
+"aJ c #866C3E",
+"aK c #58532B",
+"aL c #58532C",
+"aM c #59552D",
+"aN c #17270F",
+"aO c #092009",
+"aP c #0E2C0D",
+"aQ c #0D1D09",
+"aR c #8E6038",
+"aS c #F5A266",
+"aT c #B87948",
+"aU c #514D27",
+"aV c #57522A",
+"aW c #57532B",
+"aX c #5C542B",
+"aY c #1C2A11",
+"aZ c #091E08",
+"a& c #134012",
+"b c #0C280B",
+"b0 c #311D07",
+"b1 c #832205",
+"b2 c #5B2006",
+"b3 c #0B1D09",
+"b4 c #19270F",
+"b5 c #2A3316",
+"b6 c #3D401F",
+"b7 c #4E4C26",
+"b8 c #C66D36",
+"b9 c #E06E35",
+"ba c #8B4D22",
+"bb c #144513",
+"bc c #0E2E0D",
+"bd c #D04E1D",
+"be c #F0652D",
+"bf c #9F5023",
+"bg c #144112",
+"bh c #134112",
+"bi c #123D11",
+"bj c #0C280C",
+"bk c #0D2B0C",
+"bl c #4C2307",
+"bm c #852606",
+"bn c #3E2207",
+" 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u",
+" v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z &",
+"0 000102030405060708090a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u",
+"0v0w0x0y0z0A0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z",
+"0&1 101112131415161718191a1b1c1d1d1e1f1g1h1i1j1k1l1m1m1n1o1p1q1r",
+"1s1t1u1v1w1x1y1z1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1m1m1R1S1T1q1U",
+"1V1W1X1Y1Z1&2 202122232425262728292a2b2c2d2e2f2g2h2i1m2j2k0X1q2l",
+"2m2n2o2p2q2i2r2s2t2u2v2w2x2y272z2A2B2C2D2E2F2G2H0O2I2J2K2L2M2N2O",
+"2P2Q2R2S2q2r1d2T2U2V2W2X2Y2Z2&3 303132333435363738393a3b3c2M3d3e",
+"3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3J3e",
+"3K3L3M3N3O3P3O293Q3R3S3T3U3V3W3X3Y3Z3&3V4 40414142434344451m1m3e",
+"461m2i2i4748494a4b4c4d4e4f3W4g4h4i4i4j4k3W3W4l4l4m1d1d2r2i1m1m3e",
+"4n1m2i2r4o4p4q4r4s4t4u4v4w4x4y4z4A4B4C4D4E3W3W4F4G1d1d1d4H4I1m3e",
+"4J4K1I4L4p4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4&5 505152535455565758595a",
+"5b4o495c4M5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5A5B5C5D",
+"5E5F5G4r4r5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5&6 606162636464",
+"5G5c4M655H666768696a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v64",
+"5c4M656w6x6y6z6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6v",
+"6Y6Z6&7 707172737475767778797a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p6X6v",
+"6Z656&7q7r7s7t7u727v7w7x7y7z7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P6X6v",
+"6Z7Q7R7S7T7U7V7W7u7X7Y7Z7&8 80818283848586878887898a8b8c8d8e8f6X",
+"8g8h8i8j8k8k8l7V8m8n8o8p8q8r8s8t8u8v8w8x8y8z8A8B8C8D8E8F8G1m8H8I",
+"8J8K8L8M8N8k8k7V7t8O8P8Q8R8S8s8T8U8V8W8w8X8Y8Z8&9 90919293943e3e",
+"95969798999a9b9c9d9e9f9g8R9h9i9j9k7a9l9m9n9o9p9q9r9r9r9s9t9u9v3e",
+"7R479w9x5D649y9z9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9R9S9T9U9V9W",
+"7R479w9x5D649X9Y9Z9&a a09E9Fa1a2a3a4a5a6a7a89M9ma9aaaaa9abac3e9W",
+"7Rad9w9x5Dae6v6Xafagah5aaiajakalamanaoapaqarasatauauavawauax9Way",
+"az9w9w9x5D646v6Xafagag8I1daAaBaCaDaEaFaGaHaIaJaKaL9L9LaMasaNayaO",
+"ad9w9w9x5D646v6XafafagaP2r2r2r2r2r2r2raQaRaSaTaUaqaVaWaWaXaYayaZ",
+"adad9w9x5Da&6v6v6Xafafb 2i2i2i2i2i2i2i2ib0b1b2b3b4b5b6b7b8b9baaZ",
+"bbad9w9x5Da&a&6v6X6Xafbc1m1m1m1m1m1m1m1m1m1m1m3e3e3e9WaybdbebfaZ",
+"bbad9w9xbgbha&6v6vbibjbk3e1m1may1m1m1m1m3e3e3e9W9WayaZaZblbmbnaO"};
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rp_help.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rp_help.mel
new file mode 100644
index 0000000..3f8bd46
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/rp_help.mel
@@ -0,0 +1,184 @@
+/* rpts_help.mel
+
+This script may be freely distributed. Modify at your own risk.
+
+Author: Dirk Bialluch (DirkBi@Software2000.de)
+
+Creation date: 15.10.2000
+Last update: 15.10.2000
+
+*/
+
+//
+// Create UI
+//
+
+global proc rp_help ( int $function )
+{
+ int $uiLabelWidth = 150;
+ int $uiInputWidth = 80;
+ int $uiWidth = $uiLabelWidth + $uiInputWidth + 220;
+
+ if ( `window -exists rp_help` )
+ deleteUI rp_help;
+
+ window
+ -maximizeButton false
+ -resizeToFitChildren false
+ -title "Randomize Points Help"
+ -iconName "Ranomdize Points Help" rp_help;
+
+ tabLayout -innerMarginWidth 5 -innerMarginHeight 5 -childResizable true rp_helpTab;
+ string $rp1_form = `formLayout -numberOfDivisions 100 "Randomize Points"`;
+ string $rp1_scroll = `scrollLayout -hst 16 -vst 16 -childResizable true -minChildWidth $uiWidth`;
+ columnLayout -adjustableColumn true -rowSpacing 6;
+// randomize points - instructions
+ frameLayout
+ -label "Instructions"
+ -labelAlign "center"
+ -cll false
+ -lw $uiWidth
+ -mh 3
+ -borderStyle "etchedIn"
+ -bv true;
+ columnLayout -adjustableColumn true;
+ rowLayout
+ -numberOfColumns 1
+ -cat 1 "left" 5;
+ text rp1_instructions;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+
+ string $rp1_button = `button
+ -label "Close"
+ -command "deleteUI rp_help"`;
+ setParent ..;
+
+ string $rp2_form = `formLayout -numberOfDivisions 100 "About"`;
+ string $rp2_scroll = `scrollLayout -hst 16 -vst 16 -childResizable true -minChildWidth $uiWidth`;
+ columnLayout -adjustableColumn true -rowSpacing 6;
+// about
+ frameLayout
+ -label "About Randomize Points"
+ -labelAlign "center"
+ -cll false
+ -lw $uiWidth
+ -mh 3
+ -borderStyle "etchedIn"
+ -bv true;
+ columnLayout -adjustableColumn true;
+ rowLayout
+ -numberOfColumns 1
+ -cat 1 "left" 5;
+ text rp2_instructions;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+
+ string $rp2_button = `button
+ -label "Close"
+ -command "deleteUI rp_help"`;
+
+ // set form layouts
+ formLayout -edit
+ -attachForm $rp1_scroll "top" 4
+ -attachForm $rp1_scroll "left" 4
+ -attachControl $rp1_scroll "bottom" 4 $rp1_button
+ -attachForm $rp1_scroll "right" 4
+ $rp1_form;
+
+ formLayout -edit
+ -attachNone $rp1_button "top"
+ -attachForm $rp1_button "left" 4
+ -attachForm $rp1_button "bottom" 4
+ -attachForm $rp1_button "right" 4
+ $rp1_form;
+
+ formLayout -edit
+ -attachForm $rp2_scroll "top" 4
+ -attachForm $rp2_scroll "left" 4
+ -attachControl $rp2_scroll "bottom" 4 $rp2_button
+ -attachForm $rp2_scroll "right" 4
+ $rp2_form;
+
+ formLayout -edit
+ -attachNone $rp2_button "top"
+ -attachForm $rp2_button "left" 4
+ -attachForm $rp2_button "bottom" 4
+ -attachForm $rp2_button "right" 4
+ $rp2_form;
+/*
+ Enable Axes
+ Enable/disable the world space, object space or distance axes depending on the Transform
+ Mode settings.
+*/
+ string $rp1_instructions =
+ "This tool randomizes the position of selected CV´s, Poly Vertices and Lattice Points.\n" +
+ "\n" +
+ "Workflow tips\n" +
+ " To avoid problems at object poles when deforming eg a nurbs sphere, better bind\n" +
+ " the object to a lattice and randomize the lattice points instead.\n" +
+ "\n" +
+ "Intensity\n" +
+ " The Intensity value is measured in world or object space units depending on the.\n" +
+ " chosen Transform Mode. A value of 1 will displace the selected points within a\n" +
+ " maximum range of -0.5 to 0.5, if Intensity Range is set to 0. If you are using the\n" +
+ " object space mode, object scale values are taken into account.\n" +
+ "\n" +
+ "Intensity Range\n" +
+ " Shift the displacement toward the positive or negative value range. If Intensity is\n" +
+ " set to 2, an Intensity Range of 100% will shift the displacement completely to a\n" +
+ " positive range from 0 to 2. Setting the value to -100% would result in a range from\n" +
+ " -2 to 0.\n" +
+ "\n" +
+ "Min/Max Value\n" +
+ " These values show the final displacement range.\n" +
+ "\n" +
+ "Threshold\n" +
+ " Increase the Threshold value to leave a certain amount of points unaffected. When\n" +
+ " leaving this value at 0, all points will be affected. A value of 0.8 will skip\n" +
+ " approximately 80% of all selected points and randomize the remaining 20%.\n" +
+ "\n" +
+ "Use Seed Value\n" +
+ " Enable/disable the usage of a seed value for the randomize function.\n" +
+ "\n" +
+ "Seed\n" +
+ " The Seed value inits the randomize function, so the deformation is repeatable.\n" +
+ " The function will only produce identical results, if the points are always selected\n" +
+ " in the same order.\n" +
+ "\n" +
+ "Transform Mode\n" +
+ " World Space will displace points along the enabled world space axes.\n" +
+ " Object Space will displace points along the enabled object space axes.\n" +
+ " Distance will displace points along the enabled normal, u and v tangent.\n" +
+ " Lattice points are not affected by this transform node, because they do not have\n" +
+ " UVN properties.\n" +
+ "\n" +
+ "Enable Axes\n" +
+ " Enable/disable the axes depending on the Transform Mode settings.\n";
+
+ string $rp2_instructions =
+ "Randomize Points V1.6\n" +
+ "\n" +
+ "Programmed by Dirk Bialluch, 1998-2000\n" +
+ "\n" +
+ "This script may be freely distributed.\n" +
+ "Modify at your own risk.\n" +
+ "\n" +
+ "Email: 'DirkBi@Software2000.de'\n" +
+ "Homepage: 'http://dirk-bialluch.mayaring.com'";
+
+ text -e -label $rp1_instructions rp1_instructions;
+ text -e -label $rp2_instructions rp2_instructions;
+
+ tabLayout -e -selectTabIndex $function rp_helpTab;
+
+ showWindow rp_help;
+}
+
+// end of script
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/searchReplaceWin.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/searchReplaceWin.mel
new file mode 100644
index 0000000..2bf7f1f
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/searchReplaceWin.mel
@@ -0,0 +1,87 @@
+//
+// Copyright (C) 1997-2001 Alias|Wavefront,
+// a division of Silicon Graphics Limited.
+//
+// The information in this file is provided for the exclusive use of the
+// licensees of Alias|Wavefront. Such users have the right to use, modify,
+// and incorporate this code into other products for purposes authorized
+// by the Alias|Wavefront license agreement, without fee.
+//
+// ALIAS|WAVEFRONT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+// INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+// EVENT SHALL ALIAS|WAVEFRONT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+//
+// Alias|Wavefront Script File
+// MODIFY THIS AT YOUR OWN RISK
+///
+//
+//
+// searchReplaceWin.mel
+// CPAM June 4, 1999
+// revised July 2001
+//
+//
+// This will search and replace object
+// names for selected objects. Suggest
+// using on a skeleton after copying
+// an arm or leg.
+//
+
+
+global proc searchReplace (){
+
+ global string $searchText;
+ global string $replaceText;
+ global string $objects[];
+
+ $objects = `ls -sl`;
+ $searchText = `textField -q -text searchText`;
+ $replaceText = `textField -q -text replaceText`;
+
+ for ($object in $objects){
+
+ string $newName = `substitute $searchText $object $replaceText`;
+ print "Object: ";
+ print $object;
+ print " New name: ";
+ print $newName;
+ print "\n";
+ rename $object $newName;
+ }
+
+}
+
+
+global proc searchReplaceWin (){
+
+ window -title "Object Renamer"
+ objectRenamer;
+ columnLayout;
+
+ text "Search Text:";
+ textField -w 200
+ -text "right"
+ searchText;
+
+ text "Replace Text:";
+ textField -w 200
+ -text "left"
+ replaceText;
+
+ button -label "Search and Replace!"
+ -command "searchReplace"
+ doIt;
+
+ showWindow objectRenamer;
+
+}
+
+
+
+
+
+
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/selectInst.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/selectInst.mel
new file mode 100644
index 0000000..3e01da5
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/selectInst.mel
@@ -0,0 +1,36 @@
+global proc selectInst()
+{
+ string $orig[];
+ clear($orig);
+ $orig = `ls -sl -tr`;
+ string $origShape[];
+ clear($origShape);
+ $origShape = `ls -sl -dag -lf`;
+ string $token[];
+ clear($token);
+ int $numTok;
+ $numTok = `tokenize $origShape[0] "|" $token`;
+ string $select[];
+ clear($select);
+ int $index;
+ int $count;
+ $count = 0;
+// if(`strcmp $orig[0] $token[0]`!=0)
+// { error "No Original Geometry Selected!!";}
+// else
+// {
+ string $objects[]= `ls -tr`;
+ for($object in $objects)
+ {
+ string $objShape[] = `ls -dag -lf $object`;
+ if(`strcmp $origShape[0] $objShape[0]` == 0)
+ {
+ select -add $object;
+ $select[$count] = $object;
+ $count++;
+ }
+ }
+// }
+ print "\n";
+ print $select;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel
new file mode 100644
index 0000000..0d631df
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel
@@ -0,0 +1,17 @@
+global proc setShapeNode()
+{
+ string $objects[] = `ls -sl -tr`;
+ print ("\n");
+ print $objects;
+ for($object in $objects)
+ {
+ string $shapes[] = `ls -dag -lf $object`;
+ print ("\n");
+ print $shapes;
+ for($shape in $shapes)
+ {
+ string $parents[] = `listRelatives -p $shape`;
+ rename $shape ($parents[0]+ "Shape");
+ }
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/simpsonsArt.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/simpsonsArt.mel
new file mode 100644
index 0000000..0f6dcf3
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/simpsonsArt.mel
@@ -0,0 +1,334 @@
+/* simpsonsArt.mel
+
+ THIS IS AN UPDATE TO JEFF PIDSADNY'S SIMPSONS ART MENU SCRIPT.
+ THIS REVISION HAS MAINLY CHANGED THE LOOK OF THE GUI AND ADDED
+ ICONS INSTEAD OF TEXT.
+
+ AUTHOR: ARYAN HANBECK
+
+ JULY 03 2002
+
+*/
+
+//
+// SOURCE ALL SCRIPTS AND DEFINE GLOBAL PROCEDURES
+//
+
+
+//===========================================================================
+// validBMP
+//===========================================================================
+// Description: Maya's UI layout will BOMB if you attempt to create a UI
+// control that contains an image (a 'symbolButton' for example)
+// where the specified image does not exist.
+//
+// This function queries the folders specified in the XBMLANGPATH
+// environment variable for the specified BMP image. If the
+// image is found, its name is returned. If the image is not
+// found, the default image "vacantCell.xpm" is returned instead.
+//
+// Suggested use is to specify the image for a control by
+// wrapping it within validBMP(); e.g.:
+//
+// symbolButton -image ( validBMP( "myImage.bmp" );
+//
+// Constraints:
+//
+// Parameters: string $bmp: The name of the BMP image (no path, please).
+//
+// Return: (string): If specified BMP is valid, the BMP name is
+// returned; if the BMP is not valid "vacantCell.xpm"
+// is returned.
+//
+//===========================================================================
+
+
+ proc string validBMP( string $bmp )
+{
+ string $validBMP = "vacantCell.xpm";
+
+ string $pathEnv = `getenv XBMLANGPATH`;
+ string $paths[];
+ tokenize $pathEnv ";" $paths;
+ for ( $p in $paths )
+ {
+ string $bmpPath = ( $p + "/" + $bmp );
+ if ( `file -q -exists $bmpPath` )
+ {
+ $validBMP = $bmp;
+ break;
+ }
+ }
+
+ return $validBMP;
+}
+
+
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/renameScripts.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/optimizeShaders.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/mappedPrelightWindow.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/rndPoints.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.mel";
+source "C:/AW/Maya4.0/scripts/SimpsonsArt/uvz.mel";
+
+
+
+global proc setShapeNode()
+{
+ source "C:/AW/Maya4.0/scripts/SimpsonsArt/setShapeNode.mel";setShapeNode;
+}
+
+global proc uvz()
+{
+ source "C:/AW/Maya4.0/scripts/SimpsonsArt/uvz.mel";
+}
+
+global proc nameSpaceGui()
+{
+ source "C:/AW/Maya4.0/scripts/SimpsonsArt/nameSpaceGui.mel";
+}
+
+global proc renameTexture()
+{
+ source "C:/AW/Maya4.0/scripts/SimpsonsArt/renameTexture.mel";renameTexture;
+}
+
+global proc simpsonsExporterOptions()
+{
+setAttr "p3dDefaultExporterSetting.exportVertexOffsetAnims" 0;
+setAttr "p3dDefaultExporterSetting.exportVisAnimations" 0;
+setAttr "p3dDefaultExporterSetting.exportAnimations" 0;
+
+}
+
+global proc litOff()
+{
+ string $mats[] = `ls -type pure3dSimpleShader`;
+ for($mat in $mats)
+ {
+ $attr = $mat + ".dynamicallyLit";
+ setAttr $attr 0;
+ $attrs = $mat + ".color";
+ shadingConnection -e -cs on $attrs;
+ FixHWTextureInfo( $mat );
+ }
+// for($mat in $mats)
+// {
+// $attr = $mat + ".doubleSided";
+// setAttr $attr 0;
+// $attrs = $mat + ".color";
+// shadingConnection -e -cs on $attrs;
+// }
+}
+
+global proc backfaceOff()
+{
+ string $objects[] = `ls -sl -dag -s`;
+ print ("\n");
+ print $objects;
+ for($object in $objects)
+ {
+ setAttr ( $object + ".opposite") 0;
+ }
+}
+
+
+if(`window -ex "SAMmainwindow"`)
+{
+ deleteUI -wnd "SAMainWindow";
+}
+
+//
+//CREATE THE GUI WINDOW AND ADD THE BUTTONS
+//
+
+global proc simpsonsArt()
+{
+window
+ -visible 1
+ -title "SAM"
+ -sizeable 0
+ -iconify 0
+ -wh 147 300
+ -maximizeButton 0
+ SAMmainWindow;
+ columnLayout -adj true;
+ frameLayout
+ -label "Geometry"
+ -labelAlign "center"
+ -cll true
+ SAMgeometryFrame;
+
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMgeometryRow;
+
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/rnd.bmp"
+ -ann "Random Points"
+ -c "rndPoints"
+ SAMrndPoints;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/backfaceoff.bmp"
+ -ann "Backface Off"
+ -c "backfaceOff"
+ SAMbackfaceOff;
+ setParent ..;
+ setParent ..;
+
+ frameLayout
+ -label "Lighting"
+ -labelAlign "center"
+ -cll true
+ -bv true
+ SAMlightingFrame;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMlightingRow;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/prelighttool.bmp"
+ -ann "Simpsons Prelight"
+ -c "mappedPrelightWindow"
+ SAMsimpsonsPreLight;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/prelitoff.bmp"
+ -ann "Prelit Off"
+ -c "litOff"
+ SAMpreLitOff;
+ setParent ..;
+ setParent ..;
+
+ frameLayout
+ -label "Textures"
+ -labelAlign "center"
+ -cll true
+ -bv true
+ SAMtextureFrame;
+ columnLayout -adjustableColumn 1 SAMtextureColumn;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMtextureRow;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/renametex.bmp"
+ -ann "RenameTextures"
+ -c "renameTexture"
+ SAMrenameTextures;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/movetex.bmp"
+ -ann "Move Textures"
+ -c "yuya_copyFileTex"
+ SAMoveFiles;
+ setParent ..;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMtextureRow2;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/optimizetex.bmp"
+ -ann "Optimize Shaders"
+ -c "optimizeShaders"
+ SAMoptimizeShaders;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/uvz.bmp"
+ -ann "UVz Utility"
+ -c "uvz"
+ SAMuvz;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ frameLayout
+ -label "Hypergraph"
+ -labelAlign "center"
+ -cll true
+ -bv true
+ SAMhypergraphFrame;
+ columnLayout -adjustableColumn 1 SAMhypegraphColumn;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMhypergraphRow;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/setshape.bmp"
+ -ann "Set Shape Node"
+ -c "setShapeNode"
+ SAMsetShapeNode;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/removetxt.bmp"
+ -ann "Remove Text String"
+ -c "nameSpaceGui"
+ SAMremoveTextString;
+ setParent ..;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMHypergraphRow2;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/unique.bmp"
+ -ann "Force Unique Names"
+ -c "forceUniqueNames"
+ SAMforceUniqueNames;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/p3d.bmp"
+ -ann "Set Exporter Options"
+ -c "simpsonsExporterOptions"
+ SAMsetExporterOptions;
+ setParent ..;
+ rowLayout
+ -numberOfColumns 2
+ -columnWidth 1 68
+ -columnWidth 2 68
+ SAMhypergraphRow3;
+ string $name = `textField -width 68`;
+ symbolButton
+ -w 68
+ -h 28
+ -image "C:/AW/Maya4.0/scripts/SimpsonsArt/icons/renamesh.bmp"
+ -ann "Rename Shapes"
+ -c ("renameShape `textField -q -text " + $name + "`")
+ renameShape;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+ setParent ..;
+
+ window -e
+ -wh 147 295
+ SAMmainWindow;
+
+}
+// end of script \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/snapCurveY.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/snapCurveY.mel
new file mode 100644
index 0000000..8292125
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/snapCurveY.mel
@@ -0,0 +1,75 @@
+global proc int srrRound( float $val )
+{
+ int $intPart = trunc( $val );
+ float $decPart = $val - $intPart;
+
+ $val = $intPart;
+ if ( $decPart >= 0.5 ) $val += 1;
+
+ return $val;
+}
+
+
+global proc snapCurveY( float $precision )
+{
+ $precision = abs( $precision );
+
+ string $curves[];
+ $curves = `ls -type nurbsCurve`;
+
+ string $curve;
+ for ( $curve in $curves )
+ {
+ int $numcvs;
+ string $curvecmd = ($curve + ".cp");
+ $numcvs = `eval getAttr -size $curvecmd`;
+
+ float $cv[ 3 ];
+ int $i = 0;
+ for ( $i = 0; $i < $numcvs; $i++ )
+ {
+ $curvecmd = ($curve + ".cp[" + $i + "]");
+ $cv = `eval getAttr $curvecmd`;
+
+ if ( $precision == 1 )
+ {
+ $cv[ 1 ] = ceil( $cv[ 1 ] );
+ }
+
+ if ( $precision > 1 )
+ {
+ float $div = $cv[ 1 ] / $precision;
+
+ int $integerpart = trunc( $div );
+ float $decpart = $div - $integerpart;
+
+ if ( $decpart < 0.5 )
+ {
+ $decpart = 0;
+ }
+ else
+ {
+ $decpart = 1;
+ }
+
+ float $newdiv = $integerpart + $decpart;
+
+ $cv[ 1 ] = $precision * $newdiv;
+ }
+
+ if ( $precision < 1 )
+ {
+ float $div = $cv[ 1 ] / $precision;
+
+ $div = srrRound( $div );
+
+ float $newdec = $precision * $div;
+
+ $cv[ 1 ] = $newdec;
+ }
+
+ $curvecmd = ($curve + ".cp[" + $i + "].yv");
+ eval setAttr $curvecmd $cv[ 1 ];
+ }
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/uvz.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/uvz.mel
new file mode 100644
index 0000000..a53ed85
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/uvz.mel
@@ -0,0 +1,226 @@
+//===========================================================================
+// Copyright ©2001 Radical Entertainment Ltd. All rights reserved.
+//
+// Created: 13 Nov 2001
+//
+// Component: MEL Script for Maya.
+// Provides useful UV editing operations.
+//
+// Creator: Bryan Ewert
+//
+// Version: 1.0
+// Tested on Maya v3 and v4.
+//
+//===========================================================================
+
+// ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
+//
+// How to use:
+//
+// Call this script. A UI will be provided with the following functions:
+//
+// Spin: Spins the UVs around the selected face(s).
+//
+// Reverse Spin: Spins the UVs the other direction.
+// Auto Map Cut: Cuts the UV seams on all edges of the face prior
+// to performing the Spin operation.
+//
+// Note: The "Auto Map Cut" option is always immediately turned off.
+// It is only necessary to cut the edges once for a particular
+// face, and the Construction History stack will be inflated
+// with unnecessary 'polyMapCut' operations if not. //
+//
+// ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
+
+//===========================================================================
+// getUVsInOrder
+//===========================================================================
+// Description: Returns the UV components for the specified face in proper
+// "construction" order.
+//
+// See < http://www.ewertb.com/maya/mel/mel_a55.html >
+//
+// Constraints:
+//
+// Parameters: string $face: The face component for which to retrieve the UVs.
+//
+// Return: (string[]) The UV components associated with the specified face.
+//
+//===========================================================================
+proc string[] getUVsInOrder( string $face )
+{
+ string $uvOrder[];
+
+ string $vtxFace[] = `polyListComponentConversion -ff -tvf $face`;
+ $vtxFace = `filterExpand -sm 70 -ex true $vtxFace`;
+
+ for ( $vf in $vtxFace )
+ {
+ string $uv[] = `polyListComponentConversion -fvf -tuv $vf`;
+ $uvOrder[`size $uvOrder`] = $uv[0];
+ }
+
+ return $uvOrder;
+}
+
+//===========================================================================
+// getFaceEdges
+//===========================================================================
+// Description: Returns the edge components that construct the specified face.
+//
+// Constraints:
+//
+// Parameters: string $face: The face for which to retrieve the edges.
+//
+// Return: (string[]): The edge components.
+//
+//===========================================================================
+proc string[] getFaceEdges( string $face )
+{
+ string $edges[] = `polyListComponentConversion -ff -te $face`;
+ $edges = `filterExpand -sm 32 -ex true $edges`;
+
+ return $edges;
+}
+
+//===========================================================================
+// performSpinUVz
+//===========================================================================
+// Description: Invoked when the user presses the "Spin UVz" button.
+// Spins the UVs.
+//
+// Constraints: If at least one polymesh face component is not selected
+// then no action is taken.
+//
+// The "Auto Map Cut" option is always immediately turned off.
+// It is only necessary to cut the edges once for a particular
+// face, and the Construction History stack will be inflated
+// with unnecessary 'polyMapCut' operations if not. Eventually
+// I may determine a way to detect if an auto-cut is necessary
+// and just skip the step when applicable.
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc performSpinUVz()
+{
+ string $faces[] = `filterExpand -sm 34 -ex true`;
+
+ if ( `size $faces` > 0 )
+ {
+ string $select[] = `ls -sl`;
+
+ int $reverse = `checkBox -q -value rad_uvzReverse`;
+ int $autoCut = `checkBox -q -value rad_uvzAutoCut`;
+
+ for ( $face in $faces )
+ {
+ if ( $autoCut )
+ {
+ // Only need to cut edges if any of the vertices
+ string $edges[] = getFaceEdges( $face );
+ polyMapCut $edges;
+ }
+
+ string $uvOrder[] = getUVsInOrder( $face );
+ print $uvOrder;
+ print "------\n";
+ int $numUVs = `size $uvOrder`;
+ float $uv[];
+ float $u[], $v[];
+
+ for ( $i = 0; $i < $numUVs; $i++ )
+ {
+ $uv = `polyEditUV -q $uvOrder[$i]`;
+ $u[`size $u`] = $uv[0];
+ $v[`size $v`] = $uv[1];
+ }
+
+ for ( $i = 0; $i < $numUVs; $i++ )
+ {
+ int $next;
+
+ if ( $reverse )
+ {
+ $next = ( $i + ( $numUVs - 1 ) ) % $numUVs;
+ }
+ else
+ {
+ $next = ( $i + 1 ) % $numUVs;
+ }
+
+ polyEditUV -r false -u $u[$next] -v $v[$next] $uvOrder[$i];
+ }
+ }
+
+ checkBox -e -value off rad_uvzAutoCut;
+
+ select -r $select;
+ }
+ else
+ {
+ warning( "UVz: No action taken -- Please select one or more faces." );
+ }
+}
+
+//===========================================================================
+// uvz
+//===========================================================================
+// Description: Generates the UI for this script.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc uvz()
+{
+ if ( `window -exists raduvz` )
+ deleteUI -window raduvz;
+
+ window -title "UVz" -iconName "UVz" raduvz;
+
+ columnLayout -adjustableColumn true;
+
+ string $spinFrame = `frameLayout -label "Spin UVz on Face"`;
+
+ string $spinForm = `formLayout`;
+
+ string $spinReverse = `checkBox -label "Reverse Spin" rad_uvzReverse`;
+ string $spinAutoCut = `checkBox -label "Auto Map Cut" rad_uvzAutoCut`;
+ string $spinUVz = `button -label "Spin UVz"`;
+
+ setParent ..;
+
+ setParent ..;
+
+ setParent ..;
+
+ setParent ..;
+
+ formLayout -e
+
+ -af $spinReverse "top" 4
+ -af $spinReverse "left" 4
+
+ -ac $spinAutoCut "top" 4 $spinReverse
+ -af $spinAutoCut "left" 4
+
+ -ac $spinUVz "top" 4 $spinAutoCut
+ -af $spinUVz "left" 4
+ -af $spinUVz "right" 4
+ -af $spinUVz "bottom" 2
+
+ $spinForm;
+
+ // Attach command callbacks
+ button -e
+ -c performSpinUVz
+ $spinUVz;
+
+ showWindow raduvz;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.mel
new file mode 100644
index 0000000..7c018f9
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.mel
@@ -0,0 +1,172 @@
+//
+// Copy File Textures Ver.1.51
+//
+// Created by Yuya Sugiyama < yuya@sb.sakura.ne.jp >
+// Last Modify : 16th/December/2001
+// Please check my web site -INVISIBLE-.
+// URL : http://sb.sakura.ne.jp/~yuya/
+//
+// Description:
+// This script copies file textures in current scene to current sourceimages
+// directory. This script makes your file management easier.
+//
+// Usage:
+// Type
+//
+// yuya_copyFileTex;
+//
+// Then appear the window. Set options and hit "Copy File Textures" button.
+// Using specify directory option, path must be terminated in "\"(backslash).
+// (If you use browse button, unnecessary paying attention to this limitation.)
+//
+// Please use (and modify) this at your own lisk.
+//
+
+
+// Start window procedure
+
+global proc yuya_copyFileTex () {
+
+if ((`window -ex yuya_copyFileTex`) == true) deleteUI yuya_copyFileTex;
+window -t "Copy File Texture" -w 420 -h 100 yuya_copyFileTex;
+columnLayout -adj 1;
+
+frameLayout -l "Copy File Texture" -la "center" -bs "etchedIn" -cll 1 -cl 0;
+
+columnLayout -adj 1;
+radioButtonGrp -w 330 -cw3 140 100 100 -nrb 2 -label "Which Files?" -la2 "All Files" "Selected Files" -select 1 yuya_allOrSel;
+
+columnLayout -adj 1;
+radioButtonGrp -w 330 -cw3 140 100 100 -nrb 2 -label "Mofify Texture Node?" -la2 "Yes" "No" -select 1 yuya_modTexNode;
+
+checkBoxGrp -l "Specify Directory"
+ -onCommand
+ "textFieldGrp -e -ed true yuya_cftDirField;
+ symbolButton -e -enable true yuya_cftBrowseButton;"
+ -offCommand
+ "textFieldGrp -e -ed false yuya_cftDirField;
+ symbolButton -e -enable false yuya_cftBrowseButton;"
+ yuya_cftCB;
+
+rowLayout -w 330 -nc 2 -cw2 380 40 -cal 1 "right" yuya_cftDirNameLayout;
+textFieldGrp -l "Directory" -ed false -w 375 yuya_cftDirField;
+symbolButton
+ -enable false
+ -image "navButtonBrowse.xpm"
+ -c "yuya_getDirProc" yuya_cftBrowseButton;
+
+setParent..;
+setParent..;
+setParent..;
+setParent..;
+
+button -l "Copy File Textures." -c "yuya_copyFileTexMain (`radioButtonGrp -q -select yuya_allOrSel`) (`radioButtonGrp -q -select yuya_modTexNode`)";
+
+showWindow;
+
+}
+
+// End create window procedure
+
+
+// Start copy file textures procedure
+
+global proc int yuya_copyFileTexMain ( int $allOrSel, int $modTexNode ) {
+
+if ( $allOrSel == 1 ) {
+ select -all;
+}
+
+string $path[] = `ls -sl -type file`;
+select -cl;
+
+if ( $allOrSel == 2 ) {
+ select -add $path;
+}
+
+string $copyPath;
+
+if (`checkBoxGrp -q -value1 yuya_cftCB`){
+
+ $copyPath = `textFieldGrp -q -fileName yuya_cftDirField`;
+
+}else{
+ $copyPath =`workspace -q -rd`+"sourceimages/";
+ for ($i=1; $i<=17; $i++){
+ $copyPath = `substitute "/" $copyPath "\\"`;
+ }
+}
+
+string $batchName = `file -q -sceneName`;
+
+if( `size($batchName)` ){
+ string $tokBatName[];
+ int $numTokenB = `tokenize $batchName "/" $tokBatName`;
+ $batchName = $tokBatName[$numTokenB-1] +".bat";
+ $batchName = `substitute ".ma" $batchName ""`;
+ $batchName = `substitute ".mb" $batchName ""`;
+
+}else{
+ $batchName = "untitled.bat";
+}
+
+system ("echo on>"+$copyPath+"copyFileTex_"+$batchName);
+
+string $current;
+for ( $current in $path ) {
+
+ string $currentFullPath = `getAttr ($current + ".ftn")`;
+
+ string $tokFileName[];
+ int $numToken = `tokenize $currentFullPath "/" $tokFileName`;
+ string $fileName = $tokFileName[$numToken-1];
+
+ for ($i=1; $i<=17; $i++){
+ $currentFullPath = `substitute "/" $currentFullPath "\\"`;
+ }
+
+ system ("echo copy \""+$currentFullPath+"\" \""+$copyPath+"\">>\""+$copyPath+"copyFileTex_"+$batchName+"\"");
+
+
+}
+
+system ("echo del \""+$copyPath+"copyFileTex_"+$batchName+"\">>\""+$copyPath+"copyFileTex_"+$batchName+"\"");
+system ("start \""+$copyPath+"copyFileTex_"+$batchName+"\"");
+
+if ($modTexNode == 1){
+
+ for ( $current in $path ) {
+
+ string $currentFullPath = `getAttr ($current + ".ftn")`;
+
+ string $tokFileName[];
+ int $numToken = `tokenize $currentFullPath "/" $tokFileName`;
+ string $fileName = $tokFileName[$numToken-1];
+
+ setAttr ( $current + ".ftn" ) -type "string" ($copyPath+$fileName);
+
+ }
+
+}
+
+return 1;
+
+}
+
+// End copy file textures procedure
+
+
+// Get Directory Name
+
+global proc yuya_getDirProc(){
+
+fileBrowser "yuya_getDirNameProc" "Select Directory" "directory" 4;
+
+}
+
+global proc yuya_getDirNameProc(string $dir, string $type){
+
+textFieldGrp -e -fileName ($dir+"\\") yuya_cftDirField;
+
+}
+
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.xpm b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.xpm
new file mode 100644
index 0000000..ef06b32
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/yuya_copyFileTex.xpm
@@ -0,0 +1,198 @@
+/* XPM */
+static char *FILE_xpm[]={
+"32 32 163 2",
+" c #C1C1C1",
+" 0 c #9C9C00",
+" 1 c #FFFF9C",
+" 2 c #9D9C01",
+" 3 c #9F9D04",
+" 4 c #A29F0A",
+" 5 c #A6A111",
+" 6 c #ABA317",
+" 7 c #AFA61E",
+" 8 c #FFFE9C",
+" 9 c #FFFC9C",
+" a c #FFF79C",
+" b c #FFF29C",
+" c c #FFED9C",
+" d c #F9E095",
+" e c #A69720",
+" f c #000000",
+" g c #FFFFFF",
+" h c #FFE79C",
+" i c #EDCC86",
+" j c #8F7717",
+" k c #FFFD9C",
+" l c #FFF39C",
+" m c #FFE89C",
+" n c #FFE29C",
+" o c #E6C07E",
+" p c #836614",
+" q c #FFF89C",
+" r c #FFE39C",
+" s c #FFDE9C",
+" t c #E6BC7E",
+" u c #856615",
+" v c #FFFB9C",
+" w c #FFEE9C",
+" x c #FFDA9C",
+" y c #E6BA7E",
+" z c #866817",
+" A c #FFD69C",
+" B c #8D8700",
+" C c #6E5D00",
+" D c #FFE99C",
+" E c #9E9D03",
+" F c #F0E7A5",
+" G c #F0E3A5",
+" H c #D0A99C",
+" I c #945866",
+" J c #C0AC92",
+" K c #E6DD7E",
+" L c #B49840",
+" M c #9F9E06",
+" N c #D1C8A8",
+" O c #BC0000",
+" P c #DD0000",
+" Q c #E00305",
+" R c #CF7777",
+" S c #A3A33A",
+" T c #E5E59B",
+" U c #A29F09",
+" V c #A5A10F",
+" W c #A9A315",
+" X c #A9A072",
+" Y c #572323",
+" Z c #E20507",
+" & c #D26364",
+"0 c #E6E6AB",
+"00 c #652425",
+"01 c #D50609",
+"02 c #E40607",
+"03 c #D65151",
+"04 c #EDE6A2",
+"05 c #F4F4A3",
+"06 c #B7B3B3",
+"07 c #591212",
+"08 c #BD0304",
+"09 c #FFF59C",
+"0a c #BDBBBB",
+"0b c #6B1313",
+"0c c #D5080A",
+"0d c #DB4A44",
+"0e c #EDE686",
+"0f c #C7B257",
+"0g c #B8964B",
+"0h c #B49740",
+"0i c #B49640",
+"0j c #B49540",
+"0k c #B49440",
+"0l c #C7AB57",
+"0m c #EDDC86",
+"0n c #A4A429",
+"0o c #D81511",
+"0p c #E10A09",
+"0q c #E45F48",
+"0r c #E3362A",
+"0s c #E7090A",
+"0t c #E6DC7E",
+"0u c #E6DB7E",
+"0v c #E6D97E",
+"0w c #E6D87E",
+"0x c #E6D67E",
+"0y c #E6D47E",
+"0z c #F9EA95",
+"0A c #FFF09C",
+"0B c #AAA23E",
+"0C c #B57C67",
+"0D c #BE0706",
+"0E c #E5090B",
+"0F c #FEFD9C",
+"0G c #FFFA9C",
+"0H c #FFF19C",
+"0I c #FFEF9C",
+"0J c #B40D04",
+"0K c #D50508",
+"0L c #E20608",
+"0M c #F2D892",
+"0N c #FFF99C",
+"0O c #FFF69C",
+"0P c #FFF49C",
+"0Q c #FFEA9C",
+"0R c #BBB9B9",
+"0S c #652324",
+"0T c #5A1614",
+"0U c #773E2B",
+"0V c #B60304",
+"0W c #D60A0B",
+"0X c #E8090B",
+"0Y c #E8966D",
+"0Z c #FFEC9C",
+"0& c #AAAA49",
+"1 c #B8AF9D",
+"10 c #825757",
+"11 c #86523D",
+"12 c #822617",
+"13 c #994D30",
+"14 c #D0281C",
+"15 c #E5080A",
+"16 c #DA5D52",
+"17 c #E9E5A9",
+"18 c #FFEB9C",
+"19 c #FFE59C",
+"1a c #E5E5AB",
+"1b c #BBAB90",
+"1c c #946543",
+"1d c #903E27",
+"1e c #973536",
+"1f c #E9E4A9",
+"1g c #FFE49C",
+"1h c #E4E2AC",
+"1i c #E4E1AC",
+"1j c #E4E0AC",
+"1k c #AE9278",
+"1l c #E9E2A9",
+"1m c #FFE69C",
+"1n c #FFE09C",
+"1o c #FFE19C",
+"1p c #FFDF9C",
+"1q c #FFDD9C",
+"1r c #FFDB9C",
+"1s c #FFDC9C",
+"1t c #FFD89C",
+"1u c #FFD99C",
+"1v c #FFD79C",
+"1w c #FFD59C",
+"1x c #FFD49C",
+" ",
+" 0 0 0 ",
+" 0 0 0 1 0 0 0 ",
+" 0 0 1 1 1 1 1 0 2 3 4 5 6 7 ",
+" 0 1 1 1 1 1 1 8 9 a b c d e f f f g g g f f f g g g ",
+" 0 1 1 1 1 1 8 9 a b c h i j f f f g g g f f f g g g ",
+" 0 1 1 1 1 k 9 a l c m n o p f f f g g g f f f g g g ",
+" 0 1 1 1 k 9 q l c m r s t u g g g f f f g g g f f f ",
+" 0 1 1 k v q l w m r s x y z g g g f f f g g g f f f ",
+" 0 8 k v q l w m r s x A B C g g g f f f g g g f f f ",
+" 2 k v q l w D r s 0 0 0 B C f f f g g g f f f g g g ",
+" E v q F G H I J 0 0 1 1 K L f f f g g g f f f g g g ",
+" M q l N O P Q R S T 1 1 K L f f f g g g f f f g g g ",
+" U V W X Y O Q Z &0 1 1 K L g g g f f f g g g f f f 0 0 ",
+" 0001 Z02030405 K L g g g f f f g g g f f f a 0 ",
+" 06070802020304 K L g g g f f f g g g f f f09 0 ",
+" 0a0b0c02020d0e0f0g L L L L0h0h0i0j0k0l0m b 0 ",
+" 0n0b0o020p0q0r0s K K0t0u0u0v0w0x0y0m0z0A 0 ",
+" 0B0C0D02 Z0E0s0s0F 8 k v0G q a09 l0H0I c 0 ",
+" 0J0K020L Z0s0s0s0M 9 v0N q0O0P l0H0I c0Q 0 ",
+" 0R0S0T0U0V0W0s0X0s0Y v0N q0O0P b0A w0Z0Q m 0 ",
+" 0&1 1011121314151617 a09 l b0I w18 D h19 0 ",
+" 01a1a1a1b101c1d1e1f09 l0H0I c18 D h1g n 0 ",
+" 0 1 8 k1h1i1j1f1k1l b0A w0Z0Q m1m1g n1n 0 ",
+" 0 8 k 90G0N a0O0P b0A w0Z0Q m19 r1o1p1q 0 ",
+" 0 k 90G q a09 l0H0I c18 D h19 r1o1p1q1r 0 ",
+" 0 v0G q0O09 l0H0I c18 D1m1g n1n s1s x1t 0 ",
+" 00N q0O0P b0A w0Z0Q m1m1g n1p s1r x1t A 0 ",
+" 0 a090P b0A w0Z D h19 r1o1p1q1r1u1v1w1x 0 ",
+" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ",
+" ",
+" "};
diff --git a/tools/MayaTools/Maya4.0/scripts/others/TerrainType.mel b/tools/MayaTools/Maya4.0/scripts/others/TerrainType.mel
new file mode 100644
index 0000000..79026d6
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/TerrainType.mel
@@ -0,0 +1,426 @@
+//===========================================================================
+// Copyright ©2002 Radical Entertainment Ltd. All rights reserved.
+//
+// Component: TerrainType.mel
+//
+// Description: Provides a UI for applying the Pure3D Game Attribute
+// '.TerrainType' to Materials.
+//===========================================================================
+
+//===========================================================================
+// version
+//===========================================================================
+// Description: Returns the current version for this MEL script.
+// Used for version control.
+//===========================================================================
+proc float version()
+{
+ return ( 1.1 );
+}
+
+// ////////////////////////////////////////////////////////////////
+// rootNode
+//
+// Description: Strips the dot-suffix of the specified string.
+// e.g. "object.attribute" is returned as "object"
+
+proc string rootNode( string $object )
+{
+ string $buffer[];
+ tokenize $object "." $buffer;
+ return $buffer[0];
+}
+
+proc string getFacetSG( string $facet )
+// Input (string) - facet component to query (e.g. "pSphere1.f[0]")
+// Result (string) - Shading Group shading facet (e.g. "lambert2SG")
+{
+ string $facetSG = "";
+
+ // Get array of all Shading Groups
+ string $shadingGroups[] = `ls -type shadingEngine`;
+
+ for ( $shadingGroup in $shadingGroups )
+ {
+ // If this facet is a member of the shading set for this
+ // Shading Group, tag this as the facet's shader
+
+ // NOTE: This _fails!_ if the entire object is assigned to the shader,
+ // and no face components are represented in the Shading Group set.
+ if ( `sets -isMember $shadingGroup $facet` )
+ {
+ $facetSG = $shadingGroup;
+ break;
+ }
+ }
+
+ return $facetSG;
+}
+
+// //////////////////////////////////////////////////////////////////////
+// getMaterialFromSG
+//
+// Description: Returns the Material node feeing the '.surfaceShader'
+// attribute of the specified Shading Group node (shadingEngine).
+
+proc string getMaterialFromSG( string $SG )
+{
+ string $material = "";
+
+ if ( "shadingEngine" == `nodeType $SG` && `connectionInfo -id ( $SG + ".surfaceShader" )` )
+ $material = rootNode( `connectionInfo -sfd ( $SG + ".surfaceShader" )` );
+
+ return $material;
+}
+
+// ////////////////////////////////////////////////////////////////////////
+// getSGFromMaterial
+//
+// Description: Returns the Shading Group node being fed by the '.outColor'
+// attribute of the specified Material node
+proc string[] getSGFromMaterial( string $material )
+{
+ string $SG[];
+
+ string $class[] = getClassification( `nodeType $material` );
+
+ if ( "shader/surface" == $class[0] && `connectionInfo -is ( $material + ".outColor" )` )
+ {
+ string $dests[] = `connectionInfo -dfs ( $material + ".outColor" )`;
+ for ( $dest in $dests )
+ {
+ if ( "shadingEngine" == `nodeType $dest` )
+ {
+ $SG[`size $SG`] = rootNode( $dest );
+ }
+ }
+ }
+
+ return $SG;
+}
+
+proc int TerrainTypeEnum()
+{
+ string $enumUI = "TerrainTypeEnumUI";
+ string $interiorUI = "TerrainTypeInteriorUI";
+
+ int $enumType = `optionMenu -q -select $enumUI`;
+ $enumType--; // Convert from 1-based to 0-based
+ $enumType--; // Skip "Undefined"
+
+ int $isInterior = `checkBox -q -value $interiorUI`;
+ if ( $isInterior ) $enumType += 1073741824; // ( 2 ** 30 )
+
+ return $enumType;
+}
+
+proc SetTerrainTypeEnum( int $enumType )
+{
+ int $bIsInterior = false;
+
+ if ( $enumType > 1073741823 )
+ {
+ $enumType -= 1073741824; // ( 2 ** 30 )
+ $bIsInterior = true;
+ }
+
+ $enumType++; // Skip "Undefined"
+ $enumType++; // Convert from 0-based to 1-based
+
+ string $enumUI = "TerrainTypeEnumUI";
+ string $interiorUI = "TerrainTypeInteriorUI";
+
+ optionMenu -e -select $enumType $enumUI;
+ checkBox -e -value $bIsInterior $interiorUI;
+}
+
+proc string[] GetSelectionAsFaces()
+{
+ string $select[] = `ls -sl`;
+
+ $select = `polyListComponentConversion -tf $select`;
+ $select = `filterExpand -sm 34 -ex true $select`;
+
+ return $select;
+}
+
+proc int HasTerrainAttr( string $node, string $TerrainAttr )
+{
+ if ( `attributeQuery -node $node -exists $TerrainAttr` ) return true;
+ return false;
+}
+
+proc AssignTerrainType( string $node, string $TerrainAttr, int $type )
+{
+ if ( HasTerrainAttr( $node, $TerrainAttr ) )
+ {
+ setAttr ( $node + "." + $TerrainAttr ) $type;
+ }
+}
+
+proc int GetTerrainType( string $node, string $TerrainAttr )
+{
+ int $type = 0;
+ if ( HasTerrainAttr( $node, $TerrainAttr ) )
+ {
+ $type = `getAttr ( $node + "." + $TerrainAttr )`;
+ }
+ return $type;
+}
+
+proc int AddTerrainTypeAttr( string $node, string $TerrainAttr )
+{
+ // Does the .TerrainType attr exist?
+ if ( `attributeQuery -node $node -exists $TerrainAttr` )
+ {
+ return false;
+ }
+
+ // Add the P3DGameAttr
+ if ( !`attributeQuery -node $node -exists "P3D_GameAttr"` )
+ {
+ addAttr -ln P3D_GameAttr -dt "string" -hidden true $node;
+ }
+
+ // Add the TerrainAttr to the P3DGameAttr
+ string $gameAttr = `getAttr ( $node + ".P3D_GameAttr" )`;
+ if ( $gameAttr != "" )
+ {
+ $gameAttr += "~";
+ }
+ $gameAttr = $gameAttr + $TerrainAttr;
+ setAttr -type "string" ( $node + ".P3D_GameAttr" ) $gameAttr;
+
+ // Add the .TerrainType attribute
+ addAttr -ln $TerrainAttr -at "long" -hidden true $node;
+
+ return true;
+}
+
+global proc TerrainType_Apply( string $TerrainAttr )
+{
+ int $type = TerrainTypeEnum();
+ if ( $type < 0 ) return; // Don't bother with "Undefined"
+
+ string $materials[] = `ls -sl -materials`;
+
+ for ( $m in $materials )
+ {
+ if ( ( $m == "lambert1" ) || ( $m == "particleCloud1" ) ) continue;
+
+ AddTerrainTypeAttr( $m, $TerrainAttr );
+
+ AssignTerrainType( $m, $TerrainAttr, $type );
+ }
+}
+
+global proc TerrainType_ApplyIndirect( string $TerrainAttr )
+{
+ int $type = TerrainTypeEnum();
+ if ( $type < 0 ) return; // Don't bother with "Undefined"
+
+ string $select[] = GetSelectionAsFaces();
+
+ for ( $f in $select )
+ {
+ string $sg = getFacetSG( $f );
+
+ if ( ( $sg == "" ) || ( $sg == "initialShadingGroup" ) ) continue;
+
+ string $mat = getMaterialFromSG( $sg );
+
+ if ( $mat != "" )
+ {
+ AddTerrainTypeAttr( $mat, $TerrainAttr );
+
+ AssignTerrainType( $mat, $TerrainAttr, $type );
+ }
+ }
+}
+
+global proc TerrainType_Select( string $TerrainAttr )
+{
+ int $enumType = TerrainTypeEnum();
+
+ string $matches[];
+
+ string $materials[] = `ls -materials`;
+
+ for ( $m in $materials )
+ {
+ if ( ( $m == "lambert1" ) || ( $m == "particleCloud1" ) ) continue;
+
+ if (
+ ( HasTerrainAttr( $m, $TerrainAttr ) && GetTerrainType( $m, $TerrainAttr ) == $enumType ) ||
+ ( $enumType < 0 ) && ( !HasTerrainAttr( $m, $TerrainAttr ) )
+ )
+ {
+ $matches[`size $matches`] = $m;
+ }
+ }
+
+ select $matches;
+
+}
+
+global proc TerrainType_SelectIndirect( string $TerrainAttr )
+{
+ int $enumType = TerrainTypeEnum();
+
+ string $matches[];
+
+ string $materials[] = `ls -materials`;
+
+ for ( $m in $materials )
+ {
+ if (
+ ( HasTerrainAttr( $m, $TerrainAttr ) && GetTerrainType( $m, $TerrainAttr ) == $enumType ) ||
+ ( $enumType < 0 ) && ( !HasTerrainAttr( $m, $TerrainAttr ) )
+ )
+ {
+ string $sg[] = getSGFromMaterial( $m );
+ for ( $s in $sg )
+ {
+ $matches[`size $matches`] = $s;
+ }
+ }
+
+ }
+
+ // Don't alter user selection if nothing found.
+ if ( `size $matches` > 0 )
+ {
+ select $matches;
+ }
+}
+
+global proc TerrainType_SelectionCallback( string $TerrainAttr )
+{
+ string $materials[] = `ls -sl -materials`;
+ if ( `size $materials` > 0 )
+ {
+ if ( HasTerrainAttr( $materials[0], $TerrainAttr ) )
+ {
+ int $type = `getAttr ( $materials[0] + "." + $TerrainAttr )`;
+ SetTerrainTypeEnum( $type );
+ }
+ else
+ {
+ SetTerrainTypeEnum( -1 );
+ }
+
+ TerrainType_EnumCallback(); // update the optionMenu
+ }
+}
+
+global proc TerrainType_EnumCallback()
+{
+ string $enumUI = "TerrainTypeEnumUI";
+ string $applyMaterialUI = "TerrainTypeApplyMaterialUI";
+ string $applyObjectUI = "TerrainTypeApplyObjectUI";
+
+ int $enable = `optionMenu -q -select $enumUI` > 1;
+ button -e -enable $enable $applyMaterialUI;
+ button -e -enable $enable $applyObjectUI;
+}
+
+global proc TerrainType()
+{
+ string $TerrainAttr = "TerrainType";
+
+ string $windowUI = "TerrainTypeUI";
+
+ string $enumUI = "TerrainTypeEnumUI";
+ string $interiorUI = "TerrainTypeInteriorUI";
+ string $applyMaterialUI = "TerrainTypeApplyMaterialUI";
+ string $applyObjectUI = "TerrainTypeApplyObjectUI";
+
+ string $enumArray[] =
+ {
+ "* Undefined *",
+ "Road",
+ "Grass",
+ "Sand",
+ "Gravel",
+ "Water",
+ "Wood",
+ "Metal",
+ "Dirt"
+ };
+
+ if ( `window -exists $windowUI` )
+ deleteUI -window $windowUI;
+
+ window -title ( "Terrain Type v" + version() ) $windowUI;
+
+ columnLayout -adj true;
+
+ frameLayout -label "Surface";
+ columnLayout -adj true;
+ optionMenu $enumUI;
+ for ( $e = 0; $e < `size $enumArray`; $e++ )
+ {
+ menuItem -label $enumArray[$e];
+ }
+ checkBox -label "Interior" -align "left" $interiorUI;
+ setParent ..;
+ setParent ..;
+
+ frameLayout -label "Materials";
+ columnLayout -adj true;
+
+ button
+ -label "Apply To Materials"
+ -c ( "TerrainType_Apply \"" + $TerrainAttr + "\"" )
+ -ann "Applies the displayed Terrain Type to all selected Materials."
+ $applyMaterialUI;
+ button
+ -label "Select Assigned Materials"
+ -c ( "TerrainType_Select \"" + $TerrainAttr + "\"" )
+ -ann "Selects all Materials assigned to the displayed Terrain Type.";
+
+
+ setParent ..;
+
+ setParent ..;
+
+
+ frameLayout -label "Objects";
+ columnLayout -adj true;
+
+ button
+ -label "Apply To Objects"
+ -c ( "TerrainType_ApplyIndirect \"" + $TerrainAttr + "\"" )
+ -ann "Applies the displayed Terrain Type to all Materials assigned to the selected objects."
+ $applyObjectUI;
+ button
+ -label "Select Assigned Objects"
+ -c ( "TerrainType_SelectIndirect \"" + $TerrainAttr + "\"" )
+ -ann "Selects all objects assigned to Materials bearing the displayed Terrain Type.";
+ setParent ..;
+
+ setParent ..;
+
+ setParent ..;
+
+ // Option Menu should respond to user selection, to reflect current type
+ // of selected material
+ scriptJob -parent $enumUI -event "SelectionChanged" ( "TerrainType_SelectionCallback \"" + $TerrainAttr + "\"" );
+
+ optionMenu -e
+ -cc TerrainType_EnumCallback
+ -select 2
+ $enumUI;
+
+ checkBox -e
+ -value off
+ $interiorUI;
+
+ TerrainType_SelectionCallback $TerrainAttr;
+
+ showWindow $windowUI;
+}
+
+/*
+source TerrainType; TerrainType;
+*/
diff --git a/tools/MayaTools/Maya4.0/scripts/others/bobsMenu.mel b/tools/MayaTools/Maya4.0/scripts/others/bobsMenu.mel
new file mode 100644
index 0000000..b8c5b4a
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/bobsMenu.mel
@@ -0,0 +1,33 @@
+global proc bobsMenu(){
+
+ global string $gMainWindow;
+
+ setParent $gMainWindow;
+
+ menu -l "Bobs Menu"
+ -p MayaWindow
+ -to 1
+ -aob true
+ -fi "bob_Mr_T.bmp"
+ bobsMenu;
+
+ menuItem -l "Refresh Layers"
+ -ann ("")
+ -echoCommand true
+ -c "reBuildLayers"
+ reBuildLayers;
+
+ menuItem -divider true;
+
+ menuItem -l "Persp To Ortho"
+ -ann ("")
+ -echoCommand true
+ -c "swapCamera 0"
+ swapCamera;
+
+ menuItem -l "Back To Persp"
+ -ann ("")
+ -echoCommand true
+ -c "swapCamera 1"
+ swapCamera2;
+}; \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/os_cleanup.mel b/tools/MayaTools/Maya4.0/scripts/others/os_cleanup.mel
new file mode 100644
index 0000000..020de04
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/os_cleanup.mel
@@ -0,0 +1,3 @@
+
+
+os_RemoveUI(); \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/os_main.mel b/tools/MayaTools/Maya4.0/scripts/others/os_main.mel
new file mode 100644
index 0000000..7a8c567
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/os_main.mel
@@ -0,0 +1,228 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// TE_main.mel
+//
+// Description: Installs the Object Snapper (OS) interface.
+// As a convention all Object Snapper global procedures
+// and global variables are prefixed with "os_". All commands
+// exposed through OS plugins are prefixed with "OS_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created March 18 2002 -- Cary Brisebois
+//-----------------------------------------------------------------------------
+
+
+global float $gOS_Offset = 0.10;
+
+
+//-----------------------------------------------------------------------------
+// o s _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// o s _ M C B _ A b o u t
+//
+// Synopsis: Display an About Object Snapper window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_MCB_About()
+{
+ string $pluginVersion = "1.0";
+
+ string $message = ( "\nSimpsons Road Rage Object Snapper.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About Object Snapper"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// o s _ d o M a i n M e n u I t e m s
+//
+// Synopsis: Creates the OS menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_doMainMenuItems( string $menu )
+{
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Snap Single Selected" -command ( "os_MCB_SnapSingleSelected()" );
+
+ menuItem -divider true;
+
+ menuItem -label "Snap All Selected" -command ( "os_MCB_SnapSelected()" );
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Tree Line" -command ( "os_MCB_SnapTreeLine()" );
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "os_MCB_About()";
+
+ menuItem -optionBox true -command "os_MCB_OSOptions()";
+
+ setParent -m ..;
+}
+
+//-----------------------------------------------------------------------------
+// o s _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install OS menu as a root menu.
+ //
+ if ( `menu -exists os_MainMenu` ) deleteUI os_MainMenu;
+ menu -label "Object Snapper" -allowOptionBoxes true -parent $gMainWindow os_MainMenu;
+
+ os_doMainMenuItems "os_MainMenu";
+}
+
+//==============================================================================
+// global proc os_RemoveUI
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_RemoveUI()
+{
+ if ( `menu -exists os_MainMenu` ) deleteUI os_MainMenu;
+ if ( `window -exists os_OptionWindow` ) deleteUI os_OptionWindow;
+}
+
+//==============================================================================
+// global proc os_MCB_SnapSelected
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_SnapSelected()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 0 );
+}
+
+
+//==============================================================================
+// global proc os_MCB_SnapSingleSelected
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_SnapSingleSelected()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 1 );
+}
+
+//=============================================================================
+// global proc os_MCB_SnapTreeLine
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//=============================================================================
+global proc os_MCB_SnapTreeLine()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 2 );
+}
+
+//==============================================================================
+// global proc os_MCB_OSOptions
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_OSOptions()
+{
+ global float $gOS_Offset;
+
+ if ( `window -exists os_OptionWindow` ) deleteUI os_OptionWindow;
+
+ window -title "Object Snapper Options" os_OptionWindow;
+
+ columnLayout;
+
+ rowLayout -nc 2;
+
+ text -label "Offset (M):";
+
+ floatField -min -10.0 -max 10.0 -value $gOS_Offset -cc ("$gOS_Offset = #1");
+
+ setParent ..;
+
+ setParent ..;
+
+ showWindow;
+}
+
+evalDeferred "os_InstallUI"; \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/reBuildLayers.mel b/tools/MayaTools/Maya4.0/scripts/others/reBuildLayers.mel
new file mode 100644
index 0000000..1d126be
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/reBuildLayers.mel
@@ -0,0 +1,111 @@
+global proc reBuildLayers()
+{
+//Delete the first 40 layers
+
+$DeleteLayer_Index = 1;
+$DeleteLayer_NumTimes = 40;
+while ($DeleteLayer_Index++ < $DeleteLayer_NumTimes)
+{
+layerEditorLayerButtonSelect 1 "";
+layerEditorDeleteLayer "";
+};
+
+//list all top groups
+
+SelectAllCameras;
+$cameras = `ls -sl`;
+
+SelectAllLights;
+$lights = `ls -sl`;
+
+string $misc[];
+if (`objExists "p3dExporterOptions*"`)
+{
+select "p3dExporterOptions*";
+$misc = `ls -sl`;
+};
+
+select -ado;
+select -d $cameras $misc $lights;
+$TopGroups = `ls -sl`;
+string $TopGroup;
+
+//create a layer for each top groups
+
+for ($TopGroup in $TopGroups)
+{
+ select -r $TopGroup;
+ createDisplayLayer -name ("TG_" + $TopGroup);
+};
+
+SelectAllJoints;
+createDisplayLayer -name "All_BVs";
+
+if (`objExists "*L01only*"`)
+{
+select -r "*L01only*";
+createDisplayLayer -name "KG_L01only";
+};
+
+if (`objExists "*L02only*"`)
+{
+select -r "*L02only*";
+createDisplayLayer -name "KG_L02only";
+};
+
+if (`objExists "*L03only*"`)
+{
+select -r "*L03only*";
+createDisplayLayer -name "KG_L03only";
+};
+
+if (`objExists "*L04only*"`)
+{
+select -r "*L04only*";
+createDisplayLayer -name "KG_L04only";
+};
+
+if (`objExists "*L05only*"`)
+{
+select -r "*L05only*";
+createDisplayLayer -name "KG_L05only";
+};
+
+if (`objExists "*L06only*"`)
+{
+select -r "*L06only*";
+createDisplayLayer -name "KG_L06only";
+};
+
+if (`objExists "*L07only*"`)
+{
+select -r "*L07only*";
+createDisplayLayer -name "KG_L07only";
+};
+
+
+//change color of specific layers
+
+if (`objExists "TG_*gens*.color"`)
+ setAttr "TG_*gens*.color" 29;
+
+if (`objExists "TG_*landmarks*.color"`)
+ setAttr "TG_*landmarks*.color" 30;
+
+if (`objExists "TG_*dynamics*.color"`)
+ setAttr "TG_*dynamics*.color" 22;
+
+if (`objExists "TG_*track*.color"`)
+ setAttr "TG_*track*.color" 28;
+
+if (`objExists "All_BVs"`)
+ setAttr "All_BVs.color" 6;
+
+if (`objExists "TG_*work*.color"`)
+{
+ setAttr "TG_*work*.color" 13;
+ setAttr "TG_*work*.visibility" 0;
+};
+};
+
+
diff --git a/tools/MayaTools/Maya4.0/scripts/others/showAndLight.mel b/tools/MayaTools/Maya4.0/scripts/others/showAndLight.mel
new file mode 100644
index 0000000..973c0d4
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/showAndLight.mel
@@ -0,0 +1,113 @@
+global proc swapGeo (string $showGeo , string $hideGeo1, string $hideGeo2)
+{
+select -r ("*" + $showGeo + "only*");
+ //select -r ("*" + 02 + "only*");//
+select -hi;
+ShowSelectedObjects;
+select -r ("*" + $hideGeo1 + "only*");
+ //select -r ("*" + 05 + "only*");//
+select -add ("*" + $hideGeo2 + "only*");
+ //select -add ("*" + 05 + "only*");//
+select -hi;
+HideSelectedObjects;
+select -cl;
+};
+
+proc ShowBVShapes ()
+{
+select -r "P3D_BVol*Shape*" ;
+$select = `ls -sl`;
+string $sel;
+for ($sel in $select)
+ setAttr ($sel + ".visibility") 1;
+};
+
+
+
+//=============================================//
+global proc selectDrawableOnly ()
+{
+ $shapeSel = `ls -sl -s -v`;
+ select $shapeSel;
+}
+global proc hideDontlight ()
+{
+if ( `objExists "*dontlight*"` )
+{
+ select -r "*dontlight*";
+ select -hi;
+ HideSelectedObjects;
+}
+else
+ { warning("there are no objects that you don't want to light?"); };
+};
+
+global proc showDontlight ()
+{
+if ( `objExists "*dontlight*"` )
+{
+ select -r "*dontlight*";
+ select -hi;
+ ShowSelectedObjects;
+}
+else
+ { warning("there are no objects that you don't want to light?"); };
+};
+
+
+global proc selectVisGeo ()
+
+{
+if ( `objExists "*landmarks*"` )
+{
+ select -add -vis "*landmarks*";
+}
+else
+{
+warning("there are no landmarks in your scene?");
+};
+select -add -vis "*gens*";
+select -add -vis "*track*";
+select -add -vis "*dynamics*";
+select -hi;
+}
+;
+
+
+
+
+//=============================================//
+
+
+
+
+global proc bobPrelight ()
+{
+toggleMaterialMapping(0);polyGeoSampler -cs -ul -sf 1 -su -colorBlend "overwrite" -alphaBlend "overwrite"; toggleMaterialMapping(1);
+}
+;
+
+
+
+
+//=============================================//
+
+
+
+
+global proc showAndLight (string $wang, string $chung, string $fung)
+{
+swapGeo $wang $chung $fung;
+hideDontlight;
+selectVisGeo;
+selectDrawableOnly;
+bobPrelight;
+showDontlight;
+swapGeo $wang $chung $fung;
+ShowBVShapes;
+};
+//showAndLight 06 03 03;//
+//showAndLight 03 06 06;//
+
+
+
diff --git a/tools/MayaTools/Maya4.0/scripts/others/swapCamera.mel b/tools/MayaTools/Maya4.0/scripts/others/swapCamera.mel
new file mode 100644
index 0000000..5e1a9a3
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/swapCamera.mel
@@ -0,0 +1,104 @@
+proc swapCamDefaults (){
+global string $camera[];
+global float $camRotY;
+global float $camRotX;
+global float $camRotZ;
+global float $camTranY;
+global float $camTranX;
+global float $camTranZ;
+$camera[0]= "persp";
+float $camRotY =0;
+float $camRotX =0;
+float $camRotZ =0;
+float $camTranY =0;
+float $camTranX =0;
+float $camTranZ =0;
+};
+
+global proc perspToOrtho(){
+global string $camera[];
+global float $camRotY;
+global float $camRotX;
+global float $camRotZ;
+global float $camTranY;
+global float $camTranX;
+global float $camTranZ;
+
+$temp = `ls -sl`;
+{ string $camera = `modelPanel -q -camera modelPanel4`; eval select `getCameraNode view $camera` `getCameraNode up $camera` $camera; };
+$camera = `ls -sl`;
+$camRotY = `getAttr ($camera[0] + ".rotateY")`;
+$camRotX = `getAttr ($camera[0] + ".rotateX")`;
+$camRotZ = `getAttr ($camera[0] + ".rotateZ")`;
+$camTranY = `getAttr ($camera[0] + ".translateY")`;
+$camTranX = `getAttr ($camera[0] + ".translateX")`;
+$camTranZ = `getAttr ($camera[0] + ".translateZ")`;
+int $camRotY1;
+int $camRotX1;
+int $camRotZ1;
+if ($camRotY <= 0)
+ $camRotY1 = (($camRotY-45) % 360.0) / 90;
+else
+ $camRotY1 = (($camRotY+45) % 360.0) / 90;
+$camRotY90 = $camRotY1 * 90;
+
+if ($camRotX <= 0)
+ $camRotX1= (($camRotX-45) % 360.0) / 90;
+else
+ $camRotX1= (($camRotX+45) % 360.0) / 90;
+$camRotX90 = $camRotX1 * 90;
+if ($camRotZ <= 0)
+ $camRotZ1= (($camRotZ-45) % 360.0) / 90;
+else
+ $camRotZ1= (($camRotZ+45) % 360.0) / 90;
+$camRotZ90 = $camRotZ1 * 90;
+
+//$camRotZ90 = (floor ((($camRotZ+45) % 360.0)/90))*90;//
+//makes ortho//
+setAttr ($camera[0] + ".rotateY") $camRotY90;
+setAttr ($camera[0] + ".rotateX") $camRotX90;
+setAttr ($camera[0] + ".rotateZ") $camRotZ90;
+setAttr ($camera[0] + ".orthographic") 1;
+select $temp;
+fitPanel -selected;
+print "camera square";
+};
+
+
+//orthoToPersp $camera[0] $camRotY $camRotX $camRotZ $camTranY $camTranX $camTranZ
+global proc orthoToPersp()
+{
+global string $camera[];
+global float $camRotY;
+global float $camRotX;
+global float $camRotZ;
+global float $camTranY;
+global float $camTranX;
+global float $camTranZ;
+setAttr ($camera[0] + ".rotateY") $camRotY;
+setAttr ($camera[0] + ".rotateX") $camRotX;
+setAttr ($camera[0] + ".rotateZ") $camRotZ;
+setAttr ($camera[0] + ".translateY") $camTranY;
+setAttr ($camera[0] + ".translateX") $camTranX;
+setAttr ($camera[0] + ".translateZ") $camTranZ;
+setAttr ($camera[0] + ".orthographic") 0;
+};
+
+global proc swapCamera(int $sway){
+global string $camera[];
+global float $camRotY;
+global float $camRotX;
+global float $camRotZ;
+global float $camTranY;
+global float $camTranX;
+global float $camTranZ;
+switch ($sway){
+
+case 0:
+ perspToOrtho;
+ break;
+case 1:
+ orthoToPersp;
+ break;
+};
+}; \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_BVContext.mel b/tools/MayaTools/Maya4.0/scripts/others/te_BVContext.mel
new file mode 100644
index 0000000..e835468
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_BVContext.mel
@@ -0,0 +1,43 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_BVContext.mel
+//
+// Description: Defines all the scripts required by the BVContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartBVLoop()
+{
+ //Start the BV context...
+ if ( ! `contextInfo -exists BVCtx` )
+ {
+ BVContext BVCtx;
+ }
+
+ setToolTo BVCtx;
+}
+
+global proc te_MCB_SplitSelectedBV()
+{
+ //Call the API function.
+ BVSplitSelected();
+}
+
+global proc te_Delete_BVContext()
+{
+ if ( `contextInfo -exists BVCtx` )
+ {
+ deleteUI -toolContext BVCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_IntersectionContext.mel b/tools/MayaTools/Maya4.0/scripts/others/te_IntersectionContext.mel
new file mode 100644
index 0000000..54561ff
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_IntersectionContext.mel
@@ -0,0 +1,212 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_IntersectionContext.mel
+//
+// Description: Defines all the scripts required by the IntersectionContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartIntersection()
+{
+ //Start the Intersection context...
+ if ( ! `contextInfo -exists IntersectionCtx` )
+ {
+ IntersectionContext IntersectionCtx;
+ }
+
+ setToolTo IntersectionCtx;
+}
+
+global string $gSelectedIntersection = "";
+global int $gIntersectionSelectionCallbackID = 0;
+global string $gSelectedName;
+global string $gTypeField;
+global string $gIntersectionTypes[] = { "NoStop", "NWay", "FourWay", "NoStopN", "NWayN" };
+
+global proc te_MCB_EditIntersection()
+{
+ global string $gSelectedName;
+ global int $gIntersectionSelectionCallbackID;
+ global string $gIntersectionTypes[];
+ global string $gTypeField;
+
+ if ( `window -exists TE_InteresctionEditor` )
+ {
+ deleteUI -window TE_IntersectionEditor;
+ }
+
+ window -rtf true -title "TE Road / Intersection Editor" TE_IntersectionEditor;
+
+ columnLayout -adjustableColumn true;
+
+ $gSelectedName = `textField -editable false -text "" -width 170`;
+
+ $gTypeField = `optionMenu -label "Type" -width 170 -changeCommand ("te_MCB_IntersectionTypeChange( \"#1\" )")`;
+
+ int $index;
+ int $size = size($gIntersectionTypes);
+ for ( $index = 0; $index < $size; $index++ )
+ {
+ menuItem -label $gIntersectionTypes[ $index ];
+ }
+ setParent ..;
+
+ button -label "Create Road" -command ( "te_MCB_CreateRoadFromSelected()" );
+ button -label "Show Whole Road" -command ( "te_MCB_ShowRoadFromSelected()" );
+ button -label "Destroy Road" -command ( "te_MCB_DestroyRoadFromSelected()" );
+ button -label "Set Intersection Start" -command ( "te_MCB_AddSelectedIntersectionToRoad( 0 )" );
+ button -label "Set Intersection End" -command ( "te_MCB_AddSelectedIntersectionToRoad( 1 )" );
+ separator;
+ button -label "Create Intersections" -command "te_MCB_StartIntersection()";
+
+ setParent ..;
+
+ showWindow;
+
+ //Create the selection change callback.
+ $gIntersectionSelectionCallbackID = `scriptJob -parent "TE_IntersectionEditor" -event "SelectionChanged" "te_UpdateIntersectionEditor()"`;
+
+}
+
+global proc te_MCB_IntersectionTypeChange( string $value )
+{
+ global string $gSelectedIntersection;
+
+ if ( $gSelectedIntersection != "" )
+ {
+ setAttr ( $gSelectedIntersection + ".IntersectionType" ) -type "string" $value;
+ }
+}
+
+global proc te_CloseIntersectionEditorWindow()
+{
+ global int $gIntersectionSelectionCallbackID;
+
+ if ( `window -exists TE_InteresctionEditor` )
+ {
+ deleteUI -window TE_IntersectionEditor;
+ }
+
+ $gIntersectionSelectionCallbackID = 0;
+}
+
+global proc te_UpdateIntersectionEditor()
+{
+ global string $gSelectedIntersection;
+ global string $gSelectedName;
+ global string $gTypeField;
+ global string $gIntersectionTypes[];
+
+ string $selectedObjects[] = `ls -sl -dag`;
+ string $selectedObjectName = $selectedObjects[0];
+ string $selectedNodeType;
+
+ if ( $selectedObjectName != "" )
+ {
+ //There is something selected
+
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "transform" )
+ {
+ //We don't want the transform, we want the child node.
+ string $children[] = `listRelatives -c $selectedObjectName`;
+ $selectedObjectName = $children[0];
+ }
+
+ if ( $selectedObjectName != "" )
+ {
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "IntersectionLocatorNode" )
+ {
+ //We're in business
+ textField -edit -text $selectedObjectName $gSelectedName;
+
+ string $value = `getAttr ( $selectedObjectName + ".IntersectionType" )`;
+
+ //Which index is this string?
+ int $size = size( $gIntersectionTypes );
+ int $index;
+
+ for ( $index = 0; $index < $size; $index++ )
+ {
+ if ( $gIntersectionTypes[ $index ] == $value )
+ {
+ optionMenu -edit -sl ($index + 1) $gTypeField;
+ break;
+ }
+ }
+
+ if ( $index == $size )
+ {
+ //This node had no proper setting. Resetting it.
+ warning "Node had invalid type setting. Correcting to default type";
+
+ optionMenu -edit -sl 1 $gTypeField;
+ setAttr ( $selectedObjectName + ".IntersectionType" ) -type "string" $gIntersectionTypes[ 0 ];
+ }
+
+ $gSelectedIntersection = $selectedObjectName;
+ return;
+ }
+ else if ( $selectedNodeType == "mesh" )
+ {
+ //This is for adding road to the selected intersection. Do not unselect the intersection.
+ string $whichRoad[] = `listAttr -st teWhichRoad $selectedObjectName`;
+
+ if ( size( $whichRoad ) )
+ {
+ return;
+ }
+ }
+ }
+ }
+
+ textField -edit -text "" $gSelectedName;
+ $gSelectedIntersection = "";
+
+}
+
+
+
+global proc te_MCB_CreateRoadFromSelected()
+{
+ TE_CreateRoad();
+}
+
+global proc te_MCB_ShowRoadFromSelected()
+{
+ TE_ShowRoad();
+}
+
+global proc te_MCB_DestroyRoadFromSelected()
+{
+ TE_DestroyRoad();
+}
+
+global proc te_MCB_AddSelectedIntersectionToRoad( int $isEnd )
+{
+ global string $gSelectedIntersection;
+
+ TE_AddIntersectionToRoad( $gSelectedIntersection, $isEnd );
+}
+
+global proc te_Delete_IntersectionContext()
+{
+ if ( `contextInfo -exists IntersectionCtx` )
+ {
+ deleteUI -toolContext IntersectionCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_PPContext.mel b/tools/MayaTools/Maya4.0/scripts/others/te_PPContext.mel
new file mode 100644
index 0000000..a8cc63f
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_PPContext.mel
@@ -0,0 +1,43 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_PPContext.mel
+//
+// Description: Defines all the scripts required by the PPContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartPPLoop()
+{
+ //Start the PP context...
+ if ( ! `contextInfo -exists PPCtx` )
+ {
+ PPContext PPCtx;
+ }
+
+ setToolTo PPCtx;
+}
+
+global proc te_MCB_SplitSelectedPP()
+{
+ //Call the API function.
+ PPSplitSelected();
+}
+
+global proc te_Delete_PPContext()
+{
+ if ( `contextInfo -exists PPCtx` )
+ {
+ deleteUI -toolContext PPCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_cleanup.mel b/tools/MayaTools/Maya4.0/scripts/others/te_cleanup.mel
new file mode 100644
index 0000000..21f39d3
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_cleanup.mel
@@ -0,0 +1,12 @@
+te_Delete_TreeLineContext();
+te_Delete_BVContext();
+te_Delete_PPContext();
+te_Delete_IntersectionContext();
+te_CloseIntersectionEditorWindow();
+
+if ( `menu -exists te_MainMenu` )
+{
+ deleteUI te_MainMenu;
+
+ flushUndo;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_editorwindow.mel b/tools/MayaTools/Maya4.0/scripts/others/te_editorwindow.mel
new file mode 100644
index 0000000..1504a52
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_editorwindow.mel
@@ -0,0 +1,335 @@
+//Constant
+global int $gMAX_LANES = 4;
+
+global string $gSelectedName;
+global string $gOriginField;
+global string $gRoadField;
+global string $gTopField;
+global string $gBottomField;
+global string $gLanesField;
+global string $gShoulderField;
+
+global int $gSelectionScriptJob;
+
+global string $gSelectedObjectName;
+
+global proc teOpenEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gLanesField;
+ global string $gShoulderField;
+ global int $gMAX_LANES;
+
+
+ if ( `window -exists TE_TileEditor` )
+ {
+ deleteUI -window TE_TileEditor;
+ }
+
+ window -rtf true -title "TE Tile Editor" TE_TileEditor;
+
+ columnLayout -adjustableColumn true;
+
+ string $selectedRow = `rowLayout -numberOfColumns 3 -columnWidth 1 170`;
+ $gSelectedName = `textField -editable false -text "" -width 170`;
+ string $selectedButton = `button -label "Select Mesh" -command ("teSelectMesh()")`;
+ string $doneButton = `button -label "Done" -command ("teDoneEditingMesh()")`;
+
+ setParent ..;
+
+ string $originRow = `rowLayout -numberOfColumns 2`;
+ string $originButton = `button -label "Set Origin" -command ("teSelectOrigin()")`;
+ $gOriginField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $roadRow = `rowLayout -numberOfColumns 2`;
+ string $roadButton = `button -label "Set Road Dir" -command ("teSelectRoadDir()")`;
+ $gRoadField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $topRow = `rowLayout -numberOfColumns 2`;
+ string $topButton = `button -label "Set TOP" -command ("teSelectTOP()")`;
+ $gTopField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $bottomRow = `rowLayout -numberOfColumns 2`;
+ string $bottomButton = `button -label "Set BOTTOM" -command ("teSelectBOTTOM()")`;
+ $gBottomField = `intField -value -1 -editable false`;
+ setParent ..;
+
+ //The following #1 is a trick that the scripting system converts into the value of the field/control...
+ string $laneRow = `rowLayout -numberOfColumns 2`;
+ string $laneLabel = `text -label "Num. Lanes" -align "center"`;
+ $gLanesField = `intField -value 1 -min 0 -max $gMAX_LANES -step 1 -editable true -changeCommand ("teSetNumLanes(#1)")`;
+ setParent ..;
+
+ $gShoulderField = `checkBox -label "Has Shoulder" -value true -changeCommand ("teSetShoulder(#1)")`;
+
+ setParent ..; //columnLayout
+
+ showWindow;
+}
+
+global proc teCloseEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gLanesField;
+ global string $gShoulderField;
+
+ global int $gSelectionScriptJob;
+
+ if ( `window -exists TE_TileEditor` )
+ {
+ deleteUI -window TE_TileEditor;
+ }
+
+ $gSelectedName = "";
+ $gOriginField = "";
+ $gRoadField = "";
+ $gTopField = "";
+ $gBottomField = "";
+ $gLanesField = "";
+ $gShoulderField = "";
+
+ $gSelectionScriptJob = 0;
+}
+
+global proc teSelectMesh()
+{
+ global string $gSelectedName;
+ global int $gSelectionScriptJob;
+ global string $gSelectedObjectName;
+
+ //May want to inform the TrackEditor of this selection if it is good.
+ string $selectedObjects[] = `ls -sl -dag`;
+ string $selectedObjectName = $selectedObjects[0];
+ string $selectedNodeType;
+
+ if ( $selectedObjectName != "" )
+ {
+ //There is something selected
+
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "transform" )
+ {
+ //We don't want the transform, we want the child node.
+ $selectedObjectName = $selectedObjects[1];
+ }
+
+ if ( $selectedObjectName != "" )
+ {
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "mesh" )
+ {
+ //We're in business
+ textField -edit -text $selectedObjectName $gSelectedName;
+
+ teSwitchToVertexSelection( 1 ); //Turn on vertex selection.
+
+ teAddSettingsToObject( $selectedObjectName );
+
+ $gSelectedObjectName = $selectedObjectName;
+
+ teUpdateEditorWindow();
+ }
+ }
+ }
+}
+
+global proc teUpdateEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gSelectedObjectName;
+ global string $gLanesField;
+ global string $gShoulderField;
+
+ //Update the fields according to the selected object.
+
+ int $valsSet = false;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ string $attr[] = `listAttr -st teOrigin $gSelectedObjectName`;
+
+ if ( $attr[0] != "" )
+ {
+ textField -edit -text $gSelectedObjectName $gSelectedName;
+
+ float $origin = `getAttr ($gSelectedObjectName + ".teOrigin")`;
+ intField -edit -value $origin $gOriginField;
+
+ float $road = `getAttr ($gSelectedObjectName + ".teRoad")`;
+ intField -edit -value $road $gRoadField;
+
+ float $top = `getAttr ($gSelectedObjectName + ".teTop")`;
+ intField -edit -value $top $gTopField;
+
+ float $bottom = `getAttr ($gSelectedObjectName + ".teBottom")`;
+ intField -edit -value $bottom $gBottomField;
+
+ int $lanes = `getAttr ($gSelectedObjectName + ".teLanes")`;
+ intField -edit -value $lanes $gLanesField;
+
+ int $hasShoulder = `getAttr ($gSelectedObjectName + ".teShoulder")`;
+ checkBox -edit -value $hasShoulder $gShoulderField;
+
+ $valsSet = 1;
+ }
+ }
+
+ if ( !$valsSet )
+ {
+ textField -edit -text "" $gSelectedName;
+
+ intField -edit -value -1 $gOriginField;
+ intField -edit -value -1 $gRoadField;
+ intField -edit -value -1 $gTopField;
+ intField -edit -value -1 $gBottomField;
+ intField -edit -value 0 $gLanesField;
+ checkBox -edit -value false $gShoulderField;
+ }
+}
+
+global proc teSwitchToVertexSelection( int $on )
+{
+ if ( $on )
+ {
+ selectMode -component;
+ selectType -vertex true;
+ }
+ else
+ {
+ selectMode -object;
+ }
+}
+
+global proc teDoneEditingMesh()
+{
+ global string $gSelectedObjectName;
+
+ $gSelectedObjectName = ""; //Clear the selection.
+
+ teSwitchToVertexSelection( 0 ); //Turn on vertex selection.
+
+ teUpdateEditorWindow();
+}
+
+global proc teAddSettingsToObject( string $objectName )
+{
+ string $attr[] = `listAttr -st teOrigin $objectName`;
+
+ if ( $attr[0] == "" )
+ {
+ addAttr -ln teOrigin -sn teO -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teRoad -sn teR -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teTop -sn teT -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teBottom -sn teB -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teLanes -sn teL -at long -defaultValue 1 $objectName;
+
+ addAttr -ln teShoulder -sn teS -at bool -defaultValue true $objectName;
+
+ //This is for connecting to roads
+ addAttr -ln teWhichRoad -sn teWR -at message $objectName;
+
+ //This is a hint of the type
+ addAttr -ln teTypeHint -sn teTH -at long -defaultValue -1 $objectName;
+ }
+}
+
+global proc teSelectOrigin()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teOrigin" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectRoadDir()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teRoad" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectTOP()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teTop" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectBOTTOM()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teBottom" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+
+global proc teSetNumLanes( int $numLanes )
+{
+ global string $gSelectedObjectName;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ setAttr ( $gSelectedObjectName + ".teLanes" ) $numLanes;
+ }
+}
+
+global proc teSetShoulder( int $hasShoulder )
+{
+ global string $gSelectedObjectName;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ setAttr ( $gSelectedObjectName + ".teShoulder" ) $hasShoulder;
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_globals.mel b/tools/MayaTools/Maya4.0/scripts/others/te_globals.mel
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_globals.mel
@@ -0,0 +1 @@
+
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_main.mel b/tools/MayaTools/Maya4.0/scripts/others/te_main.mel
new file mode 100644
index 0000000..6a97582
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_main.mel
@@ -0,0 +1,195 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// TE_main.mel
+//
+// Description: Installs the Terrain Editor (TE) interface.
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created Apr 11, 2001 -- bkusy
+// + Stolen & Adapted -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// t e _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// t e _ M C B _ A b o u t
+//
+// Synopsis: Display an About Terrain Editor window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_MCB_About()
+{
+// string $pluginVersion = `te_GetVersion`;
+
+ string $pluginVersion = "2.0";
+
+ string $message = ( "\nSimpsons Road Rage Terrain Editor.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About Terrain Editor"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// t e _ d o M a i n M e n u I t e m s
+//
+// Synopsis: Creates the TE menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_doMainMenuItems( string $menu )
+{
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Bounding Fences" -sm true;
+
+ menuItem -label "Create fence line" -command "te_MCB_StartBVLoop()";
+
+ menuItem -label "Split Fence(s)" -command "te_MCB_SplitSelectedBV()";
+
+ setParent -menu ..;
+
+ menuItem -label "Pedestrian Paths" -sm true;
+
+ menuItem -label "Create path line" -command "te_MCB_StartPPLoop()";
+
+ menuItem -label "Split Path(s)" -command "te_MCB_SplitSelectedPP()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Track Editor" -sm true;
+
+ radioMenuItemCollection;
+
+ menuItem -label "Off" -radioButton on -command "TE_StateChange(0)";
+
+ menuItem -label "Edit Mode" -radioButton off -command "TE_StateChange(1)";
+
+ menuItem -label "Display Mode" -radioButton off -command "TE_StateChange(2)";
+
+ menuItem -divider true;
+
+ menuItem -label "Create Intersections" -command "te_MCB_StartIntersection()";
+
+ menuItem -label "Edit Roads / Intersections" -command "te_MCB_EditIntersection()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Tree Line Tool" -allowOptionBoxes true -sm true;
+
+ menuItem -label "Create Tree Lines" -command "te_MCB_CreateTreeLines()";
+
+ menuItem -label "Options" -optionBox true -command "te_MCB_TreelineOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Selected Treelines" -command "te_MCB_SnapTreelines()";
+
+ menuItem -divider true;
+
+ menuItem -label "Convert Treelines to Geometry" -command "te_MCB_ConvertToGeometry()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Export" -command "te_MCB_Export()";
+
+ menuItem -optionBox true -command "TE_ExportOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "te_MCB_About()";
+
+ setParent -m ..;
+}
+
+//-----------------------------------------------------------------------------
+// t e _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install TE menu as a root menu.
+ //
+ if ( `menu -exists te_MainMenu` ) deleteUI te_MainMenu;
+ menu -label "Track Editor" -allowOptionBoxes true -parent $gMainWindow te_MainMenu;
+
+ te_doMainMenuItems "te_MainMenu";
+}
+
+global proc te_MCB_Export()
+{
+ $whichCtx = `currentCtx`;
+
+ if ( $whichCtx != "" )
+ {
+ ctxCompletion;
+ }
+
+ TE_Export();
+}
+
+source "te_globals.mel";
+source "te_setup.mel";
+source "te_BVContext.mel";
+source "te_PPContext.mel";
+source "te_treelineContext.mel";
+source "te_IntersectionContext.mel";
+source "te_editorWindow.mel";
+source "AETEShowRoadSegButton.mel";
+
+evalDeferred "te_InstallUI"; \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_setup.mel b/tools/MayaTools/Maya4.0/scripts/others/te_setup.mel
new file mode 100644
index 0000000..d5ca442
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_setup.mel
@@ -0,0 +1,15 @@
+//Create the TrackEditorNode.
+
+
+global proc te_Create_TrackEditorNode()
+{
+ if ( !(`objExists TrackEditorNode`) )
+ {
+ createNode "transform" -n "TrackEditorNode";
+ createNode "transform" -n "Fences" -p "TrackEditorNode";
+ createNode "transform" -n "Roads" -p "TrackEditorNode";
+ createNode "transform" -n "Intersections" -p "TrackEditorNode";
+ createNode "transform" -n "Treelines" -p "TrackEditorNode";
+ createNode "transform" -n "PedPaths" -p "TrackEditorNode";
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/te_treelineContext.mel b/tools/MayaTools/Maya4.0/scripts/others/te_treelineContext.mel
new file mode 100644
index 0000000..c8120ab
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/te_treelineContext.mel
@@ -0,0 +1,84 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_treelineContext.mel
+//
+// Description: Defines all the scripts required by the TreeLineContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the tree line context tool.
+
+global proc te_MCB_CreateTreeLines()
+{
+ //Start the tree line context...
+ if ( ! `contextInfo -exists TreeLineCtx` )
+ {
+ TreeLineContext TreeLineCtx;
+ }
+
+ setToolTo TreeLineCtx;
+}
+
+global proc te_Delete_TreeLineContext()
+{
+ if ( `contextInfo -exists TreeLineCtx` )
+ {
+ deleteUI -toolContext TreeLineCtx;
+ }
+}
+
+global proc te_MCB_SnapTreelines()
+{
+ TE_SnapSelectedTreelines();
+}
+
+global proc te_MCB_ConvertToGeometry()
+{
+ string $whichCtx = `currentCtx`;
+
+ if ( $whichCtx == "TreeLineCtx" )
+ {
+ ctxAbort;
+ }
+
+ TE_ConvertTreelineToGeometry();
+}
+
+global int $gDeleteTreelines = true;
+
+global proc te_MCB_TreelineOptions()
+{
+ global int $gDeleteTreelines;
+
+ if ( `window -exists TE_TreelineOptions` )
+ {
+ deleteUI -window TE_TreelineOptions;
+ }
+
+ window -rtf true -title "TE Treeline Options" TE_TreelineOptions;
+
+ columnLayout -adjustableColumn true;
+
+ checkBox -label "Delete Treelines" -value $gDeleteTreelines -cc "te_BCB_SetDeleteTreelines(#1)";
+
+ setParent ..;
+
+ showWindow;
+}
+
+global proc te_BCB_SetDeleteTreelines( int $delete )
+{
+ global int $gDeleteTreelines;
+
+ $gDeleteTreelines = $delete;
+ TE_SetDeleteTreeline($delete);
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_cleanup.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_cleanup.mel
new file mode 100644
index 0000000..1b2f42c
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_cleanup.mel
@@ -0,0 +1,11 @@
+
+if ( `menu -exists wb_MainMenu` )
+{
+ deleteUI wb_MainMenu;
+ deleteShelfTab ("WorldBuilder");
+
+ wb_SplinesCleanup();
+ wb_CoinSplinesCleanup();
+
+ flushUndo;
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_coinsplines.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_coinsplines.mel
new file mode 100644
index 0000000..750eb3e
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_coinsplines.mel
@@ -0,0 +1,53 @@
+global int $gCoinSplineCompleteCB = -1;
+
+global proc wb_MCB_CreateCoinPath()
+{
+ global int $gCoinSplineCompleteCB;
+
+ if ( !`contextInfo -exists CoinSplineCtx` )
+ {
+ curveCVCtx -degree 3 -me true -un true CoinSplineCtx;
+ print "create\n";
+ }
+ else
+ {
+ string $currentCtx = `currentCtx`;
+
+ if ( $currentCtx == "CoinSplineCtx" )
+ {
+ print "complete\n";
+ ctxCompletion;
+
+ wb_CB_CoinSplineComplete();
+ }
+ }
+
+ print "select\n";
+ setToolTo CoinSplineCtx;
+
+ $gCoinSplineCompleteCB = `scriptJob -ro 1 -p "WorldBuilder" -e "ToolChanged" wb_CB_CoinSplineComplete`;
+}
+
+global proc wb_CB_CoinSplineComplete()
+{
+ print "complete callback\n";
+ WB_CoinSplineComplete();
+}
+
+global proc wb_CoinSplinesCleanup()
+{
+ print "clean\n";
+ global int $gCoinSplineCompleteCB;
+
+ if ( $gCoinSplineCompleteCB != -1 )
+ {
+ scriptJob -k $gCoinSplineCompleteCB;
+ print "kill job\n";
+ }
+
+ if ( `contextInfo -exists CoinSplineCtx` )
+ {
+ print "delete ui\n";
+ deleteUI -tc CoinSplineCtx;
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_locator.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_locator.mel
new file mode 100644
index 0000000..0b46abb
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_locator.mel
@@ -0,0 +1,71 @@
+global float $gWB_Offset = 0;
+
+global proc wb_BCB_CreateLocator( string $type )
+{
+ //Start the Locator context...
+ if ( ! `contextInfo -exists LocatorCtx` )
+ {
+ LocatorContext LocatorCtx;
+ }
+
+ WB_SetLocatorType($type);
+
+ setToolTo LocatorCtx;
+}
+
+global proc wb_MCB_SnapLocatorOptions()
+{
+ global float $gWB_Offset;
+
+ if ( `window -exists wb_OptionWindow` ) deleteUI wb_OptionWindow;
+
+ window -title "Snap Locator Options" wb_OptionWindow;
+
+ columnLayout;
+
+ rowLayout -nc 2;
+
+ text -label "Offset (M):";
+
+ floatField -min -10.0 -max 10.0 -value $gWB_Offset -cc ("$gWB_Offset = #1");
+
+ setParent ..;
+
+ button -label "snap locator" -command "WB_SnapLocator( $gWB_Offset )";
+
+ setParent ..;
+
+ showWindow;
+}
+
+global proc wb_BCB_AttachTriggers( string $name, int $isVisibler )
+{
+ global int $gIsItVisibler;
+
+ $gIsItVisibler = $isVisibler;
+
+ //Start the Trigger context...
+ if ( ! `contextInfo -exists TriggerCtx` )
+ {
+ TriggerContext TriggerCtx;
+ }
+
+ select $name;
+
+ WB_SelectObject( $name );
+
+ setToolTo TriggerCtx;
+}
+
+global proc wb_LocatorCleanup()
+{
+ if ( `contextInfo -exists LocatorCtx` )
+ {
+ deleteUI -tc LocatorCtx;
+ }
+
+ if ( `contextInfo -exists TriggerCtx` )
+ {
+ deleteUI -tc TriggerCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_main.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_main.mel
new file mode 100644
index 0000000..8106946
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_main.mel
@@ -0,0 +1,274 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// WB_main.mel
+//
+// Description: Installs the World Builder (WB) interface.
+// As a convention all World Builder global procedures
+// and global variables are prefixed with "wb_". All commands
+// exposed through WB plugins are prefixed with "WB_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created Apr 11, 2001 -- bkusy
+// + Stolen & Adapted -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// w b _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// w b _ M C B _ A b o u t
+//
+// Synopsis: Display an About World Builder window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_MCB_About()
+{
+ string $pluginVersion = "2.0";
+
+ string $message = ( "\nSimpsons Road Rage World Builder.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About World Builder"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// w b _ d o M a i n M e n u I w b m s
+//
+// Synopsis: Creates the WB menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_doMainMenuItems( string $menu )
+{
+ global string $gMainWindow;
+ global float $gWB_Offset;
+
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Display Levels" -sm true;
+
+ menuItem -label "Event Locators" -checkBox true -command "WB_ChangeDisplay(0, #1)";
+
+ menuItem -label "Script Locators" -checkBox true -command "WB_ChangeDisplay(1, #1)";
+
+ menuItem -label "Generic Locators" -checkBox true -command "WB_ChangeDisplay(2, #1)";
+
+ menuItem -label "Car Start Locators" -checkBox true -command "WB_ChangeDisplay(3, #1)";
+
+ menuItem -label "Dynamic Zone Locators" -checkBox true -command "WB_ChangeDisplay(4, #1)";
+
+ menuItem -label "Occlusion Locators" -checkBox true -command "WB_ChangeDisplay(5, #1)";
+
+ menuItem -label "Interior Entrance Locators" -checkBox true -command "WB_ChangeDisplay(7, #1)";
+
+ menuItem -label "Directional Locators" -checkBox true -command "WB_ChangeDisplay(8, #1)";
+
+ menuItem -label "Action Locators" -checkBox true -command "WB_ChangeDisplay(9, #1)";
+
+ menuItem -label "FOV" -checkBox true -command "WB_ChangeDisplay(10, #1)";
+
+ menuItem -label "Breakable Camera" -checkBox true -command "WB_ChangeDisplay(11, #1)";
+
+ menuItem -label "Static Camera" -checkBox true -command "WB_ChangeDisplay(12, #1)";
+
+ menuItem -label "Ped Group" -checkBox true -command "WB_ChangeDisplay(13, #1)";
+
+ menuItem -divider true;
+
+ menuItem -label "Trigger Volumes" -checkBox true -command "WB_ChangeDisplay(20, #1)";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Create Camera Path" -command "wb_MCB_CreateCameraPath()";
+
+ menuItem -label "Create Coin Path" -command "wb_MCB_CreateCoinPath()";
+
+ menuItem -divider true;
+
+ menuItem -label "Set Prefix" -command "WB_SetPrefix()";
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Locator" -command "WB_SnapLocator( $gWB_Offset )";
+
+ menuItem -optionBox true -command "wb_MCB_SnapLocatorOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "Export" -command "WB_Export()";
+
+ menuItem -optionBox true -command "WB_ExportOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "wb_MCB_About()";
+
+ setParent -m ..;
+
+ if ( `shelfLayout -exists "WorldBuilder"` == 0 )
+ {
+ addNewShelfTab "WorldBuilder";
+ }
+
+ //Delete all the old buttons (in case there was a change)..
+ string $buttons[] = `shelfLayout -q -ca WorldBuilder`;
+
+ int $i;
+
+ for ( $i = 0; $i < size($buttons); $i++ )
+ {
+ deleteUI $buttons[ $i ];
+ }
+
+ //Create all the buttons required..
+ shelfButton -c ("wb_BCB_CreateLocator(\"Event\")")
+ -p "WorldBuilder"
+ -i1 "eventlocator.bmp"
+ -ann "Create Event Locator"
+ -l "Event";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Script\")")
+ -p "WorldBuilder"
+ -i1 "scriptlocator.bmp"
+ -ann "Create Script Locator"
+ -l "Script";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Generic\")")
+ -p "WorldBuilder"
+ -i1 "genericlocator.bmp"
+ -ann "Create Generic Locator"
+ -l "Generic";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Car Start\")")
+ -p "WorldBuilder"
+ -i1 "carstartlocator.bmp"
+ -ann "Create Car Start Locator"
+ -l "Car Start";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Dynamic Zone\")")
+ -p "WorldBuilder"
+ -i1 "zonelocator.bmp"
+ -ann "Create Dynamic Zone Locator"
+ -l "Dynamic Zone";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Occlusion\")")
+ -p "WorldBuilder"
+ -i1 "occlusionlocator.bmp"
+ -ann "Create Occlusion Locator"
+ -l "Occlusion";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Interior Entrance\")")
+ -p "WorldBuilder"
+ -i1 "interiorlocator.bmp"
+ -ann "Create Interior Entrance Locator"
+ -l "Interior Entrance";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Directional\")")
+ -p "WorldBuilder"
+ -i1 "directionallocator.bmp"
+ -ann "Create Directional Locator"
+ -l "Directional";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Action\")")
+ -p "WorldBuilder"
+ -i1 "actionlocator.bmp"
+ -ann "Create Action Locator"
+ -l "Action";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"FOV\")")
+ -p "WorldBuilder"
+ -i1 "fovlocator.bmp"
+ -ann "Create FOV Locator"
+ -l "FOV";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Breakable Camera\")")
+ -p "WorldBuilder"
+ -i1 "breakablecameralocator.bmp"
+ -ann "Create Breakable Camera Locator"
+ -l "Breakable Camera";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Static Camera\")")
+ -p "WorldBuilder"
+ -i1 "staticcameralocator.bmp"
+ -ann "Create Static Camera Locator"
+ -l "Static Camera";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Ped Group\")")
+ -p "WorldBuilder"
+ -i1 "pedgrouplocator.bmp"
+ -ann "Create Ped Group Locator"
+ -l "Ped Group";
+
+}
+
+
+//-----------------------------------------------------------------------------
+// w b _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install WB menu as a root menu.
+ //
+ if ( `menu -exists wb_MainMenu` ) deleteUI wb_MainMenu;
+ menu -label "World Builder" -allowOptionBoxes true -parent $gMainWindow wb_MainMenu;
+
+ wb_doMainMenuItems "wb_MainMenu";
+}
+
+evalDeferred "wb_InstallUI";
+
+source "wb_setup.mel";
+source "wb_locator.mel";
+source "wb_splines.mel";
+source "wb_coinsplines.mel";
+source "AEWBTriggerButton.mel";
+source "AEWBSelectTarget.mel"; \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_setup.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_setup.mel
new file mode 100644
index 0000000..9211390
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_setup.mel
@@ -0,0 +1,6 @@
+//Create the WorldBuilderNode.
+
+
+global proc wb_Create_WorldBuilderNode()
+{
+} \ No newline at end of file
diff --git a/tools/MayaTools/Maya4.0/scripts/others/wb_splines.mel b/tools/MayaTools/Maya4.0/scripts/others/wb_splines.mel
new file mode 100644
index 0000000..ab99858
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/others/wb_splines.mel
@@ -0,0 +1,46 @@
+global int $gSplineCompleteCB = -1;
+
+global proc wb_MCB_CreateCameraPath()
+{
+ global int $gSplineCompleteCB;
+
+ if ( !`contextInfo -exists CameraSplineCtx` )
+ {
+ curveCVCtx -degree 3 -me false -un true CameraSplineCtx;
+ }
+ else
+ {
+ string $currentCtx = `currentCtx`;
+
+ if ( $currentCtx == "CameraSplineCtx" )
+ {
+ ctxCompletion;
+
+ wb_CB_SplineComplete();
+ }
+ }
+
+ setToolTo CameraSplineCtx;
+
+ $gSplineCompleteCB = `scriptJob -ro 1 -p "WorldBuilder" -e "ToolChanged" wb_CB_SplineComplete`;
+}
+
+global proc wb_CB_SplineComplete()
+{
+ WB_SplineComplete();
+}
+
+global proc wb_SplinesCleanup()
+{
+ global int $gSplineCompleteCB;
+
+ if ( $gSplineCompleteCB != -1 )
+ {
+ scriptJob -k $gSplineCompleteCB;
+ }
+
+ if ( `contextInfo -exists CameraSplineCtx` )
+ {
+ deleteUI -tc CameraSplineCtx;
+ }
+}
diff --git a/tools/MayaTools/Maya4.0/scripts/srr2rules.txt b/tools/MayaTools/Maya4.0/scripts/srr2rules.txt
new file mode 100644
index 0000000..814be8f
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/srr2rules.txt
@@ -0,0 +1,13 @@
+rule
+{
+ severity 9
+ if type tlMeshChunk
+
+ rule
+ {
+ scope children
+ label "Mesh using lambert!"
+ if type tlPrimGroupChunk
+ require Shader != "lambert[0-9]+"
+ }
+} \ No newline at end of file
diff --git a/tools/SearchReplace/SearchReplace.cpp b/tools/SearchReplace/SearchReplace.cpp
new file mode 100644
index 0000000..f2fe3a9
--- /dev/null
+++ b/tools/SearchReplace/SearchReplace.cpp
@@ -0,0 +1,336 @@
+// SearchReplace.cpp : Defines the entry point for the console application.
+//
+
+#include <assert.h>
+#include <vector>
+
+class ReplacementTableEntry;
+
+std::vector<ReplacementTableEntry*> gReplacementTable;
+
+bool BuildReplacementTable( FILE* rulesFile );
+void RemoveNewLine( char* string );
+bool IsWhiteSpace( char* string );
+void ProcessSourceFile( FILE* sourceFile, FILE* targetFile );
+
+
+
+class ReplacementTableEntry
+{
+ public:
+
+ ReplacementTableEntry( const char* findString, const char* replaceString );
+ ~ReplacementTableEntry();
+
+ char* mFindString;
+ char* mReplaceString;
+};
+
+
+ReplacementTableEntry::ReplacementTableEntry
+(
+ const char* findString,
+ const char* replaceString
+)
+:
+mFindString( 0 ),
+mReplaceString( 0 )
+{
+ assert( findString );
+ assert( replaceString );
+
+ mFindString = new char[strlen(findString)+1];
+ strcpy( mFindString, findString );
+
+ mReplaceString = new char[strlen(replaceString)+1];
+ strcpy( mReplaceString, replaceString );
+}
+
+ReplacementTableEntry::~ReplacementTableEntry()
+{
+ delete [] mFindString;
+ delete [] mReplaceString;
+}
+
+
+
+//==============================================================================
+// int main
+//==============================================================================
+//
+// Description:
+//
+// Parameters:
+//
+// Return:
+//
+//==============================================================================
+int main(int argc, char* argv[])
+{
+ // Validate command line arguments
+ assert( argc == 4 );
+
+ const char* rulesName = argv[1];
+ const char* sourceName = argv[2];
+ const char* targetName = argv[3];
+
+ // Open rules file
+ FILE* rulesFile = fopen( rulesName, "rt" );
+
+ if( rulesFile == NULL )
+ {
+ printf( "Failed to open rules file: %s\n", rulesName );
+ return( 0 );
+ }
+
+ // Build search and replace table
+ bool result = BuildReplacementTable( rulesFile );
+
+ // Close rules file
+ fclose( rulesFile );
+
+
+ // Open source file
+ FILE* sourceFile = fopen( sourceName, "rt" );
+
+ if( sourceFile == NULL )
+ {
+ fclose( rulesFile );
+ printf( "Failed to open source file: %s\n", sourceName );
+ return( 0 );
+ }
+
+ // Open target file
+ FILE* targetFile = fopen( targetName, "wt" );
+
+ if( targetFile == NULL )
+ {
+ fclose( rulesFile );
+ fclose( sourceFile );
+ printf( "Failed to open target file: %s\n", targetName );
+ return( 0 );
+ }
+
+ // Process source file
+
+ ProcessSourceFile( sourceFile, targetFile );
+
+ fclose( sourceFile );
+ fclose( targetFile );
+
+
+ // Clean up
+ std::vector<ReplacementTableEntry*>::const_iterator iter = gReplacementTable.begin();
+
+ for( ; iter != gReplacementTable.end(); ++iter )
+ {
+ ReplacementTableEntry* entry = (*iter);
+
+ delete entry;
+ }
+
+ gReplacementTable.clear();
+
+ return 0;
+}
+
+
+//==============================================================================
+// bool BuildReplacementTable
+//==============================================================================
+//
+// Description:
+//
+// Parameters:
+//
+// Return:
+//
+//==============================================================================
+bool BuildReplacementTable( FILE* rulesFile )
+{
+ // Get the next line from the file
+
+ int lineCount = 0;
+
+ while( 1 )
+ {
+ const int BUFFER_SIZE = 512;
+ char* fgetsResult;
+ char lineBuffer[BUFFER_SIZE];
+
+ do
+ { if( feof( rulesFile ) )
+ {
+ return( true );
+ }
+
+ fgetsResult = fgets( lineBuffer, BUFFER_SIZE, rulesFile );
+ ++lineCount;
+ }
+ while( IsWhiteSpace( lineBuffer ) == true );
+
+ char findString[BUFFER_SIZE];
+ strcpy( findString, lineBuffer );
+ RemoveNewLine( findString );
+
+
+ do
+ {
+ if( feof( rulesFile ) )
+ {
+ printf( "Error in rules file, missing replace string (line: %d)\n", lineCount );
+ return( false );
+ }
+
+ fgetsResult = fgets( lineBuffer, BUFFER_SIZE, rulesFile );
+ ++lineCount;
+ }
+ while( IsWhiteSpace( lineBuffer ) == true );
+
+ char replaceString[BUFFER_SIZE];
+ strcpy( replaceString, lineBuffer );
+ RemoveNewLine( replaceString );
+
+ // Create Entry
+ //
+ ReplacementTableEntry* entry = new ReplacementTableEntry( findString, replaceString );
+ gReplacementTable.push_back( entry );
+ }
+}
+
+
+//==============================================================================
+// void RemoveNewLine
+//==============================================================================
+//
+// Description:
+//
+// Parameters:
+//
+// Return:
+//
+//==============================================================================
+void RemoveNewLine( char* string )
+{
+ assert( string );
+
+ int length = strlen( string );
+
+ int i;
+ for( i = 0; i < length; ++i )
+ {
+ if( '\n' == string[i] )
+ {
+ string[i] = '\0';
+ }
+ }
+}
+
+
+//==============================================================================
+// bool IsWhiteSpace
+//==============================================================================
+//
+// Description:
+//
+// Parameters:
+//
+// Return:
+//
+//==============================================================================
+bool IsWhiteSpace( char* string )
+{
+ assert( string );
+
+ int length = strlen( string );
+
+ int i;
+ for( i = 0; i < length; ++i )
+ {
+ if( (string[i] != '\n') && (string[i] != ' ') )
+ {
+ return( false );
+ }
+ }
+
+ return( true );
+}
+
+
+//==============================================================================
+// void ProcessSourceFile
+//==============================================================================
+//
+// Description:
+//
+// Parameters:
+//
+// Return:
+//
+//==============================================================================
+void ProcessSourceFile( FILE* sourceFile, FILE* targetFile )
+{
+ int lineNumber = 0;
+ while( !feof( sourceFile ) )
+ {
+ // Read in a line from the source
+ const int BUFFER_SIZE = 1024;
+ char* fgetsResult;
+ char sourceBuffer[BUFFER_SIZE];
+ char targetBuffer[BUFFER_SIZE];
+
+ fgetsResult = fgets( sourceBuffer, BUFFER_SIZE, sourceFile );
+ strcpy( targetBuffer, sourceBuffer );
+ ++lineNumber;
+
+ // Iterate through the find strings for a match
+ std::vector<ReplacementTableEntry*>::const_iterator iter = gReplacementTable.begin();
+
+ for( ; iter != gReplacementTable.end(); ++iter )
+ {
+ ReplacementTableEntry* entry = (*iter);
+
+ char* start = sourceBuffer;
+ char* targetPos = targetBuffer;
+ char* found = NULL;
+
+ do
+ {
+ found = strstr( start, entry->mFindString );
+
+ // Replace if found
+ if( found != NULL )
+ {
+ // Copy over the prefix
+ memcpy(targetPos, start, found - start );
+ targetPos += found - start;
+
+ // Copy over the replacement string
+ memcpy(targetPos, entry->mReplaceString, strlen( entry->mReplaceString ) );
+ targetPos += strlen( entry->mReplaceString );
+ start = found + strlen( entry->mFindString );
+
+ // Copy over the postfix
+ memcpy( targetPos, start, strlen(start) );
+
+ // NULL terminate
+ char* term = targetPos + strlen(start);
+ *term = '\0';
+ }
+ }
+ while( found != NULL );
+
+ // The target now becomes the source to preserve any replacements.
+ strcpy( sourceBuffer, targetBuffer );
+ }
+
+ // Write out line to target
+ fputs( targetBuffer, targetFile );
+ }
+
+
+
+
+
+
+} \ No newline at end of file
diff --git a/tools/SearchReplace/SearchReplace.dsp b/tools/SearchReplace/SearchReplace.dsp
new file mode 100644
index 0000000..6e15a4e
--- /dev/null
+++ b/tools/SearchReplace/SearchReplace.dsp
@@ -0,0 +1,97 @@
+# Microsoft Developer Studio Project File - Name="SearchReplace" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=SearchReplace - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "SearchReplace.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "SearchReplace.mak" CFG="SearchReplace - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "SearchReplace - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "SearchReplace - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "SearchReplace - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "RAD_WIN32" /D "RAD_RELEASE" /Yu"stdafx.h" /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "SearchReplace - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\game\libs\radcore\inc" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "RAD_WIN32" /D "RAD_DEBUG" /FD /GZ /c
+# SUBTRACT CPP /YX /Yc /Yu
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "SearchReplace - Win32 Release"
+# Name "SearchReplace - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\SearchReplace.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# End Target
+# End Project
diff --git a/tools/SearchReplace/SearchReplace.dsw b/tools/SearchReplace/SearchReplace.dsw
new file mode 100644
index 0000000..d28da6e
--- /dev/null
+++ b/tools/SearchReplace/SearchReplace.dsw
@@ -0,0 +1,32 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "SearchReplace"=.\SearchReplace.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name radcore
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/SectorTable/Release/SectorTable.exe b/tools/SectorTable/Release/SectorTable.exe
new file mode 100644
index 0000000..bedcb51
--- /dev/null
+++ b/tools/SectorTable/Release/SectorTable.exe
Binary files differ
diff --git a/tools/SectorTable/SectorTable.cpp b/tools/SectorTable/SectorTable.cpp
new file mode 100644
index 0000000..41cd895
--- /dev/null
+++ b/tools/SectorTable/SectorTable.cpp
@@ -0,0 +1,121 @@
+// SectorTable.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+#include <tlentity.hpp>
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+ const int NameCount = 75;
+ char* sectorNames[ NameCount ] = {
+ "l1r1.p3d", "l1r2.p3d", "l1r3.p3d", "l1r4a.p3d", "l1r4b.p3d", "l1r6.p3d", "l1r7.p3d",
+ "l1z1.p3d", "l1z2.p3d", "l1z3.p3d", "l1z4.p3d", "l1z6.p3d", "l1z7.p3d",
+ "l2r1.p3d", "l2r2.p3d", "l2r3.p3d", "l2r4.p3d",
+ "l2z1.p3d", "l2z2.p3d", "l2z3.p3d", "l2z4.p3d",
+ "l3r1.p3d", "l3r2.p3d", "l3r3.p3d", "l3r4.p3d", "l3r5.p3d",
+ "l3z1.p3d", "l3z2.p3d", "l3z3.p3d", "l3z4.p3d", "l3z5.p3d",
+ "l4r1.p3d", "l4r2.p3d", "l4r3.p3d", "l4r4a.p3d", "l4r4b.p3d", "l4r6.p3d", "l4r7.p3d",
+ "l4z1.p3d", "l4z2.p3d", "l4z3.p3d", "l4z4.p3d", "l4z6.p3d", "l4z7.p3d",
+ "l5r1.p3d", "l5r2.p3d", "l5r3.p3d", "l5r4.p3d",
+ "l5z1.p3d", "l5z2.p3d", "l5z3.p3d", "l5z4.p3d",
+ "l6r1.p3d", "l6r2.p3d", "l6r3.p3d", "l6r4.p3d", "l6r5.p3d",
+ "l6z1.p3d", "l6z2.p3d", "l6z3.p3d", "l6z4.p3d", "l6z5.p3d",
+ "l7r1.p3d", "l7r2.p3d", "l7r3.p3d", "l7r4a.p3d", "l7r4b.p3d", "l7r6.p3d", "l7r7.p3d",
+ "l7z1.p3d", "l7z2.p3d", "l7z3.p3d", "l7z4.p3d", "l7z6.p3d", "l7z7.p3d" };
+
+ char* typeStr[ 4 ] = { "unsigned char", "unsigned short", "int", "TLUID" };
+ TLUID sectorIDs[ NameCount ];
+ for( int i = 0; i < NameCount; ++i )
+ {
+ sectorIDs[ i ] = tlEntity::MakeUID( sectorNames[ i ] );
+ }
+
+ // Check for dups in the lower order bits.
+ bool noDups = true;
+ int type = 0;
+ int mask = 0xFF;
+ for( int i = 0; ( i < NameCount - 1 ) && ( noDups ); ++i )
+ {
+ char first = (char)( sectorIDs[ i ] & mask );
+ for( int j = i + 1; j < NameCount; ++j )
+ {
+ char second = (char)( sectorIDs[ j ] & mask );
+ if( first == second )
+ {
+ noDups = false;
+ break;
+ }
+ }
+ }
+ if( !noDups )
+ {
+ ++type;
+ noDups = true;
+ mask = 0xFFFF;
+ for( int i = 0; ( i < NameCount - 1 ) && ( noDups ); ++i )
+ {
+ short first = (short)( sectorIDs[ i ] & mask );
+ for( int j = i + 1; j < NameCount; ++j )
+ {
+ short second = (short)( sectorIDs[ j ] & mask );
+ if( first == second )
+ {
+ noDups = false;
+ break;
+ }
+ }
+ }
+ }
+ if( !noDups )
+ {
+ ++type;
+ noDups = true;
+ mask = 0xFFFFFFFF;
+ for( int i = 0; ( i < NameCount - 1 ) && ( noDups ); ++i )
+ {
+ int first = (int)( sectorIDs[ i ] & mask );
+ for( int j = i + 1; j < NameCount; ++j )
+ {
+ int second = (int)( sectorIDs[ j ] & mask );
+ if( first == second )
+ {
+ noDups = false;
+ break;
+ }
+ }
+ }
+ }
+ if( !noDups )
+ {
+ ++type;
+ }
+
+ printf( "// Auto generated with SectorTable.\n" );
+ printf( "struct SectorMap\n{\n %s Sector;\n char CurIndex;\n};\n\n", typeStr[ type ] );
+ printf( "static const int NUM_SECTORS = %d;\n\n", NameCount );
+ printf( "SectorMap sSectorMap[ NUM_SECTORS ] = {\n" );
+ for( int i = 0; i < NameCount; ++i )
+ {
+ TLUID id = tlEntity::MakeUID( sectorNames[ i ] );
+ unsigned hi = (unsigned)( id >> 32 );
+ unsigned lo = (unsigned)( id & 0xFFFFFFFF );
+ printf( "{ 0x" );
+ switch( type )
+ {
+ case 0:
+ printf("%02X", lo & 0xFF );
+ break;
+ case 1:
+ printf("%04X", lo & 0xFFFF );
+ break;
+ case 2:
+ printf("%08X", lo );
+ break;
+ default:
+ printf( "%08X%08X", hi, lo );
+ break;
+ }
+ printf( ", 0 }%s //%s\n", i != NameCount -1 ? ", " : " };", sectorNames[ i ] );
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/tools/SectorTable/SectorTable.sln b/tools/SectorTable/SectorTable.sln
new file mode 100644
index 0000000..c40d4c8
--- /dev/null
+++ b/tools/SectorTable/SectorTable.sln
@@ -0,0 +1,51 @@
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib", "..\..\game\libs\pure3d\toollib\toollib.vcproj", "{A224C960-67EC-49C2-8171-9FA441C7634D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SectorTable", "SectorTable.vcproj", "{B316572B-39EC-4EB1-B40D-E62D1B033F52}"
+EndProject
+Global
+ GlobalSection(SourceCodeControl) = preSolution
+ SccNumberOfProjects = 1
+ SccProjectUniqueName0 = ..\\..\\game\\libs\\pure3d\\toollib\\toollib.vcproj
+ SccProjectName0 = Perforce\u0020Project
+ SccLocalPath0 = ..\\..\\game\\libs\\pure3d\\toollib
+ SccProvider0 = MSSCCI:Perforce\u0020SCM
+ CanCheckoutShared = true
+ EndGlobalSection
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = Debug
+ ConfigName.1 = Release
+ ConfigName.2 = Tools Debug
+ ConfigName.3 = Tools Release
+ ConfigName.4 = Tune
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.0 = {A224C960-67EC-49C2-8171-9FA441C7634D}
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Debug.ActiveCfg = Debug|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Debug.Build.0 = Debug|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Release.ActiveCfg = Release|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Release.Build.0 = Release|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tools Debug.ActiveCfg = Tools Debug|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tools Debug.Build.0 = Tools Debug|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tools Release.ActiveCfg = Tools Release|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tools Release.Build.0 = Tools Release|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tune.ActiveCfg = Tools Release|Win32
+ {A224C960-67EC-49C2-8171-9FA441C7634D}.Tune.Build.0 = Tools Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Debug.ActiveCfg = Debug|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Debug.Build.0 = Debug|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Release.ActiveCfg = Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Release.Build.0 = Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tools Debug.ActiveCfg = Debug|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tools Debug.Build.0 = Debug|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tools Release.ActiveCfg = Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tools Release.Build.0 = Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tune.ActiveCfg = Release|Win32
+ {B316572B-39EC-4EB1-B40D-E62D1B033F52}.Tune.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/tools/SectorTable/SectorTable.vcproj b/tools/SectorTable/SectorTable.vcproj
new file mode 100644
index 0000000..be79730
--- /dev/null
+++ b/tools/SectorTable/SectorTable.vcproj
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="SectorTable"
+ ProjectGUID="{B316572B-39EC-4EB1-B40D-E62D1B033F52}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\game\libs\pure3d\toollib\inc"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;RAD_PC;RAD_DEBUG;RAD_WIN32"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/SectorTable.exe"
+ LinkIncremental="2"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/SectorTable.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="TRUE"
+ AdditionalIncludeDirectories="..\..\game\libs\pure3d\toollib\inc"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="3"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/SectorTable.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
+ <File
+ RelativePath="SectorTable.cpp">
+ </File>
+ <File
+ RelativePath="stdafx.cpp">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc">
+ <File
+ RelativePath="stdafx.h">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/SectorTable/stdafx.cpp b/tools/SectorTable/stdafx.cpp
new file mode 100644
index 0000000..0366889
--- /dev/null
+++ b/tools/SectorTable/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// SectorTable.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/tools/SectorTable/stdafx.h b/tools/SectorTable/stdafx.h
new file mode 100644
index 0000000..ea18047
--- /dev/null
+++ b/tools/SectorTable/stdafx.h
@@ -0,0 +1,12 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#include <stdio.h>
+#include <tchar.h>
+
+// TODO: reference additional headers your program requires here
diff --git a/tools/UpgradeLog.htm b/tools/UpgradeLog.htm
new file mode 100644
index 0000000..13925ea
--- /dev/null
+++ b/tools/UpgradeLog.htm
Binary files differ
diff --git a/tools/UpgradeLog2.htm b/tools/UpgradeLog2.htm
new file mode 100644
index 0000000..e520582
--- /dev/null
+++ b/tools/UpgradeLog2.htm
Binary files differ
diff --git a/tools/bin/make.exe b/tools/bin/make.exe
new file mode 100644
index 0000000..28abc1e
--- /dev/null
+++ b/tools/bin/make.exe
Binary files differ
diff --git a/tools/bin/sh.exe b/tools/bin/sh.exe
new file mode 100644
index 0000000..0313313
--- /dev/null
+++ b/tools/bin/sh.exe
Binary files differ
diff --git a/tools/bin/tee.exe b/tools/bin/tee.exe
new file mode 100644
index 0000000..7b32b2a
--- /dev/null
+++ b/tools/bin/tee.exe
Binary files differ
diff --git a/tools/globalcode/utility/GLExt.cpp b/tools/globalcode/utility/GLExt.cpp
new file mode 100644
index 0000000..4b069ba
--- /dev/null
+++ b/tools/globalcode/utility/GLExt.cpp
@@ -0,0 +1,1129 @@
+#include "precompiled/PCH.h"
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// GLExt.cpp
+//
+// Description: Functions that do drawing using the OpenGL API.
+//
+// Modification History:
+// + Created Aug 21, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <windows.h>
+#include <assert.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glaux.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "GLExt.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+//=============================================================================
+// GLExt::drawCamera3D
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx = 0.0f, double ty = 0.0f, double tz = 0.0f, float width = 1.0f )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawCamera3D( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+
+ //Set line width
+ glLineWidth( width );
+
+ glBegin( GL_LINES );
+ //X-Z
+ glVertex3d(-0.5, 0.0, 0.5 );
+ glVertex3d( 0.5, 0.0, 0.5 );
+
+ glVertex3d( 0.5, 0.0, 0.5 );
+ glVertex3d( 0.5, 0.0, -0.5 );
+
+ glVertex3d( 0.5, 0.0, -0.5 );
+ glVertex3d( -0.5, 0.0, -0.5 );
+
+ glVertex3d( -0.5, 0.0, -0.5 );
+ glVertex3d( -0.5, 0.0, 0.5 );
+
+ glVertex3d( 0.125, 0.0, -0.5 );
+ glVertex3d( 0.325, 0.0, -0.75 );
+
+ glVertex3d( 0.325, 0.0, -0.75 );
+ glVertex3d( -0.325, 0.0, -0.75 );
+
+ glVertex3d( -0.325, 0.0, -0.75 );
+ glVertex3d( -0.125, 0.0, -0.5 );
+
+ //Y-Z
+ glVertex3d( 0.0, -0.5, 0.5 );
+ glVertex3d( 0.0, 0.5, 0.5 );
+
+ glVertex3d( 0.0, 0.5, 0.5 );
+ glVertex3d( 0.0, 0.5, -0.5 );
+
+ glVertex3d( 0.0, 0.5, -0.5 );
+ glVertex3d( 0.0, -0.5, -0.5 );
+
+ glVertex3d( 0.0, -0.5, -0.5 );
+ glVertex3d( 0.0, -0.5, 0.5 );
+
+ glVertex3d( 0.0, 0.125, -0.5 );
+ glVertex3d( 0.0, 0.325, -0.75 );
+
+ glVertex3d( 0.0, 0.325, -0.75 );
+ glVertex3d( 0.0, -0.325, -0.75 );
+
+ glVertex3d( 0.0, -0.325, -0.75 );
+ glVertex3d( 0.0, -0.125, -0.5 );
+ glEnd();
+ glPopMatrix();
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ glLineWidth( oldWidth );
+
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w C r o s s H a i r 3 D
+//
+// Synopsis: Draws a camera symbol
+//
+// Parameters: scale - the scale to draw at.
+// x - the x coordinate of the symbol.
+// y - the y coordinate of the symbol.
+// z - the z coordinate of the symbol.
+// width - line width
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawCrossHair3D( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+
+ //Set line width
+ glLineWidth( width );
+
+ glBegin( GL_LINES );
+ glVertex3d(-1.0, 0.0, 0.0 );
+ glVertex3d( 1.0, 0.0, 0.0 );
+
+ glVertex3d( 0.0, -1.0, 0.0 );
+ glVertex3d( 0.0, 1.0, 0.0 );
+
+ glVertex3d( 0.0, 0.0, -1.0 );
+ glVertex3d( 0.0, 0.0, 1.0 );
+ glEnd();
+ glPopMatrix();
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ glLineWidth( oldWidth );
+
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w C r o s s H a i r 3 D
+//
+// Synopsis: Draws a camera symbol
+//
+// Parameters: scale - the scale to draw the symbol at.
+// p - where to draw the symbol.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawCrossHair3D( double scale, const MPoint& p, float width )
+{
+ drawCrossHair3D( scale, p.x, p.y, p.z, width );
+}
+
+
+//-----------------------------------------------------------------------------
+// d r a w P y r a m i d
+//
+// Synopsis: Draws a pyramid using OpenGL.
+//
+// Parameters: scale - factor of scaling for the pyramid.
+// tx - x position translation.
+// ty - y position translation.
+// tz - z position translation.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawPyramid( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_QUAD_STRIP );
+ glVertex3d(0.5, 0 ,0.5);
+ glVertex3d(0, 1, 0);
+ glVertex3d(0.5, 0, -0.5);
+ glVertex3d(0, 1, 0);
+ glVertex3d(-0.5, 0, -0.5);
+ glVertex3d(0, 1, 0);
+ glVertex3d(-0.5, 0 ,0.5);
+ glVertex3d(0, 1, 0);
+ glVertex3d(0.5, 0 ,0.5);
+ glVertex3d(0, 1, 0);
+ glEnd();
+ glPopMatrix();
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ glLineWidth( oldWidth );
+
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w P y r a m i d
+//
+// Synopsis: Draws a pyramid using OpenGL.
+//
+// Parameters: scale - factor of scaling for the pyramid.
+// p0 - the point at which to draw the pyramid.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawPyramid( double scale, const MPoint& p0, float width )
+{
+ drawPyramid( scale, p0.x, p0.y, p0.z, width );
+}
+
+//-----------------------------------------------------------------------------
+// d r a w S p h e r e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//------------------------------------------------------radius-----------------------
+void GLExt::drawSphere( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+
+ GLUquadricObj* quadric = gluNewQuadric();
+ gluQuadricDrawStyle( quadric, GLU_LINE );
+ gluSphere( quadric, 1.0, 12, 6 );
+
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w S p h e r e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawSphere( double scale, const MPoint& p, float width )
+{
+ drawSphere( scale, p.x, p.y, p.z, width );
+}
+
+//-----------------------------------------------------------------------------
+// d r a w L i n e
+//
+// Synopsis: Draws a line between the two points.
+//
+// Parameters: The coordinates of the two points.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawLine( double x0, double y0, double z0,
+ double x1, double y1, double z1,
+ float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glBegin( GL_LINES );
+ glVertex3f( (float)x0, (float)y0, (float)z0 );
+ glVertex3f( (float)x1, (float)y1, (float)z1 );
+ glEnd();
+
+ //Reset line width
+ glLineWidth( oldWidth );
+
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w L i n e
+//
+// Synopsis: Draws a line between the two points.
+//
+// Parameters: The points to draw the line between.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawLine( const MPoint& p0, const MPoint& p1, float width )
+{
+ drawLine( p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, width );
+}
+
+//=============================================================================
+// GLExt::drawArrow
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MPoint& p0, const MPoint& p1, float width, float scale )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawArrow( const MPoint& p0, const MPoint& p1, float width, float scale )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ MVector scaledVector;
+ scaledVector = p1 - p0;
+ scaledVector /= scale;
+
+ //Figure out a cross product...
+ MVector normal;
+
+ normal = scaledVector^( MVector(0, 1.0, 0 ) );
+ normal.normalize();
+ normal *= scaledVector.length();
+
+ MPoint head0, head1;
+
+ head0 = (p1 - scaledVector + normal );
+ head1 = (p1 - scaledVector - normal );
+
+ //Set line width
+ glLineWidth( width );
+
+ glBegin( GL_LINES );
+ glVertex3f( (float)p0.x, (float)p0.y, (float)p0.z );
+ glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
+
+ glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
+ glVertex3f( (float)head0.x, (float)head0.y, (float)head0.z );
+
+ glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
+ glVertex3f( (float)head1.x, (float)head1.y, (float)head1.z );
+ glEnd();
+
+ //Reset line width
+ glLineWidth( oldWidth );
+
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w B o x
+//
+// Synopsis: Draws a box using OpenGL.
+//
+// Parameters: The coordinates of the minimal and maximal corners of the box.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawBox( double x0, double y0, double z0,
+ double x1, double y1, double z1,
+ float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glBegin( GL_QUADS );
+
+ glVertex3f( (float)x0, (float)y0, (float)z0 );
+ glVertex3f( (float)x0, (float)y0, (float)z1 );
+ glVertex3f( (float)x1, (float)y0, (float)z1 );
+ glVertex3f( (float)x1, (float)y0, (float)z0 );
+
+ glVertex3f( (float)x0, (float)y1, (float)z0 );
+ glVertex3f( (float)x0, (float)y1, (float)z1 );
+ glVertex3f( (float)x1, (float)y1, (float)z1 );
+ glVertex3f( (float)x1, (float)y1, (float)z0 );
+
+ glEnd();
+
+ glBegin( GL_LINES );
+
+ glVertex3f( (float)x0, (float)y0, (float)z0 );
+ glVertex3f( (float)x0, (float)y1, (float)z0 );
+
+ glVertex3f( (float)x0, (float)y0, (float)z1 );
+ glVertex3f( (float)x0, (float)y1, (float)z1 );
+
+ glVertex3f( (float)x1, (float)y0, (float)z1 );
+ glVertex3f( (float)x1, (float)y1, (float)z1 );
+
+ glVertex3f( (float)x1, (float)y0, (float)z0 );
+ glVertex3f( (float)x1, (float)y1, (float)z0 );
+ glEnd();
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w B o x
+//
+// Synopsis: Draws a box using OpenGL.
+//
+// Parameters: p0 - the minimal corner of the box.
+// p1 - the maximal corner of the box.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawBox( const MPoint& p0, const MPoint& p1, float width )
+{
+ drawBox( p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, width );
+}
+
+//-----------------------------------------------------------------------------
+// d r a w X Z P l a n e
+//
+// Synopsis: Draws a finite plane in the XZ plane using OpenGL.
+//
+// Parameters: x0, z0 - the minimal vertex of the finite plane.
+// x1, z1 - the maximal vertex of the finite plane.
+// y - the height of the plane.
+//
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawXZPlane( double xscale,
+ double yscale,
+ double zscale,
+ double x0,
+ double z0,
+ double x1,
+ double z1,
+ double y,
+ float width
+ )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(xscale, yscale, zscale);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE );
+ glBegin( GL_QUADS );
+
+ glVertex3f( (float)x0, (float)y, (float)z0 );
+ glVertex3f( (float)x0, (float)y, (float)z1 );
+ glVertex3f( (float)x1, (float)y, (float)z1 );
+ glVertex3f( (float)x1, (float)y, (float)z0 );
+
+ glEnd();
+
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// d r a w X Z P l a n e
+//
+// Synopsis: Draws a finite plane in the XZ plane using OpenGL.
+//
+// Parameters: p0 - the minimal vertex of the finite plane.
+// p1 - the maximal vertex of the finite plane.
+//
+// Returns: NOTHING
+//
+// Constraints: The y component of p1 is ignored and the plane is drawn at
+// the height of the first point.
+//
+//-----------------------------------------------------------------------------
+void GLExt::drawXZPlane( double xscale,
+ double yscale,
+ double zscale,
+ const MPoint& v0,
+ const MPoint& v1,
+ float width
+ )
+{
+ drawXZPlane( xscale, yscale, zscale, v0.x, v0.z, v1.x, v1.z, v0.y, width );
+}
+
+//=============================================================================
+// GLExt::drawP
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawP(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_LOOP );
+ //Draw a "P" for pickup.
+ glVertex3d( 0,0,0);
+ glVertex3d( 0, 2.0, 0);
+ glVertex3d( 0.7, 2.0, 0);
+ glVertex3d( 1.2, 1.7, 0);
+ glVertex3d( 1.2, 1.3, 0);
+ glVertex3d( 0.7, 1, 0);
+ glVertex3d( 0, 1, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawStickMan
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawStickMan(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINES );
+ glVertex3d( 0,0.6,0);
+ glVertex3d( 0, 1.5, 0);
+ glVertex3d( -0.5, 1.2, 0.0);
+ glVertex3d( 0.5, 1.2, 0);
+ glEnd();
+ glBegin( GL_LINE_STRIP );
+ glVertex3d( -0.5, 0, 0 );
+ glVertex3d( 0, 0.6, 0 );
+ glVertex3d( 0.5, 0, 0 );
+ glEnd();
+ glBegin( GL_QUADS );
+ glVertex3d( -0.125, 1.5, 0 );
+ glVertex3d( -0.125, 1.75, 0 );
+ glVertex3d( 0.125, 1.75, 0 );
+ glVertex3d( 0.125, 1.5, 0 );
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawCar
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawCar(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_LOOP );
+ glVertex3d( 0, 0, 0);
+ glVertex3d( 0, 0, -0.25);
+ glVertex3d( 0, -0.2, -0.5 );
+ glVertex3d( 0, 0, -0.75 );
+ glVertex3d( 0, 0, -1.0 );
+ glVertex3d( 0, 0.4, -1.0 );
+ glVertex3d( 0, 0.4, -0.5 );
+ glVertex3d( 0, 0.7, -0.45 );
+ glVertex3d( 0, 0.7, 0.25 );
+ glVertex3d( 0, 0.4, 0.4 );
+ glVertex3d( 0, 0.3, 1.0 );
+ glVertex3d( 0, 0, 1.0 );
+ glVertex3d( 0, 0, 0.75 );
+ glVertex3d( 0, -0.2, 0.5 );
+ glVertex3d( 0, 0, 0.25 );
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawA
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawA(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ //Draw an "A" on top of the pyramid
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINES );
+ glVertex3d( 0, 2.0, 0);
+ glVertex3d( -0.7, 0, 0);
+ glVertex3d( 0, 2.0, 0);
+ glVertex3d( 0.7, 0, 0);
+ glVertex3d( -0.7, 1.2, 0);
+ glVertex3d( 0.7, 1.2, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawD
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawD(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ //Draw a "D" on top of the pyramid
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glTranslated( -0.6, 0, 0);
+ glBegin( GL_LINE_LOOP );
+ //Draw a "D" for dropoff.
+ glVertex3d( 0, 0, 0);
+ glVertex3d( 0, 2.0, 0);
+ glVertex3d( 0.6, 2.0, 0);
+ glVertex3d( 1.1, 1.7, 0);
+ glVertex3d( 1.2, 1, 0);
+ glVertex3d( 1.1, 0.3, 0);
+ glVertex3d( 0.6, 0, 0);
+ glEnd();
+ glPopMatrix();
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawE
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawE(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ //Draw the Letter "E" on top of the pyramid
+ glPushMatrix();
+ glScaled(scale, scale, scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINES );
+ glVertex3d( -0.4, 2, 0);
+ glVertex3d( -0.4, 0, 0);
+ glVertex3d( -0.4, 1, 0);
+ glVertex3d( 0.3, 1, 0);
+ glVertex3d( -0.4, 0, 0);
+ glVertex3d( 0.4, 0, 0);
+ glVertex3d( -0.4, 2, 0);
+ glVertex3d( 0.4, 2, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawS
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawS(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glTranslated( -0.75, 0, 0);
+ glBegin( GL_LINE_STRIP );
+ //Draw an "S" for sound
+ glVertex3d( 0, 0.3, 0);
+ glVertex3d( 0.4, 0, 0);
+ glVertex3d( 1.2, 0, 0);
+ glVertex3d( 1.5, 0.4, 0);
+ glVertex3d( 1.2, 0.8, 0);
+ glVertex3d( 0.3, 1.25, 0);
+ glVertex3d( 0.05, 1.5, 0);
+ glVertex3d( 0.25, 1.9, 0);
+ glVertex3d( 0.9, 2.0, 0);
+ glVertex3d( 1.4, 1.75, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawCross
+//=============================================================================
+// Description: Comment
+//
+// Parameters: (double scale, double tx, double ty, double tz, float width)
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawCross(double scale, double tx, double ty, double tz, float width)
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled( scale, scale, scale );
+ glTranslated( tx, ty, tz );
+ glBegin( GL_LINES );
+ glVertex3d( -1, 0, 0 );
+ glVertex3d( 1, 0, 0 );
+
+ glVertex3d( 0, 1, 0 );
+ glVertex3d( 0, -1, 0 );
+
+ glVertex3d( 0, 0, 1 );
+ glVertex3d( 0, 0, -1 );
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawLBolt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawLBolt( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_STRIP );
+ glVertex3d( 0, 0, 0);
+ glVertex3d( 0.5, 0.8, 0);
+ glVertex3d( -0.2, 1.4, 0);
+ glVertex3d( 0, 2.2, 0);
+ glVertex3d( -0.5, 1.4, 0);
+ glVertex3d( 0.2, 0.8, 0);
+ glVertex3d( 0, 0, 0 );
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawI
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawI( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_STRIP );
+ glVertex3d( -0.6, 2, 0);
+ glVertex3d( 0.6, 2, 0);
+ glVertex3d( 0, 2, 0);
+ glVertex3d( 0, 0, 0);
+ glVertex3d( -0.6, 0, 0);
+ glVertex3d( 0.6, 0, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawW
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawW( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_STRIP );
+ glVertex3d( -1.0, 2.0, 0);
+ glVertex3d( -0.5, 0, 0);
+ glVertex3d( 0, 1.5, 0);
+ glVertex3d( 0.5, 0, 0);
+ glVertex3d( 1.0, 2.0, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawM
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawM( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_STRIP );
+ glVertex3d( -1.0, 0, 0);
+ glVertex3d( -0.5, 2.0, 0);
+ glVertex3d( 0, 0.5, 0);
+ glVertex3d( 0.5, 2.0, 0);
+ glVertex3d( 1.0, 0, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawC
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawC( double scale, double tx, double ty, double tz, float width )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glScaled(scale,scale,scale);
+ glTranslated(tx, ty, tz);
+ glBegin( GL_LINE_STRIP );
+ //Draw an "C" for carStart
+ glVertex3d( 0.7, 0.5, 0);
+ glVertex3d( 0.35, 0, 0);
+ glVertex3d( -0.35, 0, 0);
+ glVertex3d( -0.7, 0.5, 0);
+ glVertex3d( -0.7, 1.5, 0);
+ glVertex3d( -0.35, 2.0, 0);
+ glVertex3d( 0.35, 2.0, 0);
+ glVertex3d( 0.7, 1.5, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
+//=============================================================================
+// GLExt::drawO
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( double scale, double tx, double ty, double tz, float width )
+//
+// Return: void
+//
+//=============================================================================
+void GLExt::drawO( double scale, double tx, double ty, double tz, float width )
+{
+ scale = 100.0f;
+
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ //Store old line width
+ GLfloat oldWidth;
+ glGetFloatv( GL_LINE_WIDTH, &oldWidth );
+
+ //Set line width
+ glLineWidth( width );
+
+ glPushMatrix();
+ glTranslated(tx, ty, tz);
+ glScaled(scale,scale,scale);
+ glBegin( GL_LINE_STRIP );
+ //Draw an "O"
+ glVertex3d( 0.7, 0.5, 0);
+ glVertex3d( 0, 0, 0);
+ glVertex3d( -0.7, 0.5, 0);
+ glVertex3d( -0.7, 1.5, 0);
+ glVertex3d( 0, 2.0, 0);
+ glVertex3d( 0.7, 1.5, 0);
+ glVertex3d( 0.7, 0.5, 0);
+ glEnd();
+ glPopMatrix();
+
+ glLineWidth( oldWidth );
+ glPopAttrib();
+}
+
diff --git a/tools/globalcode/utility/GLExt.h b/tools/globalcode/utility/GLExt.h
new file mode 100644
index 0000000..ae62a4f
--- /dev/null
+++ b/tools/globalcode/utility/GLExt.h
@@ -0,0 +1,191 @@
+#ifndef _GLEXT_H
+#define _GLEXT_H
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// GLExt.h
+//
+// Description: Functions that do drawing using the OpenGL API.
+//
+// Modification History:
+// + Created Aug 21, 2001 -- bkusy
+// + grossly modified by Cary Brisebois
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+class MPoint;
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+class GLExt
+{
+public:
+ static void drawCamera3D( double scale, double tx = 0.0f,
+ double ty = 0.0f,
+ double tz = 0.0f,
+ float width = 1.0f );
+
+ static void drawCrossHair3D( double scale, double tx = 0.0f,
+ double ty = 0.0f,
+ double tz = 0.0f,
+ float width = 1.0f );
+
+ static void drawCrossHair3D( double scale,
+ const MPoint& p,
+ float width = 1.0f );
+
+
+ static void drawPyramid( double scale, double tx = 0.0f,
+ double ty = 0.0f,
+ double tz = 0.0f,
+ float width = 1.0f );
+
+ static void drawPyramid( double scale,
+ const MPoint& p0,
+ float width = 1.0f );
+
+ static void drawLine( double x0, double y0, double z0,
+ double x1, double y1, double z1,
+ float width = 1.0f );
+
+ static void drawLine( const MPoint& p0,
+ const MPoint& p1,
+ float width = 1.0f );
+
+ static void drawArrow( const MPoint& p0,
+ const MPoint& p1,
+ float width = 1.0f,
+ float scale = 6.0f );
+
+ static void drawBox( double x0, double y0, double z0,
+ double x1, double y1, double z1,
+ float width = 1.0f );
+
+ static void drawBox( const MPoint& p0,
+ const MPoint& p1,
+ float width = 1.0f );
+
+ static void drawSphere( double scale, double tx = 0,
+ double ty = 0, double tz = 0,
+ float width = 1.0f );
+
+ static void drawSphere( double scale,
+ const MPoint& p,
+ float width = 1.0f );
+
+ static void drawXZPlane( double xscale,
+ double yscale,
+ double zscale,
+ double x0,
+ double z0,
+ double x1,
+ double z1,
+ double y,
+ float width = 1.0f
+ );
+
+ static void drawXZPlane( double xscale,
+ double yscale,
+ double zscale,
+ const MPoint& v0,
+ const MPoint& v1,
+ float width = 1.0f
+ );
+ static void drawP( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawStickMan( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawCar( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawA( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawD( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawE( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawS( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawCross( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawLBolt( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawI( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawW( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawM( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawC( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+
+ static void drawO( double scale,
+ double tx = 0,
+ double ty = 0,
+ double tz = 0,
+ float width = 1.0f );
+};
+
+#endif
diff --git a/tools/globalcode/utility/MExt.cpp b/tools/globalcode/utility/MExt.cpp
new file mode 100644
index 0000000..6523859
--- /dev/null
+++ b/tools/globalcode/utility/MExt.cpp
@@ -0,0 +1,2030 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MExt.cpp
+//
+// Description: Functions that extend the Maya API to perform other common
+// tasks.
+//
+// Modification History:
+// + Created Aug 21, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+#include "precompiled/PCH.h"
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+//#include <windows.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+
+/* Using precompiled headers
+#include <maya/M3dView.h>
+#include <maya/MArgList.h>
+#include <maya/MDagPath.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MDGModifier.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MGlobal.h>
+#include <maya/MFnDagNode.h>
+#include <maya/MFnData.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnMatrixData.h>
+#include <maya/MFnTransform.h>
+#include <maya/MFnTypedAttribute.h>
+#include <maya/MItDag.h>
+#include <maya/MItSelectionList.h>
+#include <maya/MMatrix.h>
+#include <maya/MObject.h>
+#include <maya/MPlug.h>
+#include <maya/MPlugArray.h>
+#include <maya/MPoint.h>
+#include <maya/MSelectionList.h>
+#include <maya/MStatus.h>
+#include <maya/MString.h>
+#include <maya/MTransformationMatrix.h>
+#include <maya/MTypeId.h>
+#include <maya/MVector.h>
+*/
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "MExt.h"
+#include "util.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+static const double EPSILON = 0.00001;
+static const int SCRATCHPAD_SIZE = 256;
+static char scratchpad[ SCRATCHPAD_SIZE + 1 ];
+
+
+//-----------------------------------------------------------------------------
+// G e t S c a l e d
+//
+// Synopsis: Retrieves an attribute that is first scaled by the scale in
+// the node's parenting transform.
+//
+// Parameters: vertex - reference parameter to receive scaled attribute.
+// node - the node the attribute is on.
+// attr - the attribute to retrieve.
+//
+// Returns: The status of the request, hopefully MS::kSuccess.
+//
+// Constraints: This method only applies the scale that is stored in the
+// immediate parent of the node. Prior parenting tranforms have
+// no effect.
+//-----------------------------------------------------------------------------
+void MExt::Attr::GetScaled( MPoint* vertex,
+ const MObject& node,
+ const MObject& attr
+ )
+{
+ MStatus status;
+
+ //
+ // Get the nodes parenting transform.
+ //
+ MFnDagNode fnNode( node, &status );
+ assert( status );
+
+ MObject transform = fnNode.parent( 0, &status );
+ assert( status );
+
+ MFnTransform fnTransform( transform, &status );
+ assert( status );
+
+ //
+ // Get the scale in the parenting transform.
+ //
+ double scale[3];
+ status = fnTransform.getScale( scale );
+ assert( status );
+
+ //
+ // Get the attribute.
+ //
+ Get( vertex, node, attr );
+
+ //
+ // Scale the attribute.
+ //
+ vertex->x *= scale[0];
+ vertex->y *= scale[1];
+ vertex->z *= scale[2];
+}
+
+//-----------------------------------------------------------------------------
+// S e t S c a l e d
+//
+// Synopsis: Sets the attribute after taking into account the scale set in
+// the immediate parenting transform. If the attribute initially
+// has a value of (10,10,10) and a scaling vector of
+// (0.5, 2.0, 0.5) is in the parenting transform. The attribute
+// will be stored as (20,5,20) so that it will reflect the
+// original value when the attribute is retrieved through the
+// transform at a later time.
+//
+// Parameters: vertex - the vertex values to set the attribute to.
+// node - the node to set the attribute on.
+// attr - the attribute to set.
+//
+// Returns: NOTHING
+//
+// Constraints: Only the scaling in the immediate parenting transform is taken
+// into account.
+//
+//-----------------------------------------------------------------------------
+void MExt::Attr::SetScaled( const MPoint& vertex,
+ MObject& node,
+ MObject& attr
+ )
+{
+ MStatus status;
+
+ //
+ // Get the nodes parenting transform.
+ //
+ MFnDagNode fnNode( node, &status );
+ assert( status );
+
+ MObject transform = fnNode.parent( 0, &status );
+ assert( status );
+
+ MFnTransform fnTransform( transform, &status );
+ assert( status );
+
+ //
+ // Get the scale in the parenting transform.
+ //
+ double scale[3];
+ status = fnTransform.getScale( scale );
+ assert( status );
+
+ //
+ // Create the "unscaled" vertex.
+ //
+ MPoint scaledVertex = vertex;
+ scaledVertex.x = scaledVertex.x / scale[0];
+ scaledVertex.y = scaledVertex.y / scale[1];
+ scaledVertex.z = scaledVertex.z / scale[2];
+
+ Set( scaledVertex, node, attr );
+}
+
+//-----------------------------------------------------------------------------
+// S e t S c a l e d
+//
+// Synopsis: Sets the attribute after taking into account the scale set in
+// the immediate parenting transform. If the attribute initially
+// has a value of (10,10,10) and a scaling vector of
+// (0.5, 2.0, 0.5) is in the parenting transform. The attribute
+// will be stored as (20,5,20) so that it will reflect the
+// original value when the attribute is retrieved through the
+// transform at a later time.
+//
+// Parameters: vertex - the vertex values to set the attribute to.
+// node - the node to set the attribute on.
+// attr - the name of the attribute.
+//
+// Returns: NOTHING
+//
+// Constraints: Only the scaling in the immediate parenting transform is taken
+// into account.
+//
+//-----------------------------------------------------------------------------
+void MExt::Attr::SetScaled( const MPoint& vertex,
+ MObject& node,
+ const MString& attr
+ )
+{
+ MStatus status;
+
+ //
+ // Get the attribute object that corresponds to the named attribute.
+ //
+ MFnDagNode fnNode( node, &status );
+ assert( status );
+
+ MPlug plug = fnNode.findPlug( attr, &status );
+ assert( status );
+
+ SetScaled( vertex, node, plug.attribute() );
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n P a r s e r : : O p t i o n P a r s e r
+//
+// Synopsis: Constructor
+//
+// Parameters: args - the MArgList passed into functions like doIt();
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MExt::OptionParser::OptionParser( const char* command, const MArgList& args ) :
+ m_argc( 0 ),
+ m_argv( 0 ),
+ m_opt( 0 )
+{
+ assert( command );
+
+ typedef char* charPointer;
+
+ //
+ // Create our simultated argument environment. We add one to m_argc because
+ // we are inserting the command name as well.
+ //
+ m_argc = args.length() + 1;
+ m_argv = new charPointer[ m_argc ];
+ assert( m_argv );
+
+ //
+ // Copy in the command name.
+ //
+ m_argv[0] = new char[ strlen( command ) + 1 ];
+ assert( m_argv[0] );
+ strcpy( m_argv[0], command );
+
+ //
+ // Copy in the arguments from argList.
+ //
+ int i;
+ for ( i = 1; i < m_argc; i++ )
+ {
+ MString arg;
+ args.get( i - 1, arg );
+ m_argv[i] = new char[ strlen( arg.asChar() ) + 1 ];
+ assert( m_argv[i] );
+ strcpy( m_argv[i], arg.asChar() );
+ }
+
+ //
+ // Initialize the parser.
+ //
+ util_getopt_init();
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n P a r s e r : : ~ O p t i o n P a r s e r
+//
+// Synopsis: Destructor
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MExt::OptionParser::~OptionParser()
+{
+ if ( m_argv )
+ {
+ int i;
+ for ( i = 0; i < m_argc; i++ )
+ {
+ if ( m_argv[i] )
+ {
+ delete m_argv[i];
+ }
+ }
+
+ delete m_argv;
+ }
+
+ m_argc = 0;
+
+ if ( m_opt )
+ {
+ delete m_opt;
+ m_opt = 0;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n P a r s e r : : s e t O p t i o n s
+//
+// Synopsis: Specify the options that will be parsed.
+//
+// Parameters: optionSpec - the specification string. eg. "hgu:t:" would
+// specify two boolean flags, "h" and "g" ( they
+// do not take arguments ), and two argument flags,
+// "u" and "t", that take arguments. Flags that
+// take arguments must be followed by a ":".
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::OptionParser::setOptions( const char* optionSpec )
+{
+ int len = strlen( optionSpec ) + 1;
+ m_opt = new char[ len + 1 ];
+ assert( m_opt );
+
+ strncpy( m_opt, optionSpec, len );
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n P a r s e r : : n e x t O p t i o n
+//
+// Synopsis: Get the next option.
+//
+// Parameters: NONE
+//
+// Returns: The character flag for the next option or -1 if no more
+// options.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int MExt::OptionParser::nextOption()
+{
+ int result = util_getopt( m_argc, m_argv, m_opt );
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n P a r s e r : : g e t A r g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MString MExt::OptionParser::getArg()
+{
+ MString result( util_optarg );
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// O p t i o n V a r : : G e t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::OptionVar::Get( char* buffer, unsigned int buffer_size, const char* symbol )
+{
+ bool doesExist = false;
+
+ MString command = "optionVar -exists ";
+ command += symbol;
+
+ int exists;
+ MGlobal::executeCommand( command, exists );
+
+ if ( exists )
+ {
+ command = "optionVar -query ";
+ command += symbol;
+
+ MString result;
+ MGlobal::executeCommand( command, result );
+
+ assert( result.length() < buffer_size );
+ strncpy( buffer, result.asChar(), buffer_size );
+
+ doesExist = true;
+ }
+
+ return doesExist;
+}
+
+
+//-----------------------------------------------------------------------------
+// O p t i o n V a r : : S e t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::OptionVar::Set( const char* buffer, const char* symbol )
+{
+ MString command;
+ command = "optionVar -stringValue ";
+ command += symbol;
+ command += " \"";
+ command += buffer;
+ command += "\"";
+
+ MGlobal::executeCommand( command );
+}
+
+//-----------------------------------------------------------------------------
+// A d d C h i l d
+//
+// Synopsis: Make a locator node the child of another by parenting the transforms.
+//
+// Parameters: parentLocatorNode - locator node to be the parent
+// childLocatorNode - locator node to be the child
+//
+// Returns: NOTHING
+//
+// Constraints: Must both have transforms.
+//
+//-----------------------------------------------------------------------------
+void MExt::AddChild( MObject& parentLocatorNode, MObject& childLocatorNode )
+{
+// assert( parentLocatorNode.apiType() == MFn::kLocator );
+// assert( childLocatorNode.apiType() == MFn::kLocator );
+
+ //Get the transform of the parent node
+ MFnDagNode fnDag( parentLocatorNode );
+ MObject parentTransform = fnDag.parent( 0 );
+
+ //Get teh transform of the child node.
+ fnDag.setObject( childLocatorNode );
+ MObject childTransform = fnDag.parent( 0 );
+
+ //Parent the fence to the wall
+ fnDag.setObject( parentTransform );
+ fnDag.addChild( childTransform );
+}
+
+//-----------------------------------------------------------------------------
+// C o n n e c t
+//
+// Synopsis: Connect two nodes via the specified attributes.
+//
+// Parameters: node - the source node.
+// attr - the source attribute.
+// otherNode - the destination node.
+// otherAttr - the destination attribute.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::Connect( MObject& node,
+ MObject& attr,
+ MObject& otherNode,
+ MObject& otherAttr
+ )
+{
+ MStatus status;
+
+ MDGModifier modifier;
+ status = modifier.connect( node, attr, otherNode, otherAttr );
+ assert( status );
+
+ status = modifier.doIt();
+ if ( !status ) MGlobal::displayError( status.errorString() );
+ assert( status );
+}
+
+void MExt::Connect( MObject& node,
+ const char* attr,
+ MObject& otherNode,
+ const char* otherAttr
+ )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode;
+
+ fnNode.setObject( node );
+ MPlug nodePlug = fnNode.findPlug( MString( attr ), &status );
+ assert( status );
+
+
+ fnNode.setObject( otherNode );
+ MPlug otherNodePlug = fnNode.findPlug( MString( otherAttr ), &status );
+ assert( status );
+
+ MDGModifier modifier;
+ status = modifier.connect( node, nodePlug.attribute(), otherNode, otherNodePlug.attribute() );
+ assert( status );
+
+ status = modifier.doIt();
+ if ( !status ) MGlobal::displayError( status.errorString() );
+ assert( status );
+}
+
+//-----------------------------------------------------------------------------
+// C r e a t e N o d e
+//
+// Synopsis:
+//
+// Parameters: node - reference parameter to receive node MObject.
+// transform - reference parameter to receive the parenting
+// transform.
+// type - the type of node to create.
+// name - the name to assign to the node. If NULL default
+// name is used.
+// group - MObject representing the group under which to
+// attach the new node. If NULL then the new node
+// is attached at the DAG root.
+//
+// Returns: the status of the request -- hopefully MS::kSuccess.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::CreateNode( MObject* node,
+ MObject* transform,
+ const MString& type,
+ const MString* name,
+ const MObject& group
+ )
+{
+ MStatus status;
+
+ //
+ // Determine names for the nodes. This must be done before the
+ // nodes are created so as to avoid conflicting with the default
+ // names that Maya will assign them prior to us renaming them.
+ //
+ MString nodeName = type;
+ if ( name ) nodeName = *name;
+ MString transformName = ( "TForm" + nodeName );
+
+ MakeNameUnique( &nodeName, nodeName, group );
+ MakeNameUnique( &transformName, transformName, group );
+
+ //
+ // Create the transform.
+ //
+ MFnTransform fnTransform;
+ fnTransform.create( MObject::kNullObj, &status );
+ assert( status );
+
+ //
+ // Create the node under the transform.
+ //
+ MFnDagNode fnNode;
+ fnNode.create( type, fnTransform.object(), &status );
+ assert( status );
+
+ if ( group != MObject::kNullObj )
+ {
+ //
+ // Place the new node under the group node.
+ //
+ MFnTransform fnGroup( group, &status );
+ assert( status );
+
+ status = fnGroup.addChild( fnTransform.object() );
+ assert( status );
+ }
+
+ //
+ // Name the nodes.
+ //
+ fnTransform.setName( transformName, &status );
+ assert( status );
+
+ fnNode.setName( nodeName, &status );
+ assert( status );
+
+ //
+ // Return the node and transform objects in the reference parameters.
+ //
+ if ( transform )
+ {
+ *transform = fnTransform.object();
+ }
+
+ if ( node )
+ {
+ *node = fnNode.object();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// C r e a t e N o d e
+//
+// Synopsis:
+//
+// Parameters: node - reference parameter to receive node MObject.
+// transform - reference parameter to receive the parenting
+// transform.
+// type - the type of node to create.
+// name - the name to assign to the node. If NULL default
+// name is used.
+// group - MObject representing the group under which to
+// attach the new node. If NULL then the new node
+// is attached at the DAG root.
+//
+// Returns: the status of the request -- hopefully MS::kSuccess.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::CreateNode( MObject& node,
+ MObject& transform,
+ const MString& type,
+ const MString* name,
+ const MObject& group
+ )
+{
+ MStatus status;
+
+ //
+ // Determine names for the nodes. This must be done before the
+ // nodes are created so as to avoid conflicting with the default
+ // names that Maya will assign them prior to us renaming them.
+ //
+ MString nodeName = type;
+ if ( name ) nodeName = *name;
+ MString transformName = ( "TForm" + nodeName );
+
+ MakeNameUnique( &nodeName, nodeName, group );
+ MakeNameUnique( &transformName, transformName, group );
+
+ //
+ // Create the transform.
+ //
+ MFnTransform fnTransform;
+ fnTransform.create( MObject::kNullObj, &status );
+ assert( status );
+
+ //
+ // Create the node under the transform.
+ //
+ MFnDagNode fnNode;
+ fnNode.create( type, fnTransform.object(), &status );
+ assert( status );
+
+ if ( group != MObject::kNullObj )
+ {
+ //
+ // Place the new node under the group node.
+ //
+ MFnTransform fnGroup( group, &status );
+ assert( status );
+
+ status = fnGroup.addChild( fnTransform.object() );
+ assert( status );
+ }
+
+ //
+ // Name the nodes.
+ //
+ fnTransform.setName( transformName, &status );
+ assert( status );
+
+ fnNode.setName( nodeName, &status );
+ assert( status );
+
+ //
+ // Return the node and transform objects in the reference parameters.
+ //
+ transform = fnTransform.object();
+ node = fnNode.object();
+}
+
+//-----------------------------------------------------------------------------
+// C r e a t e V e r t e x A t t r i b u t e
+//
+// Synopsis: Intended for use within the initialize() method for a node
+// class. Creates a vertex attribute using a double array.
+//
+// Parameters: name - the name of the attribute.
+// breif_name - the brief name of the attribute.
+//
+// Returns: the attribute object.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::CreateVertexAttribute( MObject* attr,
+ const char* name,
+ const char* briefName
+ )
+{
+ MStatus status;
+
+ MDoubleArray doubleArray;
+ MFnDoubleArrayData doubleArrayData;
+ MObject defaultVertex = doubleArrayData.create( doubleArray, &status );
+ assert( status );
+
+ MFnTypedAttribute fnAttribute;
+ *attr = fnAttribute.create( name,
+ briefName,
+ MFnData::kDoubleArray,
+ defaultVertex,
+ &status
+ );
+ assert( status );
+}
+
+//=============================================================================
+// MExt::DeleteNode
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& node, bool deleteParent )
+//
+// Return: void
+//
+//=============================================================================
+void MExt::DeleteNode( MObject& node, bool deleteParent )
+{
+ //Get the parent and delete it too if it's a transform and the bool says so.
+
+ MStatus status;
+ MObject parent;
+
+ if ( deleteParent )
+ {
+ //Get the parent please.
+ MFnDagNode fnDag( node );
+ parent = fnDag.parent( 0, &status );
+ assert( status );
+ }
+
+ //Delete this node
+ MGlobal::deleteNode( node );
+
+ if ( deleteParent )
+ {
+ //Delete the parent.
+ MGlobal::deleteNode( parent );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// D i s c o n n e c t A l l
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::DisconnectAll( MObject& node, MObject& attr )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode( node, &status );
+ assert( status );
+
+ //
+ // Get the plug for the attribute to be disconnected.
+ //
+ MPlug plug = fnNode.findPlug( attr, &status );
+ assert( status );
+
+ //
+ // Find all connections and disconnect them.
+ //
+ MDGModifier modifier;
+ MPlugArray sources;
+ MPlugArray targets;
+ MExt::ResolveConnections( &sources, &targets, plug, true, true );
+
+ unsigned int count = sources.length();
+ unsigned int i;
+
+ for ( i = 0; i < count; i++ )
+ {
+ status = modifier.disconnect( sources[i], targets[i] );
+ assert( status );
+ }
+
+ status = modifier.doIt();
+ assert( status );
+}
+
+void MExt::DisconnectAll( MObject& node, const char* attrName )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode( node, &status );
+ assert( status );
+
+ //
+ // Get the plug for the attribute to be disconnected.
+ //
+ MPlug plug = fnNode.findPlug( MString( attrName ), &status );
+ assert( status );
+
+ //
+ // Find all connections and disconnect them.
+ //
+ MDGModifier modifier;
+ MPlugArray sources;
+ MPlugArray targets;
+ MExt::ResolveConnections( &sources, &targets, plug, true, true );
+
+ unsigned int count = sources.length();
+ unsigned int i;
+
+ for ( i = 0; i < count; i++ )
+ {
+ status = modifier.disconnect( sources[i], targets[i] );
+ assert( status );
+ }
+
+ status = modifier.doIt();
+ assert( status );
+}
+
+//-----------------------------------------------------------------------------
+// D i s p l a y E r r o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int MExt::DisplayError( const char* fmt, ... )
+{
+ va_list argp;
+ va_start( argp, fmt );
+ int size = _vsnprintf( scratchpad, SCRATCHPAD_SIZE, fmt, argp );
+ MGlobal::displayError( scratchpad );
+ return size;
+}
+
+//-----------------------------------------------------------------------------
+// D i s p l a y W a r n i n g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int MExt::DisplayWarning( const char* fmt, ... )
+{
+ va_list argp;
+ va_start( argp, fmt );
+ int size = _vsnprintf( scratchpad, SCRATCHPAD_SIZE, fmt, argp );
+ MGlobal::displayWarning( scratchpad );
+ return size;
+}
+
+//-----------------------------------------------------------------------------
+// D i s p l a y I n f o
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int MExt::DisplayInfo( const char* fmt, ... )
+{
+ va_list argp;
+ va_start( argp, fmt );
+ int size = _vsnprintf( scratchpad, SCRATCHPAD_SIZE, fmt, argp );
+ MGlobal::displayInfo( scratchpad );
+ return size;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// F i l t e r S e l e c t i o n L i s t
+//
+// Synopsis: Filters the given source list for nodes of "typeName" and
+// places them in the filtered list. If transforms are in the
+// source list all their children are filtered as well.
+//
+// Parameters: filteredList - reference paremeter to receive the filtered
+// list.
+// typeName - the type name to check for.
+// sourceList - the list to filter.
+//
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::FilterSelectionList( MSelectionList* filteredList,
+ const MString& typeName,
+ const MSelectionList& sourceList
+ )
+{
+ assert( filteredList );
+
+ MItSelectionList it_source( sourceList );
+ while( ! it_source.isDone() )
+ {
+ MObject node;
+ it_source.getDependNode( node );
+
+ MFnDependencyNode fnNode;
+ fnNode.setObject( node );
+
+ if ( fnNode.typeName() == typeName )
+ {
+ filteredList->add( fnNode.object() );
+ }
+ else if ( strcmp( "transform" , fnNode.typeName().asChar() ) == 0 )
+ {
+ SelectNodesBelowRoot( filteredList, typeName, fnNode.object() );
+ }
+
+ it_source.next();
+ }
+}
+
+//=============================================================================
+// MExt::FindAllSkeletonRoots
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObjectArray* objects )
+//
+// Return: bool
+//
+//=============================================================================
+bool MExt::FindAllSkeletonRoots( MObjectArray* objects )
+{
+ MStatus status;
+ bool returnVal = false;
+
+ MItDag dagIt( MItDag::kDepthFirst, MFn::kTransform, &status );
+ assert( status );
+
+ while( !dagIt.isDone() )
+ {
+ MFnTransform fnTransform( dagIt.item() );
+
+ MPlug p3dBoolPlug = fnTransform.findPlug( MString("p3dBooleanAttributes"), &status );
+ if ( status )
+ {
+ //This has p3d info.
+ int value = 0;
+ p3dBoolPlug.getValue( value );
+
+ if ( value & 0x0002 ) //This is the skelton root bit... HACK
+ {
+ objects->append( fnTransform.object() );
+ returnVal = true;
+ }
+ }
+
+ dagIt.next();
+ }
+
+ return returnVal;
+}
+
+//=============================================================================
+// MExt::FindAllTransforms
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObjectArray* transforms, const MObject& root )
+//
+// Return: bool
+//
+//=============================================================================
+bool MExt::FindAllTransforms( MObjectArray* transforms, const MObject& root )
+{
+ bool returnVal = false;
+
+ MItDag dagIt( MItDag::kDepthFirst, MFn::kTransform );
+ MDagPath path;
+ MDagPath::getAPathTo( root, path );
+
+ dagIt.reset( path, MItDag::kDepthFirst, MFn::kTransform );
+
+ while ( !dagIt.isDone() )
+ {
+ transforms->append( dagIt.item() );
+ returnVal = true;
+
+ dagIt.next();
+ }
+
+ return returnVal;
+}
+
+//-----------------------------------------------------------------------------
+// F i n d D a g N o d e B y N a m e
+//
+// Synopsis: Find a node in the DAG using its name as the search key.
+//
+// Parameters: path - reference object to receive the path of the found
+// node.
+// name - the name to search for.
+// root - only search under this node.
+//
+// Returns: true if found, false otherwise.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::FindDagNodeByName( MDagPath* path,
+ const MString& name,
+ const MObject& root
+ )
+{
+ MStatus status;
+
+ MItDag it_dag;
+ if ( root != MObject::kNullObj )
+ {
+ status = it_dag.reset( root );
+ if ( MS::kSuccess != status ) return false;
+ }
+
+ bool found = false;
+ while ( !found && !it_dag.isDone() )
+ {
+ MFnDependencyNode node( it_dag.item(), &status );
+ assert( status );
+ if ( name == node.name() )
+ {
+ found = true;
+ if ( path )
+ {
+ it_dag.getPath( *path );
+ }
+ }
+ it_dag.next();
+ }
+
+ return found;
+}
+
+//-----------------------------------------------------------------------------
+// F i n d D a g N o d e B y N a m e
+//
+// Synopsis: Find a node in the DAG using its name as the search key.
+//
+// Parameters: path - reference object to receive the path of the found
+// node.
+// name - the name to search for.
+// root - only search under the node named root.
+//
+// Returns: true if found, false otherwise.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::FindDagNodeByName( MDagPath* path,
+ const MString& name,
+ const MString& root
+ )
+{
+ MDagPath myPath;
+ bool found = FindDagNodeByName( &myPath, root );
+ if ( found )
+ {
+ found = FindDagNodeByName( path, name, myPath.node() );
+ }
+
+ return found;
+}
+
+//-----------------------------------------------------------------------------
+// G e t W o r l d P o s i t i o n
+//
+// Synopsis: Retrieves the world position of the given node.
+//
+// Parameters: wp - reference parameter to receive the world positioin.
+// node - the node object to retrieve the world position of.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::GetWorldPosition( MPoint* wp, const MObject& node )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode( node );
+
+ //
+ // Attempt to get the world matrix attribute.
+ //
+ MObject attrObject = fnNode.attribute( "worldMatrix", &status );
+ assert( status );
+
+ //
+ // Build the world matrix plug. Use the first element on the plug.
+ //
+ MPlug plug( const_cast<MObject&>(node), attrObject );
+ plug = plug.elementByLogicalIndex( 0, &status );
+ assert( status );
+
+ //
+ // Get the world matrix. We have to go through a few Maya layers on this
+ // one.
+ //
+ MObject matrixObject;
+ status = plug.getValue( matrixObject );
+ assert( status );
+
+ MFnMatrixData matrixData( matrixObject, &status );
+ assert( status );
+
+ MMatrix matrix = matrixData.matrix( &status );
+ assert( status );
+
+ //
+ // The translation vector of the matrix is our position.
+ //
+ wp->x = matrix( 3, 0 );
+ wp->y = matrix( 3, 1 );
+ wp->z = matrix( 3, 2 );
+}
+
+
+//-----------------------------------------------------------------------------
+// G e t W o r l d P o s i t i o n B e t w e e n
+//
+// Synopsis: Retrieves the world position of a point between the the given nodes.
+//
+// Parameters: node1 - The first node
+// node1 - The second node
+// betweenPoint - receives the point between the two nodes
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPoint MExt::GetWorldPositionBetween( MObject& node1, MObject& node2 )
+{
+ MVector newWPVect;
+ MPoint node1WP;
+ MPoint node2WP;
+
+ MExt::GetWorldPosition( &node1WP, node1 );
+ MExt::GetWorldPosition( &node2WP, node2 );
+
+ newWPVect = node2WP - node1WP;
+ newWPVect /= 2.0f;
+ newWPVect += node1WP;
+
+ MPoint newPoint( newWPVect );
+ return newPoint;
+}
+
+//=============================================================================
+// MExt::GetWorldMatrix
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& node )
+//
+// Return: MMatrix
+//
+//=============================================================================
+MMatrix MExt::GetWorldMatrix( MObject& node )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode( node );
+
+ //
+ // Attempt to get the world matrix attribute.
+ //
+ MObject attrObject = fnNode.attribute( "worldMatrix", &status );
+ assert( status );
+
+ //
+ // Build the world matrix plug. Use the first element on the plug.
+ //
+ MPlug plug( const_cast<MObject&>(node), attrObject );
+ plug = plug.elementByLogicalIndex( 0, &status );
+ assert( status );
+
+ //
+ // Get the world matrix. We have to go through a few Maya layers on this
+ // one.
+ //
+ MObject matrixObject;
+ status = plug.getValue( matrixObject );
+ assert( status );
+
+ MFnMatrixData matrixData( matrixObject, &status );
+ assert( status );
+
+ MMatrix matrix = matrixData.matrix( &status );
+ assert( status );
+
+ return matrix;
+}
+
+//-----------------------------------------------------------------------------
+// MExt : : I s C o n n e c t e d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::IsConnected( MObject& node, const char* attr )
+{
+ MStatus status;
+ MFnDependencyNode fnNode;
+
+
+ fnNode.setObject( node );
+
+ MPlug plug = fnNode.findPlug( MString( attr ), &status );
+ assert( status );
+
+ return plug.isConnected();
+}
+
+bool MExt::IsConnected( MObject& node, MObject& attr )
+{
+ MStatus status;
+ MFnDependencyNode fnNode;
+
+
+ fnNode.setObject( node );
+
+ MPlug plug = fnNode.findPlug( attr, &status );
+ assert( status );
+
+ return plug.isConnected();
+}
+
+bool MExt::IsConnected( MPlug& plug1, MPlug& plug2 )
+{
+ MPlugArray plugArray;
+
+ plug1.connectedTo( plugArray, true, true );
+
+ unsigned int i;
+ for ( i = 0; i < plugArray.length(); ++i )
+ {
+ if ( plugArray[i] == plug2 )
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// M a k e N a m e U n i q u e
+//
+// Synopsis: Append numerical suffixes to a name to make it unique under
+// a specified root node.
+//
+// Parameters: unique - a reference parameter to receive the new unique name.
+// name - the original name.
+// root - the node under which the name must be unique.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::MakeNameUnique( MString* unique,
+ const MString& name,
+ const MObject& root
+ )
+{
+ const int bufferSize = 256;
+
+ MString myName = name;
+ assert( myName.length() < bufferSize );
+
+ if ( FindDagNodeByName( 0, myName, root ) )
+ {
+ char buffer[ bufferSize ];
+ strncpy( buffer, myName.asChar(), bufferSize );
+
+ //
+ // Isolate the base name by removing any numerical suffixes.
+ //
+ char* suffix = const_cast<char*>(util_reverseSpan( buffer, "0123456789" ));
+ if ( suffix )
+ {
+ *suffix = '\0';
+ }
+
+ myName = buffer;
+ int isuffix = 0;
+ while( FindDagNodeByName( 0, myName, root ) )
+ {
+ isuffix++;
+ myName = buffer;
+ myName += isuffix;
+ }
+
+ }
+
+ *unique = myName;
+}
+
+//-----------------------------------------------------------------------------
+// M a k e N a m e U n i q u e
+//
+// Synopsis: Append numerical suffixes to a name to make it unique under
+// a specified root node.
+//
+// Parameters: unique - a reference parameter to receive the new unique name.
+// name - the original name.
+// root - name of the node under which the name must be unique.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::MakeNameUnique( MString* unique,
+ const MString& name,
+ const MString& root
+ )
+{
+ MObject rootObject = MObject::kNullObj;
+ MDagPath path;
+ if ( FindDagNodeByName( &path, root ) )
+ {
+ rootObject = path.node();
+ }
+
+ MakeNameUnique( unique, name, rootObject );
+}
+
+//=============================================================================
+// MExt::MeshClickIntersect
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( short xClick, short yClick, MPoint& intersect, bool closest = true )
+//
+// Return: bool
+//
+//=============================================================================
+bool MExt::MeshClickIntersect( short xClick,
+ short yClick,
+ MPoint& intersect,
+ bool closest )
+{
+ //Get the mesh below the clicked point and find it's y height.
+ short xStart, xEnd, yStart, yEnd;
+
+ xStart = 0;
+ xEnd = M3dView::active3dView().portWidth();
+ yStart = M3dView::active3dView().portHeight();
+ yEnd = 0;
+
+ MGlobal::selectFromScreen( xStart,
+ yStart,
+ xEnd,
+ yEnd,
+ MGlobal::kReplaceList );
+
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.length() > 0 )
+ {
+ //Go through each selected object and see if the ray intersects it.
+ MItSelectionList selectIt( selectionList, MFn::kMesh );
+
+ MPoint nearClick, farClick;
+ M3dView activeView = M3dView::active3dView();
+ activeView.viewToWorld( xClick, yClick, nearClick, farClick );
+ MVector rayDir( MVector( farClick ) - MVector( nearClick ) );
+ MPointArray intersectPoints;
+ MDagPath objDag;
+
+ bool found = false;
+
+ MPoint resultPoint;
+
+ if ( closest )
+ {
+ resultPoint.x = 100000.0;
+ resultPoint.y = 100000.0;
+ resultPoint.z = 100000.0;
+ }
+ else
+ {
+ resultPoint.x = 0;
+ resultPoint.y = 0;
+ resultPoint.z = 0;
+ }
+
+ while ( !selectIt.isDone() )
+ {
+ selectIt.getDagPath( objDag );
+
+ MFnMesh mesh( objDag );
+
+ mesh.intersect( nearClick, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ unsigned int i;
+ for ( i = 0; i < intersectPoints.length(); ++i )
+ {
+ //test each point...
+ if ( closest )
+ {
+ if ( intersectPoints[i].distanceTo(nearClick) < (resultPoint.distanceTo(nearClick) ) )
+ {
+ resultPoint = intersectPoints[i];
+ found = true;
+ }
+ }
+ else
+ {
+ if ( intersectPoints[i].distanceTo(nearClick) > (resultPoint.distanceTo(nearClick) ) )
+ {
+ resultPoint = intersectPoints[i];
+ found = true;
+ }
+ }
+ }
+
+ selectIt.next();
+ }
+
+ if ( found )
+ {
+ intersect = resultPoint;
+ MGlobal::clearSelectionList();
+ return true;
+ }
+ }
+
+ MGlobal::clearSelectionList();
+ return false;
+}
+
+//=============================================================================
+// MExt::MeshIntersectAlongVector
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MPoint from, MPoint direction, MPoint& intersect, bool closest = true )
+//
+// Return: bool
+//
+//=============================================================================
+bool MExt::MeshIntersectAlongVector( MPoint from,
+ MPoint direction,
+ MPoint& intersect,
+ bool closest )
+{
+ MSelectionList selectionList;
+ selectionList.clear();
+
+ MItDag itDag(MItDag::kDepthFirst, MFn::kMesh );
+
+ while ( !itDag.isDone() )
+ {
+ MDagPath dagPath;
+ itDag.getPath( dagPath );
+
+ selectionList.add( dagPath );
+
+ itDag.next();
+ }
+
+ if ( selectionList.length() > 0 )
+ {
+ //Go through each selected object and see if the ray intersects it.
+ MItSelectionList selectIt( selectionList, MFn::kMesh );
+
+ MPointArray intersectPoints;
+ MDagPath objDag;
+
+ bool found = false;
+
+ MPoint resultPoint;
+
+ if ( closest )
+ {
+ resultPoint.x = 100000.0;
+ resultPoint.y = 100000.0;
+ resultPoint.z = 100000.0;
+ }
+ else
+ {
+ resultPoint.x = 0;
+ resultPoint.y = 0;
+ resultPoint.z = 0;
+ }
+
+ while ( !selectIt.isDone() )
+ {
+ selectIt.getDagPath( objDag );
+
+ MStatus status;
+
+ MFnMesh mesh( objDag, &status );
+ assert( status );
+
+
+ const char* name = mesh.name().asChar();
+
+ mesh.intersect( from, direction, intersectPoints, 0.001f, MSpace::kWorld );
+
+ unsigned int i;
+ for ( i = 0; i < intersectPoints.length(); ++i )
+ {
+ //test each point...
+ if ( closest )
+ {
+ if ( intersectPoints[i].distanceTo(from) < (resultPoint.distanceTo(from) ) )
+ {
+ resultPoint = intersectPoints[i];
+ found = true;
+ }
+ }
+ else
+ {
+ if ( intersectPoints[i].distanceTo(from) > (resultPoint.distanceTo(from) ) )
+ {
+ resultPoint = intersectPoints[i];
+ found = true;
+ }
+ }
+ }
+
+ selectIt.next();
+ }
+
+ if ( found )
+ {
+ intersect = resultPoint;
+ MGlobal::clearSelectionList();
+ return true;
+ }
+ }
+
+ MGlobal::clearSelectionList();
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// P l u g H a s C o n n e c t i o n
+//
+// Synopsis: Determines if there are any connections on the specified plug.
+//
+// Parameters: connectedNode - reference parameter to receive the associated
+// node for the first connection found.
+// plug - the plug to get the connections for.
+// asSrc - if true, retrieve connections where "plug" is
+// the source of the connection.
+// asDst - if true, retrieve connections where "plug" is
+// the target of the connection.
+//
+// Returns: true, if the plug has connections; false, otherwise
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::PlugHasConnection( MObject* connectedNode,
+ MPlug& plug,
+ bool asDst,
+ bool asSrc,
+ const char* type
+ )
+{
+ bool isOk = false;
+
+ MPlug myPlug;
+ isOk = PlugHasConnection( &myPlug, plug, asDst, asSrc, type );
+
+ if ( isOk )
+ {
+ if ( connectedNode ) *connectedNode = myPlug.node();
+ }
+
+ return isOk;
+}
+
+//-----------------------------------------------------------------------------
+// P l u g H a s C o n n e c t i o n
+//
+// Synopsis: Determines if there are any connections on the specified plug.
+//
+// Parameters: connectedPlug - reference parameter to receive the plug of
+// the first connection found.
+// plug - the plug to get the connections for.
+// asSrc - if true, retrieve connections where "plug" is
+// the source of the connection.
+// asDst - if true, retrieve connections where "plug" is
+// the target of the connection.
+//
+// Returns: true, if the plug has connections; false, otherwise
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+bool MExt::PlugHasConnection( MPlug* connectedPlug,
+ MPlug& plug,
+ bool asDst,
+ bool asSrc,
+ const char* type
+ )
+{
+ MPlugArray buffer;
+
+ if ( asSrc )
+ {
+ MPlugArray destinations;
+ ResolveConnections( &buffer, &destinations, plug, false, true );
+
+ unsigned int i;
+ for( i = 0; i < destinations.length(); i++ )
+ {
+ bool isOk = true;
+ if ( type )
+ {
+ MFnDependencyNode fnNode( destinations[i].node() );
+ if ( fnNode.typeName() != type )
+ {
+ isOk = false;
+ }
+ }
+
+ if ( isOk )
+ {
+ if ( connectedPlug ) *connectedPlug = destinations[i];
+ return true;
+ }
+ }
+ }
+
+ if ( asDst )
+ {
+ MPlugArray sources;
+ ResolveConnections( &sources, &buffer, plug, true, false );
+
+ unsigned int i;
+ for( i = 0; i < sources.length(); i++ )
+ {
+ bool isOk = true;
+ if ( type )
+ {
+ MFnDependencyNode fnNode( sources[i].node() );
+ if ( fnNode.typeName() != type )
+ {
+ isOk = false;
+ }
+ }
+
+ if ( isOk )
+ {
+ if ( connectedPlug ) *connectedPlug = sources[i];
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// R e s o l v e C o n n e c t i o n s
+//
+// Synopsis: Retrieves the plugs that are connected to this plug. This
+// will work on plugs that are associated with array as well as
+// non-array attributes.
+//
+// Parameters: sources - reference parameter to recieve list of
+// connection sources.
+// targets - reference parameter to recieve list of
+// connection targets.
+// plug - the plug to get the connections for.
+// asSrc - if true, retrieve connections where "plug" is
+// the source of the connection.
+// asDst - if true, retrieve connections where "plug" is
+// the target of the connection.
+//
+// Returns: true, if the plug has connections; false, otherwise
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::ResolveConnections( MPlugArray* sources,
+ MPlugArray* targets,
+ MPlug& plug,
+ bool asDst,
+ bool asSrc
+ )
+{
+ assert( sources );
+ assert( targets );
+
+ MStatus status;
+ MPlugArray myPlugs;
+ unsigned int count = 0;
+ unsigned int i = 0;
+
+ if ( plug.isArray() )
+ {
+ count = plug.numElements( &status );
+ assert( status );
+
+ for ( i = 0; i < count; i++ )
+ {
+ MPlug element = plug.elementByPhysicalIndex( i, &status );
+ assert( status );
+
+ if ( element.isConnected() )
+ {
+
+ MString name = element.name();
+ const char* dbg_name = name.asChar();
+
+ myPlugs.append( element );
+ }
+ }
+ }
+ else
+ {
+ myPlugs.append( plug );
+ }
+
+ sources->clear();
+ targets->clear();
+ count = myPlugs.length();
+ for ( i = 0; i < count; i++ )
+ {
+ MPlugArray connectedPlugs;
+
+ if ( asDst )
+ {
+ myPlugs[i].connectedTo( connectedPlugs, true, false, &status );
+ assert( status );
+
+ if ( connectedPlugs.length() > 0 )
+ {
+ sources->append( connectedPlugs[0] );
+ targets->append( myPlugs[i] );
+ }
+ }
+
+ if ( asSrc )
+ {
+ myPlugs[i].connectedTo( connectedPlugs, false, true, &status );
+ assert( status );
+
+ if ( connectedPlugs.length() > 0 )
+ {
+ sources->append( myPlugs[i] );
+ targets->append( connectedPlugs[0] );
+ }
+ }
+ }
+
+ assert( sources->length() == targets->length() );
+}
+
+//-----------------------------------------------------------------------------
+// S e l e c t N o d e s B e l o w R o o t
+//
+// Synopsis: Select nodes meeting the specified criteria and place them
+// in the provided selection list.
+//
+// Parameters: list - the list to receive the nodes.
+// typeId - the typeId of the node type to select.
+// root - the root of the subsection of the DAG to search.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::SelectNodesBelowRoot( MSelectionList* list,
+ const MString& typeName,
+ const MObject& root,
+ MSelectionList* intersectionList
+ )
+{
+ assert( list );
+
+ MStatus status;
+
+ bool mergeWithExisting = true;
+
+ MItDag itor;
+
+ if ( root != MObject::kNullObj )
+ {
+ itor.reset( root );
+ }
+
+ while( ! itor.isDone() )
+ {
+ MFnDependencyNode fnNode;
+ fnNode.setObject( itor.item() );
+
+ if ( fnNode.typeName() == typeName )
+ {
+ bool doAdd = true;
+
+ if ( intersectionList )
+ {
+ MDagPath path;
+ status = MDagPath::getAPathTo( fnNode.object(), path );
+
+ //
+ // We only add the item if it is in the intersectionList.
+ //
+ if ( ! intersectionList->hasItem( path ) )
+ {
+ doAdd = false;
+ }
+ }
+
+ if ( doAdd )
+ {
+ list->add( fnNode.object(), mergeWithExisting );
+ }
+ }
+
+ itor.next();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// S e t W o r l d P o s i t i o n
+//
+// Synopsis: Sets the world position of the given node.
+//
+// Parameters: wp - the new world position.
+// node - the node for which to set the position.
+//
+// Returns: Hopefully MS::kSuccess, but other MS::????? errors will occur
+// if the object is not a suitable type of node.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::SetWorldPosition( const MPoint& wp, const MObject& node )
+{
+ MStatus status;
+
+ MFnDependencyNode fnNode( node );
+
+ //
+ // Attempt to get the world matrix attribute.
+ //
+ MObject attrObject = fnNode.attribute( "worldMatrix", &status );
+ assert( status );
+
+ //
+ // Build the world matrix plug. Use the first element on the plug.
+ //
+ MPlug plug( const_cast<MObject&>(node), attrObject );
+ plug = plug.elementByLogicalIndex( 0, &status );
+ assert( status );
+
+ //
+ // Get the world matrix. We have to go through a few Maya layers on this
+ // one.
+ //
+ MObject matrixObject;
+ status = plug.getValue( matrixObject );
+ assert( status );
+
+ MFnMatrixData matrixData( matrixObject, &status );
+ assert( status );
+
+ //
+ // Create a world tranformation matrix.
+ //
+ MTransformationMatrix matrix( matrixData.matrix( &status ) );
+ assert( status );
+
+ //
+ // Get the world translation vector.
+ //
+ MVector worldTranslation = matrix.translation( MSpace::kWorld, &status );
+
+
+ //
+ // Get the nodes immediate transform and create a function wrapper for it.
+ //
+ MDagPath nodePath;
+ status = MDagPath::getAPathTo( node, nodePath );
+ assert( status );
+
+ MObject transformObject = nodePath.transform( &status );
+ assert( status );
+
+ MFnTransform fnTransform( transformObject, &status );
+ assert( status );
+
+ //
+ // Get the node translation vector.
+ //
+ MVector nodeTranslation = fnTransform.translation( MSpace::kTransform, &status );
+
+ //
+ // The exclusive translation vector is that vector which reflect the
+ // amount of translation the node undergoes as a result of transforms
+ // exclusive of its immediate parent.
+ //
+ MVector exclusiveTranslation = worldTranslation - nodeTranslation;
+
+ //
+ // Set the nodeTranslation to that or our desired world position less the
+ // exclusiveTranslation vector.
+ //
+ MVector position( wp );
+ nodeTranslation = position - exclusiveTranslation;
+
+ //
+ // Push the result back into the transform and we are done.
+ //
+ status = fnTransform.setTranslation( nodeTranslation, MSpace::kTransform );
+ assert( status );
+
+}
+
+//-----------------------------------------------------------------------------
+// v i e w T o W o r l d A t Y
+//
+// Synopsis: Convert the specified view coordinates to world coordinates on
+// the specified y plane.
+//
+// Parameters: world - reference parameter to recieve the world coordinates.
+// view - the view position to be converted.
+// y - the y plane to translate to.
+//
+// Returns: The status of the request. Will return failure if the the
+// view plane is perpendicular to the y-plane.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MExt::ViewToWorldAtY( MPoint* wc, MPoint& vc, double y )
+{
+ assert( wc );
+
+ MStatus status = MS::kFailure;
+
+ M3dView view = M3dView::active3dView();
+ MPoint rayOrigin;
+ MVector rayVector;
+ status = view.viewToWorld( static_cast<short>(vc.x),
+ static_cast<short>(vc.y),
+ rayOrigin,
+ rayVector
+ );
+ assert( status );
+
+ MPoint result;
+ if ( fabs(rayVector.y) > EPSILON )
+ {
+ //
+ // The following formulas for x and z use the point slope formula in
+ // the form
+ // x = ( y - y0 ) / M + x0
+ // = ( y - y0 ) / ( dy / dx ) + x0
+ // = ( ( y - y0 ) / dy ) * dx + x0
+ //
+ double coeff = ( y - rayOrigin.y ) / rayVector.y;
+ wc->x = ( coeff * rayVector.x ) + rayOrigin.x;
+ wc->y = y;
+ wc->z = ( coeff * rayVector.z ) + rayOrigin.z;
+ }
+}
diff --git a/tools/globalcode/utility/MExt.h b/tools/globalcode/utility/MExt.h
new file mode 100644
index 0000000..e4b6444
--- /dev/null
+++ b/tools/globalcode/utility/MExt.h
@@ -0,0 +1,226 @@
+#include "precompiled/PCH.h"
+
+#ifndef _MEXT_H
+#define _MEXT_H
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MExt.h
+//
+// Description: Functions that extend the Maya API to perform other common
+// tasks.
+//
+// Modification History:
+// + Created Aug 21, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+/* Using precompiled headers.
+#include <maya/MStringArray.h>
+#include <maya/MPoint.h>
+#include <maya/MObject.h>
+#include <maya/MPlug.h>
+*/
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "MExt_template.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+class MString;
+class MDagPath;
+class MArgList;
+class MPlug;
+class MObject;
+class MSelectionList;
+class MTypeId;
+class MDoubleArray;
+
+//----------------------------------------
+// Macros
+//----------------------------------------
+#define RETURN_STATUS_ON_FAILURE( STATUS ) if ( ! (STATUS) ) return (STATUS)
+#define RETURN_FALSE_ON_FAILURE( STATUS ) if ( ! (STATUS) ) return false
+
+//These are used when dealing with plugs.
+#define AS_DEST true, false
+#define AS_SOURCE false, true
+#define AS_BOTH true, true
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+
+
+namespace MExt
+{
+ namespace Attr
+ {
+ void GetScaled( MPoint*, const MObject& node, const MObject& attr );
+
+ void SetScaled( const MPoint&, MObject& node, MObject& attr );
+
+ void SetScaled( const MPoint&, MObject& node, const MString& attr );
+
+ } // namespace Attr
+
+ namespace OptionVar
+ {
+ bool Get( char* buffer, unsigned int buffer_size, const char* symbol );
+
+ void Set( const char* buffer, const char* symbol );
+
+ } // namespace OptionVar
+
+
+ class OptionParser
+ {
+ public:
+
+ OptionParser( const char* command, const MArgList& args );
+ ~OptionParser();
+
+ void setOptions( const char* optionSpec );
+ int nextOption();
+ MString getArg();
+
+ private:
+
+ int m_argc;
+ char** m_argv;
+ char* m_opt;
+
+ };
+
+
+ void AddChild( MObject& parentLocatorNode, MObject& childLocatorNode );
+
+ void Connect( MObject& node,
+ MObject& attr,
+ MObject& otherNode,
+ MObject& otherAttr
+ );
+
+ void Connect( MObject& node,
+ const char* attr,
+ MObject& otherNode,
+ const char* otherAttr
+ );
+
+
+ void CreateNode( MObject* node,
+ MObject* transform,
+ const MString& type,
+ const MString* name = 0,
+ const MObject& parent = MObject::kNullObj
+ );
+
+ void CreateNode( MObject& node,
+ MObject& transform,
+ const MString& type,
+ const MString* name = 0,
+ const MObject& parent = MObject::kNullObj
+ );
+
+
+ void CreateVertexAttribute( MObject* attr,
+ const char* name,
+ const char* brief_name
+ );
+
+ void DeleteNode( MObject& node, bool deleteParent );
+
+ void DisconnectAll( MObject& node, MObject& attr );
+ void DisconnectAll( MObject& node, const char* attrName );
+
+ int DisplayError( const char* fmt, ... );
+
+ int DisplayWarning( const char* fmt, ... );
+
+ int DisplayInfo( const char* fmt, ... );
+
+ void FilterSelectionList( MSelectionList* filteredList,
+ const MString& typeName,
+ const MSelectionList& sourceList
+ );
+
+ bool FindAllSkeletonRoots( MObjectArray* objects );
+
+ bool FindAllTransforms( MObjectArray* transforms, const MObject& root );
+
+
+ bool FindDagNodeByName( MDagPath* path,
+ const MString& node,
+ const MObject& root = MObject::kNullObj
+ );
+
+ bool FindDagNodeByName( MDagPath* path,
+ const MString& node,
+ const MString& root
+ );
+
+ void GetWorldPosition( MPoint*, const MObject& node );
+
+ MPoint GetWorldPositionBetween( MObject& node1, MObject& node2 );
+
+ MMatrix GetWorldMatrix( MObject& node );
+
+ bool IsConnected( MObject& node, const char* attr );
+ bool IsConnected( MObject& node, MObject& attr );
+ bool IsConnected( MPlug& plug1, MPlug& plug2 );
+
+ void MakeNameUnique( MString* unique,
+ const MString& name,
+ const MObject& root = MObject::kNullObj
+ );
+
+ void MakeNameUnique( MString* unique,
+ const MString& name,
+ const MString& root
+ );
+
+ bool MeshClickIntersect( short xClick, short yClick, MPoint& intersect, bool closest = true );
+
+ bool MeshIntersectAlongVector( MPoint from, MPoint direction, MPoint& intersect, bool closest = true );
+
+ bool PlugHasConnection( MObject* connectedNode,
+ MPlug& plug,
+ bool asDst = true,
+ bool asSrc = true,
+ const char* type = 0
+ );
+
+ bool PlugHasConnection( MPlug* connectedPlug,
+ MPlug& plug,
+ bool asDst = true,
+ bool asSrc = true,
+ const char* type = 0
+ );
+
+
+ void ResolveConnections( MPlugArray* sources,
+ MPlugArray* targets,
+ MPlug& plug,
+ bool asDst = true,
+ bool asSrc = true
+ );
+
+
+ void SelectNodesBelowRoot( MSelectionList* list,
+ const MString& typeName,
+ const MObject& root = MObject::kNullObj,
+ MSelectionList* intersectionList = 0
+ );
+
+ void SetWorldPosition( const MPoint&, const MObject& node );
+
+ void ViewToWorldAtY( MPoint* world, MPoint& view, double y = 0.0 );
+
+} // namespace MExt
+
+#endif
diff --git a/tools/globalcode/utility/MExt_template.cpp b/tools/globalcode/utility/MExt_template.cpp
new file mode 100644
index 0000000..c01fee2
--- /dev/null
+++ b/tools/globalcode/utility/MExt_template.cpp
@@ -0,0 +1,273 @@
+#include "precompiled/PCH.h"
+
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MExt_template.cpp
+//
+// Description:
+//
+// Modification History:
+// + Created Dec 19, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "MExt_template.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+// G e t < MDoubleArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Get< MDoubleArray >( MDoubleArray* array, const MPlug& plug )
+{
+ assert( array );
+
+ MStatus status;
+
+ MObject data;
+ status = plug.getValue( data );
+ assert( status );
+
+ MFnDoubleArrayData fnArray( data, &status );
+ assert( status );
+
+ MDoubleArray myArray = fnArray.array( &status );
+ assert( status );
+
+ array->clear();
+ unsigned int i;
+ for ( i = 0; i < myArray.length(); i++ )
+ {
+ array->append( myArray[i] );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// G e t < MIntArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Get< MIntArray >( MIntArray* array, const MPlug& plug )
+{
+ assert( array );
+
+ MStatus status;
+
+ MObject data;
+ status = plug.getValue( data );
+ assert( status );
+
+ MFnIntArrayData fnArray( data, &status );
+ assert( status );
+
+ MIntArray myArray = fnArray.array( &status );
+ assert( status );
+
+ array->clear();
+ unsigned int i;
+ for ( i = 0; i < myArray.length(); i++ )
+ {
+ array->append( myArray[i] );
+ }
+}
+//-----------------------------------------------------------------------------
+// G e t < MPoint >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Get< MPoint >( MPoint* vertex, const MPlug& plug )
+{
+ assert( vertex );
+
+ MDoubleArray coordinates;
+ Get( &coordinates, plug );
+
+ if ( coordinates.length() > 0 )
+ {
+ assert( coordinates.length() == 3 );
+ vertex->x = coordinates[0];
+ vertex->y = coordinates[1];
+ vertex->z = coordinates[2];
+ }
+ else
+ {
+ *vertex = MPoint::origin;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// G e t < MStringArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Get< MStringArray >( MStringArray* array, const MPlug& plug )
+{
+ assert( array );
+
+ MStatus status;
+
+ MObject data;
+ status = plug.getValue( data );
+ assert( status );
+
+ MFnStringArrayData fnArray( data, &status );
+ assert( status );
+
+ MStringArray myArray = fnArray.array( &status );
+ assert( status );
+
+ array->clear();
+ unsigned int i;
+ for ( i = 0; i < myArray.length(); i++ )
+ {
+ array->append( myArray[i] );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// S e t < MDoubleArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Set< MDoubleArray >( const MDoubleArray& array, MPlug& plug )
+{
+ MStatus status;
+
+ MFnDoubleArrayData fnArray;
+ MObject object = fnArray.create( array, &status );
+ assert( status );
+
+ status = plug.setValue( object );
+ assert( status );
+}
+
+//-----------------------------------------------------------------------------
+// S e t < MIntArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Set< MIntArray >( const MIntArray& array, MPlug& plug )
+{
+ MStatus status;
+
+ MFnIntArrayData fnArray;
+ MObject object = fnArray.create( array, &status );
+ assert( status );
+
+ status = plug.setValue( object );
+ assert( status );
+}
+
+//-----------------------------------------------------------------------------
+// S e t < MPoint >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Set< MPoint >( const MPoint& vertex, MPlug& plug )
+{
+ MStatus status;
+
+ MDoubleArray coordinates;
+ coordinates.append( vertex.x );
+ coordinates.append( vertex.y );
+ coordinates.append( vertex.z );
+
+ Set( coordinates, plug );
+}
+
+//-----------------------------------------------------------------------------
+// S e t < MStringArray >
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+template < >
+void MExt::Attr::Set< MStringArray >( const MStringArray& array, MPlug& plug )
+{
+ MStatus status;
+
+ MFnStringArrayData fnArray;
+ MObject object = fnArray.create( array, &status );
+ assert( status );
+
+ status = plug.setValue( object );
+ assert( status );
+}
+
diff --git a/tools/globalcode/utility/MExt_template.h b/tools/globalcode/utility/MExt_template.h
new file mode 100644
index 0000000..5714e95
--- /dev/null
+++ b/tools/globalcode/utility/MExt_template.h
@@ -0,0 +1,146 @@
+#include "precompiled/PCH.h"
+
+#ifndef _MEXT_TEMPLATE_H
+#define _MEXT_TEMPLATE_H
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MExt_template.h
+//
+// Description:
+//
+// Modification History:
+// + Created Dec 19, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//This is a warning provided by the STL... It seems that toollib gets whacky when there
+//is other templates made... Sigh...
+#pragma warning(disable:4786)
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+//#include <assert.h>
+
+/* Using precompiled headers
+#include <maya/MDoubleArray.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnIntArrayData.h>
+#include <maya/MFnStringArrayData.h>
+#include <maya/MIntArray.h>
+#include <maya/MObject.h>
+#include <maya/MPlug.h>
+#include <maya/MPoint.h>
+#include <maya/MString.h>
+#include <maya/MStringArray.h>
+*/
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+namespace MExt
+{
+ namespace Attr
+ {
+
+ template < class T >
+ void Get( T* value, const MPlug& plug )
+ {
+ assert( value );
+
+ MStatus status;
+
+ status = plug.getValue( *value );
+ assert( status );
+ }
+
+ template < >
+ void Get< MDoubleArray >( MDoubleArray*, const MPlug& );
+
+ template < >
+ void Get< MIntArray >( MIntArray*, const MPlug& );
+
+ template < >
+ void Get< MPoint >( MPoint*, const MPlug& );
+
+ template < >
+ void Get< MStringArray >( MStringArray*, const MPlug& );
+
+ template < class T >
+ void Get( T* value, const MObject& node, const MObject& attr )
+ {
+ MPlug plug( node, attr );
+ Get( value, plug );
+ }
+
+ template < class T >
+ void Get( T* value, const MObject& node, const MString& attr )
+ {
+ MStatus status;
+
+ MFnDependencyNode fnNode( node, &status );
+ assert( status );
+
+ MPlug plug = fnNode.findPlug( attr, &status );
+ assert( status );
+
+ Get( value, plug );
+ }
+
+ template < class T >
+ void Set( const T& value, MPlug& plug )
+ {
+ MStatus status;
+
+ status = plug.setValue( const_cast<T&>(value) );
+ assert( status );
+ }
+
+ template < >
+ void Set< MDoubleArray >( const MDoubleArray& array, MPlug& plug );
+
+ template < >
+ void Set< MIntArray >( const MIntArray& array, MPlug& plug );
+
+ template < >
+ void Set< MPoint >( const MPoint& vertex, MPlug& plug );
+
+ template < >
+ void Set< MStringArray >( const MStringArray& array, MPlug& plug );
+
+ template < class T >
+ void Set( const T& value, MObject& node, MObject& attr )
+ {
+ MPlug plug( node, attr );
+ Set( value, plug );
+ }
+
+ template < class T >
+ void Set( const T& value, MObject& node, const MString& attr )
+ {
+ MStatus status;
+
+ MFnDependencyNode fnNode( node, &status );
+ assert( status );
+
+ MPlug plug = fnNode.findPlug( attr, &status );
+ assert( status );
+
+ Set( value, plug );
+ }
+
+ } // namespace Attr
+
+} // namespace MExt
+
+#endif
diff --git a/tools/globalcode/utility/MUI.cpp b/tools/globalcode/utility/MUI.cpp
new file mode 100644
index 0000000..4cd4a8d
--- /dev/null
+++ b/tools/globalcode/utility/MUI.cpp
@@ -0,0 +1,220 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MUI.cpp
+//
+// Description: Container class for custom UI windows for use in Maya.
+//
+// Modification History:
+// + Created Sep 30, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <assert.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "stdafx.h"
+#include "MUI.h"
+#include "util.h"
+#include "mayahandles.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// c o n f i r m
+//
+// Synopsis: Present a modal confirmation box to the user.
+//
+// Parameters: message - the message to display in the box.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int MUI::ConfirmDialog( const char* message )
+{
+ UINT style = MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1 | MB_TASKMODAL ;
+ int button = MessageBox( 0, message, "MUI Confirmation", style );
+
+ int result = MUI::YES;
+ if ( IDNO == button ) result = MUI::NO;
+ if ( IDCANCEL == button ) result = MUI::CANCEL;
+
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// E r r o r D i a l o g
+//
+// Synopsis: Present a modal error dialog box to the user.
+//
+// Parameters: message - the message to display in the box.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MUI::ErrorDialog( const char* message )
+{
+ UINT style = MB_OK | MB_ICONERROR | MB_TASKMODAL;
+ MessageBox( 0, message, "MUI Error", style );
+}
+
+//-----------------------------------------------------------------------------
+// E r r o r D i a l o g
+//
+// Synopsis: Present a modal error dialog box to the user.
+//
+// Parameters: message - the message to display in the box.
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MUI::InfoDialog( const char* message )
+{
+ UINT style = MB_OK | MB_ICONINFORMATION | MB_TASKMODAL;
+ MessageBox( 0, message, "MUI Info", style );
+}
+
+//-----------------------------------------------------------------------------
+// F i l e D i a l o g
+//
+// Synopsis: Present the user with a file browser window to select a file for
+// open or save.
+//
+// Parameters: filePath - a reference parameter to receive the full
+// file path from the dialog. If not NULL on
+// input, the initial value is used as the
+// starting location for the dialog.
+// filePathSize - the maximum length of the filePath buffer.
+// dialogTitle - the caption to appear in the dialog title
+// bar.
+// extensionFilter - A filter specifiying the types of files that
+// are eligilble for selection. It must end
+// in "||" with all entries separated by "|".
+// Generally entries will be in pairs; the
+// first is a type description and the second
+// is the actual filter. e.g./
+// "Raddle Data(*.rdl)|*.rdl|All Files(*.*)|*.*||".
+// defaultExtension - if not NULL, then the given extension will
+// automatically appended to an extensionless
+// entry in the Filename box.
+// broserType - OPEN | SAVE. Default is OPEN.
+//
+// Returns: true, if a filePath is set; false if the dialog is cancelled.
+//
+// Notes: The filePath will have "/" slashes and not "\" slashes on return.
+//
+//-----------------------------------------------------------------------------
+bool MUI::FileDialog( char* filePath, int filePathSize,
+ const char* windowTitle,
+ const char* extensionFilter,
+ const char* defaultExtension,
+ int browserType
+ )
+{
+ //
+ // We do need the file path to have windows backslashes.
+ //
+ util_replaceCharacters('/', '\\', filePath );
+
+ bool isOk = false;
+
+ BOOL doOpen;
+ DWORD flags = 0;
+
+ switch ( browserType )
+ {
+ case MUI::SET:
+ {
+ doOpen = TRUE;
+ flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
+ break;
+ }
+
+ case MUI::SAVE:
+ {
+ doOpen = FALSE;
+ flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
+ break;
+ }
+
+ default: // MUI::OPEN
+ {
+ doOpen = TRUE;
+ flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ break;
+
+ }
+ }
+
+ //
+ // Set the AFX handle to maya's application instance handle.
+ //
+ HINSTANCE handle = static_cast<HINSTANCE>(MayaHandles::GetHInstance());
+ AfxSetResourceHandle( handle );
+
+ //
+ // Create the dialog
+ //
+ CFileDialog fileDialog( doOpen,
+ defaultExtension,
+ filePath,
+ flags,
+ extensionFilter,
+ NULL
+ );
+
+ if ( windowTitle ) fileDialog.m_ofn.lpstrTitle = windowTitle;
+
+ //
+ // Show the dialog and wait for a response.
+ //
+ int result = fileDialog.DoModal();
+ if ( IDOK == result )
+ {
+ const char* filename = LPCSTR( fileDialog.GetPathName() );
+ strncpy( filePath, LPCSTR( fileDialog.GetPathName() ), filePathSize );
+ util_replaceCharacters('\\', '/', filePath );
+ isOk = true;
+ }
+
+ return isOk;
+}
+
+//=============================================================================
+// MUI::PopupDialogue
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( int id, DLGPROC callBack )
+//
+// Return: void
+//
+//=============================================================================
+void MUI::PopupDialogue( int id, DLGPROC callBack )
+{
+ HINSTANCE handle = static_cast<HINSTANCE>(MayaHandles::GetHInstance());
+ AfxSetResourceHandle( handle );
+
+ HWND hWnd = static_cast<HWND>(MayaHandles::GetHWND());
+
+ DialogBox( handle, MAKEINTRESOURCE(id), hWnd, callBack );
+}
+
+
diff --git a/tools/globalcode/utility/MUI.h b/tools/globalcode/utility/MUI.h
new file mode 100644
index 0000000..e991cf7
--- /dev/null
+++ b/tools/globalcode/utility/MUI.h
@@ -0,0 +1,82 @@
+#ifndef _MUI_HPP
+#define _MUI_HPP
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// MUI.hpp
+//
+// Description: Container class for custom UI windows for use in Maya.
+//
+// Modification History:
+// + Created Sep 30, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+//This is an example callback.
+inline BOOL CALLBACK PopupCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ return true;
+ }
+ break;
+ default:
+ {
+// EndDialog( hWnd, 0); //this is how you close the window.
+ return false;
+ }
+ break;
+ }
+}
+
+
+class MUI
+{
+ public:
+
+ enum {
+ YES,
+ NO,
+ CANCEL,
+ SAVE,
+ SET,
+ NEW,
+ OPEN
+ };
+
+ static int ConfirmDialog( const char* message );
+
+ static bool FileDialog( char* filePath, int filePathSize,
+ const char* windowTitle = 0,
+ const char* extensionFilter = 0,
+ const char* defaultExtension = 0,
+ int browserType = MUI::OPEN
+ );
+
+ static void ErrorDialog( const char* message );
+
+ static void InfoDialog( const char* message );
+
+ static void PopupDialogue( int id, DLGPROC callBack );
+
+ private:
+};
+
+#endif
diff --git a/tools/globalcode/utility/mayahandles.cpp b/tools/globalcode/utility/mayahandles.cpp
new file mode 100644
index 0000000..e0cb824
--- /dev/null
+++ b/tools/globalcode/utility/mayahandles.cpp
@@ -0,0 +1,105 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// mayahandles.cpp
+//
+// Description: Class to store and retrieve maya handles as generic pointers.
+//
+// Modification History:
+// + Created Oct 15, 2001 -- bkusy
+// + More MFC goodness -- Cary Brisebois
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "mayahandles.h"
+#include "stdafx.h"
+#include "maya/mglobal.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+void* MayaHandles::m_hInstance = 0;
+void* MayaHandles::m_HWND = 0;
+
+BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
+{
+ char str[1024];
+ ::GetWindowText(hwnd, str, 1024);
+
+ MString mayaVersion = MGlobal::mayaVersion();
+
+ char version[256];
+ sprintf( version, "Maya %s", mayaVersion.asChar() );
+
+ if(strncmp(str, version, strlen(version)) == 0) //This is silly.
+ {
+ *(HWND*)lParam = hwnd;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// S e t H I n s t a n c e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void MayaHandles::SetHInstance( void* hInstance )
+{
+ m_hInstance = hInstance;
+}
+
+//-----------------------------------------------------------------------------
+// G e t H I n s t a n c e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* MayaHandles::GetHInstance()
+{
+ return m_hInstance;
+}
+
+void* MayaHandles::GetHWND()
+{
+ if ( m_HWND == 0 )
+ {
+ HWND hWnd = NULL;
+ EnumChildWindows(::GetDesktopWindow(), EnumChildProc, (long)&hWnd);
+ if(hWnd == NULL)
+ {
+ // houston we have a problem
+ MGlobal::displayError("can't find Maya window");
+ }
+ else
+ {
+ m_HWND = hWnd;
+ }
+ }
+
+ return m_HWND;
+} \ No newline at end of file
diff --git a/tools/globalcode/utility/mayahandles.h b/tools/globalcode/utility/mayahandles.h
new file mode 100644
index 0000000..9e530ba
--- /dev/null
+++ b/tools/globalcode/utility/mayahandles.h
@@ -0,0 +1,42 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// mayahandles.h
+//
+// Description: Class to store and retrieve maya handles as generic pointers.
+//
+// Modification History:
+// + Created Oct 15, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+class MayaHandles
+{
+ public:
+
+ static void SetHInstance( void* hInstance );
+ static void* GetHInstance();
+
+ static void* GetHWND();
+
+ private:
+
+ static void* m_hInstance;
+ static void* m_HWND;
+};
+
diff --git a/tools/globalcode/utility/nodehelper.h b/tools/globalcode/utility/nodehelper.h
new file mode 100644
index 0000000..ef0842a
--- /dev/null
+++ b/tools/globalcode/utility/nodehelper.h
@@ -0,0 +1,37 @@
+#ifndef NODE_HELPERS
+
+#include "precompiled/PCH.h"
+
+namespace NodeHelper
+{
+
+inline int OverrideNodeColour( MObject& node, int defaultColour )
+{
+ int colour = defaultColour;
+
+ MStatus status;
+ MFnDagNode fnDag( node );
+ MPlug overColour = fnDag.findPlug( MString( "overrideColor" ), &status );
+ if ( status )
+ {
+ overColour.getValue( colour );
+ if ( colour != 0 ) //The override is Active...
+ {
+ colour--;
+ if ( colour < 0 )
+ {
+ colour = 0;
+ }
+ }
+ else
+ {
+ colour = defaultColour;
+ }
+ }
+
+ return colour;
+}
+
+};
+
+#endif \ No newline at end of file
diff --git a/tools/globalcode/utility/overlaymarquee.cpp b/tools/globalcode/utility/overlaymarquee.cpp
new file mode 100644
index 0000000..7d97b77
--- /dev/null
+++ b/tools/globalcode/utility/overlaymarquee.cpp
@@ -0,0 +1,222 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// marquee.cpp
+//
+// Description:
+//
+// Modification History:
+// + Created Jun 14, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <windows.h>
+#include <assert.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glaux.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "overlaymarquee.h"
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//----------------------------------------
+// Define Owning Namespace
+//----------------------------------------
+namespace GLObj {
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+// M a r q u e e
+//
+// Synopsis: Constructor
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+OverlayMarquee::OverlayMarquee() :
+ m_xStart( 0 ),
+ m_yStart( 0 ),
+ m_xEnd( 0 ),
+ m_yEnd( 0 )
+{
+}
+
+//-----------------------------------------------------------------------------
+// ~ M a r q u e e
+//
+// Synopsis: Destructor
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+OverlayMarquee::~OverlayMarquee()
+{
+}
+
+//-----------------------------------------------------------------------------
+// B e g i n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void OverlayMarquee::Begin( M3dView& view, short xStart, short yStart )
+{
+ m_View = view;
+ m_xStart = xStart;
+ m_yStart = yStart;
+ m_View.beginGL();
+ m_View.beginOverlayDrawing();
+}
+
+//-----------------------------------------------------------------------------
+// D r a w
+//
+// Synopsis: Draw a marquee with the given coordinates.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void OverlayMarquee::Draw( short xEnd, short yEnd )
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ m_xEnd = xEnd;
+ m_yEnd = yEnd;
+
+ //
+ // Clearing the overlay plane doesn't seem to work, but swapping buffers does
+ // so we'll use that instead. You've gotta luv Maya bugs -- embrace them
+ // don't squash them.
+ //
+ m_View.clearOverlayPlane();
+ SwapBuffers( m_View.deviceContext() );
+
+ //
+ // Setup the orthographic projection matrix.
+ //
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ gluOrtho2D( 0.0, (GLdouble)m_View.portWidth(), 0.0, (GLdouble)m_View.portHeight() );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.375, 0.375, 0.0 );
+
+ //
+ // Retrieve GL State.
+ //
+ float lineWidth;
+ unsigned char lineSmoothedFlag;
+ glGetFloatv( GL_LINE_WIDTH, &lineWidth );
+ glGetBooleanv( GL_LINE_SMOOTH, &lineSmoothedFlag );
+
+ //
+ // Set line style.
+ //
+ glLineStipple( 1, 0x5555 );
+ glLineWidth( 1.0 );
+ glEnable( GL_LINE_STIPPLE );
+ glEnable( GL_LINE_SMOOTH );
+ glIndexi( 2 );
+
+ //
+ // Draw marquee.
+ //
+ glBegin( GL_LINES );
+
+ glVertex2i( m_xStart, m_yEnd ); // Left Side.
+ glVertex2i( m_xStart, m_yStart );
+
+ glVertex2i( m_xStart, m_yStart );// Top
+ glVertex2i( m_xEnd, m_yStart );
+
+ glVertex2i( m_xEnd, m_yStart ); // Right Side.
+ glVertex2i( m_xEnd, m_yEnd );
+
+ glVertex2i( m_xEnd, m_yEnd ); // Bottom.
+ glVertex2i( m_xStart, m_yEnd );
+
+ glEnd();
+
+ //
+ // Don't swap the display buffers. A bug in Maya causes the display to be
+ // cleared -- making the flicker worse.
+ //
+ //SwapBuffers( m_View.deviceContext() );
+
+ //
+ // Instead just flush the GL buffers.
+ //
+ glFlush();
+
+
+ //
+ // Restore GL state.
+ glLineWidth( lineWidth );
+ if ( !lineSmoothedFlag ) glDisable( GL_LINE_SMOOTH );
+ glDisable( GL_LINE_STIPPLE );
+
+ glPopAttrib();
+}
+
+//-----------------------------------------------------------------------------
+// R e d r a w
+//
+// Synopsis: Draw a marquee with the last given coordinates.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void OverlayMarquee::Redraw()
+{
+ Draw( m_xEnd, m_yEnd );
+}
+
+void OverlayMarquee::End()
+{
+ m_View.endOverlayDrawing();
+ m_View.endGL();
+
+ //
+ // Use the Maya bug to get rid of any drawing we have done.
+ //
+ SwapBuffers( m_View.deviceContext() );
+}
+
+} // namespace GLObj
+
+
+
+
diff --git a/tools/globalcode/utility/overlaymarquee.h b/tools/globalcode/utility/overlaymarquee.h
new file mode 100644
index 0000000..b900083
--- /dev/null
+++ b/tools/globalcode/utility/overlaymarquee.h
@@ -0,0 +1,55 @@
+#include "precompiled/PCH.h"
+
+#ifndef _GLOBJ_OVERLAYMARQUEE_H
+#define _GLOBJ_OVERLAYMARQUEE_H
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// overlaymarquee.h
+//
+// Description: Draw a marquee using openGL.
+//
+// Modification History:
+// + Created Jun 14, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+//#include <maya/M3dView.h>
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+//----------------------------------------
+// Define Owning Namespace
+//----------------------------------------
+namespace GLObj {
+
+class OverlayMarquee
+{
+ public:
+
+ OverlayMarquee();
+ ~OverlayMarquee();
+
+ void Begin( M3dView& view, short xStart, short yStart );
+ void Draw( short xEnd, short yEnd );
+ void Redraw();
+ void End();
+
+ private:
+ OverlayMarquee(OverlayMarquee &);
+ OverlayMarquee &operator=(OverlayMarquee &);
+
+ M3dView m_View;
+ short m_xStart, m_yStart, m_xEnd, m_yEnd;
+};
+
+} // GLObj namespace.
+
+#endif
diff --git a/tools/globalcode/utility/stdafx.h b/tools/globalcode/utility/stdafx.h
new file mode 100644
index 0000000..3152a3f
--- /dev/null
+++ b/tools/globalcode/utility/stdafx.h
@@ -0,0 +1,19 @@
+#ifndef STDAFX
+#define STDAFX
+
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// stdafx.h
+//
+// Description: Header wrapper for using MFC.
+//
+// Modification History:
+// + Created Oct 12, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+#define VC_EXTRALEAN
+#include <afxwin.h>
+#include <afxdlgs.h>
+
+
+#endif \ No newline at end of file
diff --git a/tools/globalcode/utility/transformmatrix.cpp b/tools/globalcode/utility/transformmatrix.cpp
new file mode 100644
index 0000000..1264fff
--- /dev/null
+++ b/tools/globalcode/utility/transformmatrix.cpp
@@ -0,0 +1,904 @@
+/*===========================================================================
+ transformmatrix.cpp
+ Created: October 16, 2000
+ Auuthor: Bryan Brandt
+
+ Copyright (c) 2000 Radical Entertainment, Inc.
+ All rights reserved.
+===========================================================================*/
+
+//#include <maya/MFnTransform.h>
+//#include <maya/MPoint.h>
+//#include <maya/MQuaternion.h>
+//#include <maya/MEulerRotation.h>
+//#include <maya/MVector.h>
+//#include <maya/MDagPath.h>
+//#include <maya/MFnIkJoint.h>
+//#include <maya/MPlug.h>
+
+#include "transformmatrix.h"
+
+
+TransformMatrix::TransformMatrix():
+ rotateOrder(ORDER_XYZ)
+{
+ SetIdentity();
+}
+
+
+TransformMatrix::TransformMatrix(const MDagPath& dagPath):
+ rotateOrder(ORDER_XYZ)
+{
+ SetIdentity();
+ Assign(dagPath);
+}
+
+
+TransformMatrix::TransformMatrix(const MTransformationMatrix& xform):
+ rotateOrder(ORDER_XYZ)
+{
+ SetIdentity();
+ Assign(xform);
+}
+
+
+bool TransformMatrix::Assign(const MDagPath& dagPath)
+{
+ MStatus status;
+
+ MObject node = dagPath.node(&status);
+ if (!status)
+ return false;
+
+ if (node.hasFn(MFn::kJoint))
+ {
+ MDagPath tmpDagPath = dagPath;
+ return AssignJoint(tmpDagPath, node);
+ }
+ else if (node.hasFn(MFn::kTransform))
+ {
+ MFnTransform xformNode(dagPath, &status);
+ if (!status)
+ return false;
+
+ MTransformationMatrix xform = xformNode.transformation(&status);
+ if (!status)
+ return false;
+
+ return Assign(xform);
+ }
+
+ return false;
+}
+
+
+bool TransformMatrix::AssignJoint(MDagPath& dagPath, MObject& node)
+{
+ MStatus status;
+
+ MFnIkJoint jointNode(node, &status);
+ if (!status)
+ return false;
+
+ double tmp[3];
+ MQuaternion tmpQuat;
+ MEulerRotation tmpEuler;
+ MVector tmpVector;
+
+ scalePivot.x = 0.0f;
+ scalePivot.y = 0.0f;
+ scalePivot.z = 0.0f;
+
+ status = jointNode.getScale(tmp);
+ if (!status)
+ return false;
+ scaleX = (float)tmp[0];
+ scaleY = (float)tmp[1];
+ scaleZ = (float)tmp[2];
+
+ // we've officially updated a scale dependency,
+ // so set the scale matrix dirty flag
+ scaleDirty = true;
+
+ shearXY = 0.0f;
+ shearXZ = 0.0f;
+ shearYZ = 0.0f;
+
+ scalePivotTranslate.x = 0.0f;
+ scalePivotTranslate.y = 0.0f;
+ scalePivotTranslate.z = 0.0f;
+
+ rotatePivot.x = 0.0f;
+ rotatePivot.y = 0.0f;
+ rotatePivot.z = 0.0f;
+
+ // we've officially updated a hierarchy dependency,
+ // so set the hierarchy matrix dirty flag
+ hierarchyDirty = true;
+
+ status = jointNode.getScaleOrientation(tmpQuat);
+ if (!status)
+ return false;
+ tmpEuler = tmpQuat.asEulerRotation();
+ tmpEuler.reorderIt(MEulerRotation::kXYZ);
+ rotateAxisX = (float)tmpEuler.x;
+ rotateAxisY = (float)tmpEuler.y;
+ rotateAxisZ = (float)tmpEuler.z;
+
+ MTransformationMatrix::RotationOrder ro;
+ jointNode.getRotation(tmp, ro);
+ switch (ro)
+ {
+ case MTransformationMatrix::kXYZ:
+ rotateOrder = ORDER_XYZ;
+ break;
+ case MTransformationMatrix::kYZX:
+ rotateOrder = ORDER_YZX;
+ break;
+ case MTransformationMatrix::kZXY:
+ rotateOrder = ORDER_ZXY;
+ break;
+ case MTransformationMatrix::kXZY:
+ rotateOrder = ORDER_XZY;
+ break;
+ case MTransformationMatrix::kYXZ:
+ rotateOrder = ORDER_YXZ;
+ break;
+ case MTransformationMatrix::kZYX:
+ rotateOrder = ORDER_ZYX;
+ break;
+
+ default:
+ return false;
+ }
+
+ rotateX = (float)tmp[0];
+ rotateY = (float)tmp[1];
+ rotateZ = (float)tmp[2];
+
+ rotatePivotTranslate.x = 0.0f;
+ rotatePivotTranslate.y = 0.0f;
+ rotatePivotTranslate.z = 0.0f;
+
+ status = jointNode.getOrientation(tmpEuler);
+ tmpEuler.reorderIt(MEulerRotation::kXYZ);
+ jointOrientX = (float)tmpEuler.x;
+ jointOrientY = (float)tmpEuler.y;
+ jointOrientZ = (float)tmpEuler.z;
+
+ // default inverseScale to identity
+ inverseScaleX = 1.0f;
+ inverseScaleY = 1.0f;
+ inverseScaleZ = 1.0f;
+
+ // retrieve the segment scale compensate attribute
+ MFnDependencyNode depNode(node, &status);
+ if (!status)
+ return false;
+
+ MPlug plug = depNode.findPlug("segmentScaleCompensate", &status);
+ if (!status)
+ return false;
+
+ bool segmentScaleCompensate;
+ status = plug.getValue(segmentScaleCompensate);
+ if (!status)
+ return false;
+
+ // if we are compensating for parent scale, do so
+ if (segmentScaleCompensate)
+ {
+ plug = depNode.findPlug("inverseScaleX", &status);
+ if (!status)
+ return false;
+ status = plug.getValue(inverseScaleX);
+ if (!status)
+ return false;
+ if (inverseScaleX != 0.0f)
+ inverseScaleX = (1.0f / inverseScaleX);
+
+ plug = depNode.findPlug("inverseScaleY", &status);
+ if (!status)
+ return false;
+ status = plug.getValue(inverseScaleY);
+ if (!status)
+ return false;
+ if (inverseScaleY != 0.0f)
+ inverseScaleY = (1.0f / inverseScaleY);
+
+ plug = depNode.findPlug("inverseScaleZ", &status);
+ if (!status)
+ return false;
+ status = plug.getValue(inverseScaleZ);
+ if (!status)
+ return false;
+ if (inverseScaleZ != 0.0f)
+ inverseScaleZ = (1.0f / inverseScaleZ);
+ }
+
+ tmpVector = jointNode.translation(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ translate.x = (float)tmpVector.x;
+ translate.y = (float)tmpVector.y;
+ translate.z = (float)tmpVector.z;
+
+ return true;
+}
+
+
+bool TransformMatrix::Assign(const MTransformationMatrix& xform)
+{
+ MStatus status;
+ MPoint tmpPoint;
+ double tmpArray[3];
+ MQuaternion tmpQuat;
+ MEulerRotation tmpEuler;
+ MVector tmpVector;
+
+ tmpPoint = xform.scalePivot(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ scalePivot.x = (float)tmpPoint.x;
+ scalePivot.y = (float)tmpPoint.y;
+ scalePivot.z = (float)tmpPoint.z;
+
+ // we've officially updated a scale dependency,
+ // so set the scale matrix dirty flag
+ scaleDirty = true;
+
+ status = xform.getScale(tmpArray, MSpace::kWorld);
+ if (!status)
+ return false;
+ scaleX = (float)tmpArray[0];
+ scaleY = (float)tmpArray[1];
+ scaleZ = (float)tmpArray[2];
+
+ status = xform.getShear(tmpArray, MSpace::kWorld);
+ if (!status)
+ return false;
+ shearXY = (float)tmpArray[0];
+ shearXZ = (float)tmpArray[1];
+ shearYZ = (float)tmpArray[2];
+
+ tmpPoint = xform.scalePivotTranslation(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ scalePivotTranslate.x = (float)tmpPoint.x;
+ scalePivotTranslate.y = (float)tmpPoint.y;
+ scalePivotTranslate.z = (float)tmpPoint.z;
+
+ tmpPoint = xform.rotatePivot(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ rotatePivot.x = (float)tmpPoint.x;
+ rotatePivot.y = (float)tmpPoint.y;
+ rotatePivot.z = (float)tmpPoint.z;
+
+ // we've officially updated a hierarchy dependency,
+ // so set the hierarchy matrix dirty flag
+ hierarchyDirty = true;
+
+ tmpQuat = xform.rotationOrientation();
+ tmpEuler = tmpQuat.asEulerRotation();
+ tmpEuler.reorderIt(MEulerRotation::kXYZ);
+ rotateAxisX = (float)tmpEuler.x;
+ rotateAxisY = (float)tmpEuler.y;
+ rotateAxisZ = (float)tmpEuler.z;
+
+ MTransformationMatrix::RotationOrder ro = xform.rotationOrder();
+ switch (ro)
+ {
+ case MTransformationMatrix::kXYZ:
+ rotateOrder = ORDER_XYZ;
+ break;
+ case MTransformationMatrix::kYZX:
+ rotateOrder = ORDER_YZX;
+ break;
+ case MTransformationMatrix::kZXY:
+ rotateOrder = ORDER_ZXY;
+ break;
+ case MTransformationMatrix::kXZY:
+ rotateOrder = ORDER_XZY;
+ break;
+ case MTransformationMatrix::kYXZ:
+ rotateOrder = ORDER_YXZ;
+ break;
+ case MTransformationMatrix::kZYX:
+ rotateOrder = ORDER_ZYX;
+ break;
+
+ default:
+ return false;
+ }
+
+ tmpQuat = xform.rotation();
+ tmpEuler = tmpQuat.asEulerRotation();
+ switch (rotateOrder)
+ {
+ case ORDER_XYZ:
+ tmpEuler.reorderIt(MEulerRotation::kXYZ);
+ break;
+ case ORDER_YZX:
+ tmpEuler.reorderIt(MEulerRotation::kYZX);
+ break;
+ case ORDER_ZXY:
+ tmpEuler.reorderIt(MEulerRotation::kZXY);
+ break;
+ case ORDER_XZY:
+ tmpEuler.reorderIt(MEulerRotation::kXZY);
+ break;
+ case ORDER_YXZ:
+ tmpEuler.reorderIt(MEulerRotation::kYXZ);
+ break;
+ case ORDER_ZYX:
+ tmpEuler.reorderIt(MEulerRotation::kZYX);
+ break;
+
+ default:
+ return false;
+ }
+ rotateX = (float)tmpEuler.x;
+ rotateY = (float)tmpEuler.y;
+ rotateZ = (float)tmpEuler.z;
+
+ tmpVector = xform.rotatePivotTranslation(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ rotatePivotTranslate.x = (float)tmpVector.x;
+ rotatePivotTranslate.y = (float)tmpVector.y;
+ rotatePivotTranslate.z = (float)tmpVector.z;
+
+ // only used in joints
+ jointOrientX = 0.0f;
+ jointOrientY = 0.0f;
+ jointOrientZ = 0.0f;
+
+ // only used in joints
+ inverseScaleX = 1.0f;
+ inverseScaleY = 1.0f;
+ inverseScaleZ = 1.0f;
+
+ tmpVector = xform.translation(MSpace::kWorld, &status);
+ if (!status)
+ return false;
+ translate.x = (float)tmpVector.x;
+ translate.y = (float)tmpVector.y;
+ translate.z = (float)tmpVector.z;
+
+ return true;
+}
+
+
+void TransformMatrix::SetScalePivot(const tlPoint& sp)
+{
+ scalePivot = sp;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScale(float x, float y, float z)
+{
+ scaleX = x;
+ scaleY = y;
+ scaleZ = z;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScaleX(float x)
+{
+ scaleX = x;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScaleY(float y)
+{
+ scaleY = y;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScaleZ(float z)
+{
+ scaleZ = z;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetShear(float xy, float xz, float yz)
+{
+ shearXY = xy;
+ shearXZ = xz;
+ shearYZ = yz;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetShearXY(float xy)
+{
+ shearXY = xy;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetShearXZ(float xz)
+{
+ shearXZ = xz;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetShearYZ(float yz)
+{
+ shearYZ = yz;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScalePivotTranslate(float x, float y, float z)
+{
+ scalePivotTranslate.x = x;
+ scalePivotTranslate.y = y;
+ scalePivotTranslate.z = z;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScalePivotTranslate(const tlPoint& spt)
+{
+ scalePivotTranslate = spt;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScalePivotX(float x)
+{
+ scalePivotTranslate.x = x;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScalePivotY(float y)
+{
+ scalePivotTranslate.y = y;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetScalePivotZ(float z)
+{
+ scalePivotTranslate.z = z;
+ scaleDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivot(float x, float y, float z)
+{
+ rotatePivot.x = x;
+ rotatePivot.y = y;
+ rotatePivot.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivot(const tlPoint& rp)
+{
+ rotatePivot = rp;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotX(float x)
+{
+ rotatePivot.x = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotY(float y)
+{
+ rotatePivot.y = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotZ(float z)
+{
+ rotatePivot.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateAxis(float x, float y, float z)
+{
+ rotateAxisX = x;
+ rotateAxisY = y;
+ rotateAxisZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateAxisX(float rax)
+{
+ rotateAxisX = rax;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateAxisY(float ray)
+{
+ rotateAxisY = ray;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateAxisZ(float raz)
+{
+ rotateAxisZ = raz;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotate(float x, float y, float z)
+{
+ rotateX = x;
+ rotateY = y;
+ rotateZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateX(float x)
+{
+ rotateX = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateY(float y)
+{
+ rotateY = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateZ(float z)
+{
+ rotateZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotateOrder(RotateOrder ro)
+{
+ rotateOrder = ro;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotTranslate(float x, float y, float z)
+{
+ rotatePivotTranslate.x = x;
+ rotatePivotTranslate.y = y;
+ rotatePivotTranslate.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotTranslate(const tlPoint& rpt)
+{
+ rotatePivotTranslate = rpt;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotTranslateX(float x)
+{
+ rotatePivotTranslate.x = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotTranslateY(float y)
+{
+ rotatePivotTranslate.y = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetRotatePivotTranslateZ(float z)
+{
+ rotatePivotTranslate.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetJointOrient(float x, float y, float z)
+{
+ jointOrientX = x;
+ jointOrientY = y;
+ jointOrientZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetJointOrientX(float x)
+{
+ jointOrientX = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetJointOrientY(float y)
+{
+ jointOrientY = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetJointOrientZ(float z)
+{
+ jointOrientZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetInverseScale(float x, float y, float z)
+{
+ inverseScaleX = x;
+ inverseScaleY = y;
+ inverseScaleZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetInverseScaleX(float x)
+{
+ inverseScaleX = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetInverseScaleY(float y)
+{
+ inverseScaleY = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetInverseScaleZ(float z)
+{
+ inverseScaleZ = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetTranslate(float x, float y, float z)
+{
+ translate.x = x;
+ translate.y = y;
+ translate.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetTranslate(const tlPoint& t)
+{
+ translate = t;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetTranslateX(float x)
+{
+ translate.x = x;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetTranslateY(float y)
+{
+ translate.y = y;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetTranslateZ(float z)
+{
+ translate.z = z;
+ hierarchyDirty = true;
+}
+
+
+void TransformMatrix::SetScaleMatrixIdentity()
+{
+ scalePivot.x = 0.0f;
+ scalePivot.y = 0.0f;
+ scalePivot.z = 0.0f;
+
+ scaleX = 1.0f;
+ scaleY = 1.0f;
+ scaleZ = 1.0f;
+
+ shearXY = 0.0f;
+ shearXZ = 0.0f;
+ shearYZ = 0.0f;
+
+ scalePivotTranslate.x = 0.0f;
+ scalePivotTranslate.y = 0.0f;
+ scalePivotTranslate.z = 0.0f;
+
+ scaleMatrix.IdentityMatrix();
+ scaleDirty = false;
+}
+
+
+void TransformMatrix::SetHierarchyMatrixIdentity()
+{
+ rotatePivot.x = 0.0f;
+ rotatePivot.y = 0.0f;
+ rotatePivot.z = 0.0f;
+
+ rotateAxisX = 0.0f;
+ rotateAxisY = 0.0f;
+ rotateAxisZ = 0.0f;
+
+ rotateX = 0.0f;
+ rotateY = 0.0f;
+ rotateZ = 0.0f;
+
+ rotatePivotTranslate.x = 0.0f;
+ rotatePivotTranslate.y = 0.0f;
+ rotatePivotTranslate.z = 0.0f;
+
+ jointOrientX = 0.0f;
+ jointOrientY = 0.0f;
+ jointOrientZ = 0.0f;
+
+ inverseScaleX = 1.0f;
+ inverseScaleY = 1.0f;
+ inverseScaleZ = 1.0f;
+
+ translate.x = 0.0f;
+ translate.y = 0.0f;
+ translate.z = 0.0f;
+
+ hierarchyMatrix.IdentityMatrix();
+ hierarchyDirty = false;
+}
+
+
+void TransformMatrix::SetIdentity()
+{
+ SetScaleMatrixIdentity();
+ SetHierarchyMatrixIdentity();
+}
+
+
+void TransformMatrix::ComputeScaleMatrix()
+{
+ if (!scaleDirty)
+ return;
+
+ scaleMatrix.IdentityMatrix();
+ scaleMatrix.Translate(-scalePivot);
+ scaleMatrix.Scale(scaleX, scaleY, scaleZ, true);
+ scaleMatrix.Shear(shearXY, shearXZ, shearYZ);
+ scaleMatrix.Translate(scalePivot);
+ scaleMatrix.Translate(scalePivotTranslate);
+
+ scaleMatrix.Scale(inverseScaleX, inverseScaleY, inverseScaleZ, true);
+
+ scaleDirty = false;
+}
+
+
+void TransformMatrix::ComputeHierarchyMatrix()
+{
+ if (!hierarchyDirty)
+ return;
+
+ hierarchyMatrix.IdentityMatrix();
+ hierarchyMatrix.Translate(-rotatePivot);
+
+ hierarchyMatrix.RotateX(rotateAxisX);
+ hierarchyMatrix.RotateY(rotateAxisY);
+ hierarchyMatrix.RotateZ(rotateAxisZ);
+
+ switch (rotateOrder)
+ {
+ case ORDER_XYZ:
+ hierarchyMatrix.RotateX(rotateX);
+ hierarchyMatrix.RotateY(rotateY);
+ hierarchyMatrix.RotateZ(rotateZ);
+ break;
+
+ case ORDER_YZX:
+ hierarchyMatrix.RotateY(rotateY);
+ hierarchyMatrix.RotateZ(rotateZ);
+ hierarchyMatrix.RotateX(rotateX);
+ break;
+
+ case ORDER_ZXY:
+ hierarchyMatrix.RotateZ(rotateZ);
+ hierarchyMatrix.RotateX(rotateX);
+ hierarchyMatrix.RotateY(rotateY);
+ break;
+
+ case ORDER_XZY:
+ hierarchyMatrix.RotateX(rotateX);
+ hierarchyMatrix.RotateZ(rotateZ);
+ hierarchyMatrix.RotateY(rotateY);
+ break;
+
+ case ORDER_YXZ:
+ hierarchyMatrix.RotateY(rotateY);
+ hierarchyMatrix.RotateX(rotateX);
+ hierarchyMatrix.RotateZ(rotateZ);
+ break;
+
+ case ORDER_ZYX:
+ hierarchyMatrix.RotateZ(rotateZ);
+ hierarchyMatrix.RotateY(rotateY);
+ hierarchyMatrix.RotateX(rotateX);
+ break;
+ }
+
+ hierarchyMatrix.Translate(rotatePivot);
+ hierarchyMatrix.Translate(rotatePivotTranslate);
+ hierarchyMatrix.RotateX(jointOrientX);
+ hierarchyMatrix.RotateY(jointOrientY);
+ hierarchyMatrix.RotateZ(jointOrientZ);
+ //hierarchyMatrix.Scale(inverseScaleX, inverseScaleY, inverseScaleZ, true);
+ hierarchyMatrix.Translate(translate);
+
+ hierarchyDirty = false;
+}
+
+
+const tlMatrix& TransformMatrix::GetScaleMatrix() const
+{
+ const_cast<TransformMatrix*>(this)->ComputeScaleMatrix();
+ return scaleMatrix;
+}
+
+
+const tlMatrix& TransformMatrix::GetHierarchyMatrix() const
+{
+ const_cast<TransformMatrix*>(this)->ComputeHierarchyMatrix();
+ return hierarchyMatrix;
+}
+
+
+void TransformMatrix::GetScaleMatrixLHS(tlMatrix& matrix) const
+{
+ GetScaleMatrixRHS(matrix);
+ matrix.RHSToLHS();
+}
+
+
+void TransformMatrix::GetHierarchyMatrixLHS(tlMatrix& matrix) const
+{
+ GetHierarchyMatrixRHS(matrix);
+ matrix.RHSToLHS();
+}
+
+
+void TransformMatrix::GetScaleMatrixRHS(tlMatrix& matrix) const
+{
+ const_cast<TransformMatrix*>(this)->ComputeScaleMatrix();
+ matrix = scaleMatrix;
+}
+
+
+void TransformMatrix::GetHierarchyMatrixRHS(tlMatrix& matrix) const
+{
+ const_cast<TransformMatrix*>(this)->ComputeHierarchyMatrix();
+ matrix = hierarchyMatrix;
+}
+
+
+// End of file.
+
diff --git a/tools/globalcode/utility/transformmatrix.h b/tools/globalcode/utility/transformmatrix.h
new file mode 100644
index 0000000..4d0e175
--- /dev/null
+++ b/tools/globalcode/utility/transformmatrix.h
@@ -0,0 +1,247 @@
+#include "precompiled/PCH.h"
+
+/*===========================================================================
+ transformmatrix.hpp
+ Created: October 16, 2000
+ Auuthor: Bryan Brandt
+
+ Copyright (c) 2000 Radical Entertainment, Inc.
+ All rights reserved.
+===========================================================================*/
+#ifndef _TRANSFORMMATRIX_HPP
+#define _TRANSFORMMATRIX_HPP
+
+#ifdef WORLD_BUILDER
+#include "main/toolhack.h"
+#endif
+#include <toollib.hpp>
+
+
+class MObject;
+class MDagPath;
+class MFnTransform;
+class MFnIkJoint;
+class MTransformationMatrix;
+
+
+class TransformMatrix
+{
+public:
+
+ enum RotateOrder
+ {
+ ORDER_XYZ = 0,
+ ORDER_YZX,
+ ORDER_ZXY,
+ ORDER_XZY,
+ ORDER_YXZ,
+ ORDER_ZYX
+ };
+
+ TransformMatrix();
+ TransformMatrix(const MDagPath& dagPath);
+ TransformMatrix(const MTransformationMatrix& xform);
+
+ bool Assign(const MDagPath& dagPath);
+ bool Assign(const MTransformationMatrix& xform);
+
+ void SetScalePivot(float x, float y, float z);
+ void SetScalePivot(const tlPoint& sp);
+ void SetScalePivotX(float x);
+ void SetScalePivotY(float y);
+ void SetScalePivotZ(float z);
+ const tlPoint& GetScalePivot() const
+ { return scalePivot; }
+ float GetScalePivotX() const
+ { return scalePivot.x; }
+ float GetScalePivotY() const
+ { return scalePivot.y; }
+ float GetScalePivotZ() const
+ { return scalePivot.z; }
+
+ void SetScale(float x, float y, float z);
+ void SetScaleX(float x);
+ void SetScaleY(float y);
+ void SetScaleZ(float z);
+ float GetScaleX() const
+ { return scaleX; }
+ float GetScaleY() const
+ { return scaleY; }
+ float GetScaleZ() const
+ { return scaleZ; }
+
+ void SetShear(float xy, float xz, float yz);
+ void SetShearXY(float xy);
+ void SetShearXZ(float xz);
+ void SetShearYZ(float yz);
+ float GetShearXY() const
+ { return shearXY; }
+ float GetShearXZ() const
+ { return shearXZ; }
+ float GetShearYZ() const
+ { return shearYZ; }
+
+ void SetScalePivotTranslate(float x, float y, float z);
+ void SetScalePivotTranslate(const tlPoint& spt);
+ void SetScalePivotTranslateX(float x);
+ void SetScalePivotTranslateY(float y);
+ void SetScalePivotTranslateZ(float z);
+ const tlPoint& GetScalePivotTranslate() const
+ { return scalePivotTranslate; }
+ float GetScalePivotTranslateX() const
+ { return scalePivotTranslate.x; }
+ float GetScalePivotTranslateY() const
+ { return scalePivotTranslate.y; }
+ float GetScalePivotTranslateZ() const
+ { return scalePivotTranslate.z; }
+
+ void SetRotatePivot(float x, float y, float z);
+ void SetRotatePivot(const tlPoint& rp);
+ void SetRotatePivotX(float x);
+ void SetRotatePivotY(float y);
+ void SetRotatePivotZ(float z);
+ const tlPoint& GetRotatePivot() const
+ { return rotatePivot; }
+ float GetRotatePivotX() const
+ { return rotatePivot.x; }
+ float GetRotatePivotY() const
+ { return rotatePivot.y; }
+ float GetRotatePivotZ() const
+ { return rotatePivot.z; }
+
+ void SetRotateAxis(float x, float y, float z);
+ void SetRotateAxisX(float rax);
+ void SetRotateAxisY(float ray);
+ void SetRotateAxisZ(float raz);
+ float GetRotateAxisX() const
+ { return rotateAxisX; }
+ float GetRotateAxisY() const
+ { return rotateAxisY; }
+ float GetRotateAxisZ() const
+ { return rotateAxisZ; }
+
+ void SetRotateOrder(RotateOrder ro);
+ RotateOrder GetRotateOrder() const
+ { return rotateOrder; }
+
+ void SetRotate(float x, float y, float z);
+ void SetRotateX(float x);
+ void SetRotateY(float y);
+ void SetRotateZ(float z);
+ float GetRotateX() const
+ { return rotateX; }
+ float GetRotateY() const
+ { return rotateY; }
+ float GetRotateZ() const
+ { return rotateZ; }
+
+ void SetRotatePivotTranslate(float x, float y, float z);
+ void SetRotatePivotTranslate(const tlPoint& rpt);
+ void SetRotatePivotTranslateX(float x);
+ void SetRotatePivotTranslateY(float y);
+ void SetRotatePivotTranslateZ(float z);
+ const tlPoint& GetRotatePivotTranslate() const
+ { return rotatePivotTranslate; }
+ float GetRotatePivotTranslateX() const
+ { return rotatePivotTranslate.x; }
+ float GetRotatePivotTranslateY() const
+ { return rotatePivotTranslate.y; }
+ float GetRotatePivotTranslateZ() const
+ { return rotatePivotTranslate.z; }
+
+ void SetJointOrient(float x, float y, float z);
+ void SetJointOrientX(float x);
+ void SetJointOrientY(float y);
+ void SetJointOrientZ(float z);
+ float GetJointOrientX() const
+ { return jointOrientX; }
+ float GetJointOrientY() const
+ { return jointOrientY; }
+ float GetJointOrientZ() const
+ { return jointOrientZ; }
+
+ void SetInverseScale(float x, float y, float z);
+ void SetInverseScaleX(float x);
+ void SetInverseScaleY(float y);
+ void SetInverseScaleZ(float z);
+ float GetInverseScaleX() const
+ { return inverseScaleX; }
+ float GetInverseScaleY() const
+ { return inverseScaleY; }
+ float GetInverseScaleZ() const
+ { return inverseScaleZ; }
+
+ void SetTranslate(float x, float y, float z);
+ void SetTranslate(const tlPoint& t);
+ void SetTranslateX(float x);
+ void SetTranslateY(float y);
+ void SetTranslateZ(float z);
+ const tlPoint& GetTranslate() const
+ { return translate; }
+ float GetTranslateX() const
+ { return translate.x; }
+ float GetTranslateY() const
+ { return translate.y; }
+ float GetTranslateZ() const
+ { return translate.z; }
+
+ void SetScaleMatrixIdentity();
+ void SetHierarchyMatrixIdentity();
+ void SetIdentity();
+
+ // these are the outputs of this class:
+ // scale matrix - to be baked into the mesh
+ // hierarchy matrix - stored in the skeleton
+ const tlMatrix& GetScaleMatrix() const;
+ const tlMatrix& GetHierarchyMatrix() const;
+
+ // routines for extracting the above matrices,
+ // except with an option to change coordinate systems
+ //
+ void GetScaleMatrixLHS(tlMatrix& matrix) const;
+ void GetHierarchyMatrixLHS(tlMatrix& matrix) const;
+ void GetScaleMatrixRHS(tlMatrix& matrix) const;
+ void GetHierarchyMatrixRHS(tlMatrix& matrix) const;
+
+private:
+
+ bool AssignJoint(MDagPath& dagPath, MObject& jointNode);
+
+ void ComputeScaleMatrix();
+ void ComputeHierarchyMatrix();
+
+ tlPoint scalePivot;
+ float scaleX;
+ float scaleY;
+ float scaleZ;
+ float shearXY;
+ float shearXZ;
+ float shearYZ;
+ tlPoint scalePivotTranslate;
+ tlPoint rotatePivot;
+ float rotateAxisX;
+ float rotateAxisY;
+ float rotateAxisZ;
+ RotateOrder rotateOrder;
+ float rotateX;
+ float rotateY;
+ float rotateZ;
+ tlPoint rotatePivotTranslate;
+ float jointOrientX;
+ float jointOrientY;
+ float jointOrientZ;
+ float inverseScaleX;
+ float inverseScaleY;
+ float inverseScaleZ;
+ tlPoint translate;
+
+ bool scaleDirty;
+ bool hierarchyDirty;
+
+ tlMatrix scaleMatrix;
+ tlMatrix hierarchyMatrix;
+};
+
+
+#endif // _TRANSFORMMATRIX_HPP
+
diff --git a/tools/globalcode/utility/util.c b/tools/globalcode/utility/util.c
new file mode 100644
index 0000000..79764df
--- /dev/null
+++ b/tools/globalcode/utility/util.c
@@ -0,0 +1,724 @@
+/*-----------------------------------------------------------------------------
+** Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+**
+** winutil.h
+**
+** Description: A set of utilities which are specific to the windows development
+** environment.
+**
+** Modification History:
+** + Created Aug 03, 2001 -- bkusy
+**---------------------------------------------------------------------------*/
+
+/*----------------------------------------
+** System Includes
+**--------------------------------------*/
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+/*----------------------------------------
+** Project Includes
+**--------------------------------------*/
+#include "util.h"
+
+/*----------------------------------------
+** Constants
+**--------------------------------------*/
+#define BUFFER_SIZE 512
+
+/*----------------------------------------
+** Globals
+**--------------------------------------*/
+char* util_optarg;
+int util_optind;
+int util_opterr = 1;
+int util_optopt;
+
+
+/*-----------------------------------------------------------------------------
+** u t i l _ b a s e n a m e
+**
+** Synopsis: Determine the basename in a file path. ( eg/ would return
+** "newfile.c" from the path "/usr/home/newfile.c".
+**
+** Parameters: buffer - buffer to receive basename.
+** size - size of buffer.
+** path - path to determine basename from.
+**
+** Returns: non-zero if successful, 0 if buffer is too small.
+**
+** Constraints: path must use '/' and not '\' as directory separators.
+**
+**---------------------------------------------------------------------------*/
+int util_basename( char* buffer, int size, const char* path )
+{
+ char* d;
+ char* n;
+ char* e;
+ int length;
+ int result = 0;
+
+ assert( buffer );
+
+ util_decomposeFilePath( path, &d, &n, &e );
+
+ length = strlen( n ) + strlen( e ) + 1;
+
+ if ( length < size )
+ {
+ strcpy( buffer, n );
+ strcat( buffer, "." );
+ strcat( buffer, e );
+
+ result = 1;
+ }
+
+ return result;
+}
+/*-----------------------------------------------------------------------------
+** u t i l _ c h a n g e F i l e E x t e n s i o n
+**
+** Synopsis: Changes the file extension in the given buffer to the given
+** given extension.
+**
+** Parameters: buffer - the file path to be modified.
+** ext - the new file extension.
+**
+** Returns: NOTHING
+**
+** Constraints: If the original file path does not have an extension, as
+** identified by the presence of a "." character, no change will
+** take place.
+** If the new extension is longer than the old extension, no
+** change will take place.
+**
+**---------------------------------------------------------------------------*/
+void util_changeFileExtension( char* buffer, const char* ext )
+{
+ char* oldExt = 0;
+
+ assert( buffer );
+ assert( ext );
+
+ oldExt = (char*)(util_rindex( buffer, '.' ));
+
+ if ( oldExt )
+ {
+ oldExt++;
+
+ if ( strlen( oldExt ) <= strlen( ext ) )
+ {
+ strcpy( oldExt, ext );
+ }
+ }
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ d e c o m p o s e F i l e P a t h
+**
+** Synopsis: Decompose a file path into its directory, filename and extension.
+**
+** Parameters: path - the path to decompose.
+** dir - a pointer which will be set to the start of the directory.
+** name - a pointer which will be set to the start of the name.
+** ext - a pointer which will be set to the start of the extension.
+**
+** Returns: NOTHING
+**
+** Constraints: path must use '/' and not '\' as directory separators. The pointers
+** returned in dir, name, and ext are only valid until the next call
+** to util_DecomposePath().
+**
+**---------------------------------------------------------------------------*/
+void util_decomposeFilePath( const char* path, char** dir, char** name, char** ext )
+{
+ static char buffer[ BUFFER_SIZE + 1 ];
+ strncpy( buffer, path, BUFFER_SIZE );
+
+ *ext = strrchr( buffer, '.' );
+ if ( *ext )
+ {
+ /*
+ * Remove the extension by replacing '.' with a NULL character.
+ */
+ **ext = '\0';
+
+ /*
+ * The extension will be in the next position.
+ */
+ (*ext)++;
+ }
+
+ *name = strrchr( buffer, '/' );
+ if ( *name )
+ {
+ /*
+ * Remove the name by replacing the last '/' with a NULL character.
+ */
+ **name = '\0';
+
+ /*
+ * The name will be in the next position.
+ */
+ (*name)++;
+
+ /*
+ * Set dir to the start of the string and we are done.
+ */
+ *dir = buffer;
+ }
+ else
+ {
+ /*
+ * Name must extend to the beginning of the path. Set the name pointer
+ * accordingly and set dir to null.
+ */
+ *name = buffer;
+ *dir = 0;
+ }
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ d i r n a m e
+**
+** Synopsis: Determine the directory in a file path.
+**
+** Parameters: buffer - buffer to recieve directory.
+** size - size of buffer.
+** path - the path to retrieve the directory from.
+**
+** Returns: non-zero if successful, zero if buffer is too small to receive
+** the directory.
+**
+** Constraints: path must use '/' and not '\' as directory separators.
+**
+**---------------------------------------------------------------------------*/
+int util_dirname( char* buffer, int size, const char* path )
+{
+ char* d;
+ char* n;
+ char* e;
+ int length;
+ int result = 0;
+
+ util_decomposeFilePath( path, &d, &n, &e );
+
+ length = strlen( d );
+ if ( length < size )
+ {
+ strcpy( buffer, d );
+ result = 1;
+ }
+
+ return result;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ f i l e E x i s t s
+**
+** Synopsis: Determines if the give file exists.
+**
+** Parameters: filename - the name of the file to check for existence.
+**
+** Returns: 0 if file does not exist, non-zero otherwise.
+**
+** Constraints:
+**
+**---------------------------------------------------------------------------*/
+int util_fileExists( const char* filename )
+{
+ FILE *fp;
+
+ assert( filename );
+
+ fp = fopen( filename, "r" );
+
+ if ( fp )
+ {
+ fclose( fp );
+ return 1;
+ }
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ g e t o p t _ i n i t
+**
+** Synopsis: Initializes the getopt parser.
+**
+** Parameters: NONE
+**
+** Returns: NOTHING
+**
+** Constraints: NONE
+**
+** Author: Angus Mackay
+**
+**---------------------------------------------------------------------------*/
+void util_getopt_init()
+{
+ util_optind = 1;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ g e t o p t
+**
+** Synopsis: Used to parse command line arguments based on a specified
+** syntax. The argument for the current option is stored in
+** the global variable "util_optarg".
+**
+** Parameters: argc - the number of arguments in the array.
+** argv - the argumnet array.
+** opts - option specifier string. Options can be of two forms:
+** boolean flags ( its either there or it isn't ) and
+** flag value pairs in which a flag is always followed
+** by some value. Options which require an argument
+** must be followed by a ":" in the option specifier
+** string. So for a command which can have two boolean
+** flags, "h" and "i", and two argument flags, "t" and
+** "u", the following option specifier string would be
+** used: "hit:u:".
+**
+** Returns: the option character found, or -1 if no more option
+** characters.
+**
+** Constraints: NONE
+**
+** Author: Angus Mackay
+**
+**---------------------------------------------------------------------------*/
+int util_getopt( int argc, char* const* argv, const char* opts )
+{
+ static int init_done = 0;
+ static int suboptionpos = 1;
+
+ if(!init_done) { util_getopt_init(); init_done = 1; }
+
+ util_optarg = NULL;
+
+ if(util_optind == argc)
+ {
+ /* we are done */
+ return(-1);
+ }
+
+ if(argv[util_optind][0] == '-')
+ {
+ char *argp;
+
+ /* test for end of arg marker */
+ if(argv[util_optind][1] == '-' && argv[util_optind][2] == '\0')
+ {
+ suboptionpos = 1;
+ util_optind++;
+ return(-1);
+ }
+
+ for(argp=&(argv[util_optind][suboptionpos]); *argp != '\0'; argp++)
+ {
+ char *optp;
+ int numcolon = 0;
+ char *p;
+
+ if((optp=strchr(opts, *argp)) == NULL)
+ {
+ if(util_opterr != 0)
+ {
+ fprintf(stderr, "%s: illegal option -- %c\n", argv[0], *argp);
+ }
+ util_optopt = *argp;
+ suboptionpos++;
+ if(argv[util_optind][suboptionpos] == '\0')
+ {
+ suboptionpos = 1;
+ util_optind++;
+ }
+ return('?');
+ }
+
+ /* zero, one or two colons? */
+ for(p=(optp+1); *p == ':'; p++) { numcolon++; }
+ switch(numcolon)
+ {
+ /* no argument */
+ case 0:
+ suboptionpos++;
+ if(argv[util_optind][suboptionpos] == '\0')
+ {
+ suboptionpos = 1;
+ util_optind++;
+ }
+ return(*optp);
+ break;
+
+ /* manditory argument */
+ case 1:
+ /* the argument is seperated by a space */
+ if(argp[1] == '\0')
+ {
+ /* ther are more args */
+ if(util_optind+1 == argc)
+ {
+ suboptionpos++;
+ if(argv[util_optind][suboptionpos] == '\0')
+ {
+ suboptionpos = 1;
+ util_optind++;
+ }
+ if(util_opterr != 0)
+ {
+ fprintf(stderr, "%s: option requires an argument -- %c\n",
+ argv[0], *argp);
+ }
+ util_optopt = *argp;
+ return('?');
+ }
+
+ util_optind++;
+ suboptionpos = 1;
+ util_optarg = argv[util_optind];
+ util_optind++;
+ return(*optp);
+ }
+
+ /* the argument is attached */
+ util_optarg = argp+1;
+ suboptionpos = 1;
+ util_optind++;
+ return(*optp);
+ break;
+
+ /* optional argument */
+ case 2:
+ /* the argument is seperated by a space */
+ if(argp[1] == '\0')
+ {
+ util_optind++;
+ suboptionpos = 1;
+ util_optarg = NULL;
+ return(*optp);
+ }
+
+ /* the argument is attached */
+ suboptionpos = 1;
+ util_optarg = argp+1;
+ util_optind++;
+ return(*optp);
+ break;
+
+ /* a case of too many colons */
+ default:
+ suboptionpos++;
+ if(argv[util_optind][suboptionpos] == '\0')
+ {
+ suboptionpos = 1;
+ util_optind++;
+ }
+ util_optopt = '?';
+ return('?');
+ break;
+ }
+ }
+ suboptionpos = 1;
+ }
+ else
+ {
+ /* we are done */
+ return(-1);
+ }
+
+ /* we shouldn't get here */
+ return(-1);
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ i n d e x
+**
+** Synopsis: returns a pointer to the first occurrence of the character
+** "c" in the string "s".
+**
+** Parameters: s - the string to search.
+** c - the character to search for.
+**
+** Returns: a pointer to the matched character, or NULL if the character
+** is not found.
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+const char* util_index( const char* s, int c )
+{
+ const char* result = 0;
+ const char* sp = 0;
+
+ assert( s );
+
+ sp = s;
+
+ while ( *sp != '\0' )
+ {
+ if ( *sp == c )
+ {
+ result = sp;
+ break;
+ }
+
+ sp++;
+ }
+
+ return result;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ p o s i x F i l e P a t h
+**
+** Synopsis: Ensures the given path uses POSIX style slashes.
+**
+** Parameters: path - the path to "posixfy".
+**
+** Returns: NOTHING
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+void util_posixFilePath( char* path )
+{
+ char* pp = path;
+ while ( *pp )
+ {
+ if ( '\\' == *pp ) *pp = '/';
+ pp++;
+ }
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ r e p l a c e C h a r a c t e r s
+**
+** Synopsis: Replace characters in a string.
+**
+** Parameters: find - the character to find.
+** replace - the charcter to replace the found character with.
+** string - the string within which to do the find/replace.
+**
+** Returns: NOTHING
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+void util_replaceCharacters( char find, char replace, char* string )
+{
+ char* p = 0;
+
+ if ( string )
+ {
+ while ( p = strchr( string, find ) )
+ {
+ *p = replace;
+ }
+ }
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ r e v e r s e S p a n
+**
+** Synopsis: Finds the suffix which is composed completely of characters in
+** in the spanSet in the specified string.
+**
+** Example: end = util_ReverseSpan( "name123", "312" );
+** *
+** * end now points to "123".
+** *
+** end = util_ReverseSpan( "name123", "21" );
+** *
+** * end would point to NULL because the character "3" is not
+** * in the spanSet.
+**
+** Parameters: string - the string to be searched.
+** spanSet - a string of characters that can be in the suffix.
+**
+** Returns: a pointer to the suffix string, or NULL if there is no
+** suffix.
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+const char* util_reverseSpan( const char* string, const char* spanSet )
+{
+ const char* sp = 0;
+ const char* next_sp = 0;
+ int isEndSpan = 0;
+
+ /*
+ * Set a pointer to the end of the string to be searched.
+ */
+ sp = string + strlen( string );
+
+ /*
+ * If the string passed in is empty, we are done.
+ */
+ if ( sp == string ) return sp;
+
+ while( sp > string && !isEndSpan )
+ {
+ next_sp = sp - 1;
+
+ if ( strchr( spanSet, *next_sp ) )
+ {
+ sp--;
+ }
+ else
+ {
+ isEndSpan = 1;
+ }
+ }
+
+ return sp;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ r i n d e x
+**
+** Synopsis: returns a pointer to the last occurrence of the character
+** "c" in the string "s".
+**
+** Parameters: s - the string to search.
+** c - the character to search for.
+**
+** Returns: a pointer to the matched character, or NULL if the character
+** is not found.
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+const char* util_rindex( const char* s, int c )
+{
+ const char* result = 0;
+ const char* sp = 0;
+ int length;
+
+ assert( s );
+
+ length = strlen(s);
+ sp = s + length;
+
+ if ( length > 0 )
+ {
+ while ( sp != s )
+ {
+ sp--;
+
+ if ( *sp == c )
+ {
+ result = sp;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+/*-----------------------------------------------------------------------------
+** u t i l _ s u b s t i t u t e
+**
+** Synopsis: Substitue strings matchin "find" with "replace" in "string".
+** If this cannot be done without exceeding the size of "string"
+** An error will be returned and "string" will be as it was
+** when util_substitute was originally called.
+**
+** Parameters: find - the substring to find.
+** replace - the substring to insert in place of found strings.
+** string - the string to operate on.
+** stringSize - the maximum size the string can grow to.
+** firstOnly - flag. If non-zero only the first occurence of
+** "find" will be replaced. If zero, all occurences
+** will be replaced.
+**
+** Returns: 0 on error, the new size of the string on success.
+**
+** Constraints: NONE
+**
+**---------------------------------------------------------------------------*/
+int util_substitute( const char* find,
+ const char* replace,
+ char* string,
+ int stringSize,
+ int firstOnly
+ )
+{
+ char buffer[ BUFFER_SIZE + 1 ];
+ char* sp;
+ char* bp;
+ char* p;
+ int findLength = strlen( find );
+ int replaceLength = strlen( replace );
+ int count = 0;
+ int total = 0;
+ int tooBig = 0;
+ int status = 0;
+
+ assert( stringSize <= BUFFER_SIZE );
+
+ bp = buffer;
+ sp = string;
+ while( !tooBig && (p = strstr( sp, find )) )
+ {
+ /*
+ * Determine the number of characters since last find.
+ * Add to total characters.
+ * If total characters exceeds "stringSize" then break and return
+ * error. Otherwise copy characters since last find to buffer.
+ */
+ count = p - sp;
+ total += count;
+ if ( total >= stringSize )
+ {
+ tooBig = 1;
+ continue;
+ }
+ strncpy( bp, sp, count );
+ bp += count;
+ *bp = '\0';
+
+ /*
+ * If adding the replace string causes buffer to exceed "stringSize"
+ * break and return error. Otherwise copy the replace string into
+ * buffer.
+ */
+ total += replaceLength;
+ if ( total >= stringSize )
+ {
+ tooBig = 1;
+ continue;
+ }
+ strcpy( bp, replace );
+ bp += replaceLength;
+
+ /*
+ * Update the position of sp so that it points to next character
+ * after the last found "find" string.
+ */
+ sp += count + findLength;
+ }
+
+ if ( !tooBig )
+ {
+ /*
+ * Attempt to copy the remaining portion of string into buffer.
+ * If successful, copy buffer into string and return success.
+ * Otherwise return error.
+ */
+ total += strlen( sp );
+ if ( total < stringSize )
+ {
+ strcpy( bp, sp );
+ strcpy( string, buffer );
+ status = strlen( string );
+ }
+ }
+
+ return status;
+}
+
diff --git a/tools/globalcode/utility/util.h b/tools/globalcode/utility/util.h
new file mode 100644
index 0000000..33a6d84
--- /dev/null
+++ b/tools/globalcode/utility/util.h
@@ -0,0 +1,88 @@
+#ifndef _UTIL_H
+#define _UTIL_H
+/*-----------------------------------------------------------------------------
+** Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+**
+** util.h
+**
+** Description: A set of utilities for various things.
+**
+** Modification History:
+** + Created Aug 03, 2001 -- bkusy
+**---------------------------------------------------------------------------*/
+
+/*----------------------------------------
+** System Includes
+**--------------------------------------*/
+
+/*----------------------------------------
+** Project Includes
+**--------------------------------------*/
+
+/*----------------------------------------
+** Forward References
+**--------------------------------------*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*----------------------------------------
+** Globals
+**--------------------------------------*/
+extern char* util_optarg;
+extern int util_optind;
+extern int util_opterr;
+extern int util_optopt;
+
+/*----------------------------------------
+** Macros
+**--------------------------------------*/
+
+
+/*----------------------------------------
+** Functions
+**--------------------------------------*/
+
+extern int util_basename( char* buffer, int size, const char* path );
+
+extern void util_changeFileExtension( char* buffer, const char* ext );
+
+extern void util_decomposeFilePath( const char* path,
+ char** dir,
+ char** name,
+ char** ext
+ );
+
+extern int util_dirname( char* buffer, int size, const char* path );
+
+extern int util_fileExists( const char* filename );
+
+extern void util_getopt_init();
+
+extern int util_getopt( int argc, char* const* argv, const char *opts );
+
+extern const char* util_index( const char* s, int c );
+
+extern void util_posixFilePath( char* path );
+
+extern void util_replaceCharacters( char find,
+ char replace,
+ char* string
+ );
+
+extern const char* util_reverseSpan( const char* string, const char* spanSet );
+
+extern const char* util_rindex( const char* s, int c );
+
+extern int util_substitute( const char* find,
+ const char* replace,
+ char* string,
+ int stringSize,
+ int firstOnly
+ );
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/globalcode/utility/winutil.c b/tools/globalcode/utility/winutil.c
new file mode 100644
index 0000000..9493c8b
--- /dev/null
+++ b/tools/globalcode/utility/winutil.c
@@ -0,0 +1,69 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// winutil.h
+//
+// Description: A set of utilities which are specific to the windows development
+// environment.
+//
+// Modification History:
+// + Created Aug 03, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <windows.h>
+#include <stdio.h>
+#include <assert.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include "winutil.h"
+
+//----------------------------------------
+// Constants
+//----------------------------------------
+#define BUFFER_SIZE 256
+
+
+//-----------------------------------------------------------------------------
+// w i n u t i l _ V e r s i o n I n f o
+//
+// Synopsis: Retrieve a version info string for the specified module.
+//
+// Parameters: name - the module to retrieve the information for.
+// info - a reference parameter to receive the info string.
+// info_size - the size of the buffer pointed to by info.
+//
+// Returns: the length of the string returned in info.
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+int winutil_VersionInfo( const char* name, char* info, int info_size )
+{
+ char buffer[ BUFFER_SIZE + 1 ];
+ char* data = 0;
+ DWORD data_length, unused;
+ VS_FIXEDFILEINFO* fixed_file_info;
+ UINT fixed_file_info_length;
+ int major, minor;
+ int result;
+
+ GetModuleFileName( GetModuleHandle( name ), buffer, BUFFER_SIZE );
+ data_length = GetFileVersionInfoSize( buffer, &unused );
+ data = calloc( data_length, sizeof( char ) );
+ assert( data );
+ GetFileVersionInfo( buffer, unused, data_length, data );
+ VerQueryValue( data, "\\", (void**)(&fixed_file_info), &fixed_file_info_length );
+
+ major = fixed_file_info->dwFileVersionMS >> 16;
+ minor = fixed_file_info->dwFileVersionMS & 0x0ffff;
+ result = _snprintf( info, info_size, "%d.%d", major, minor );
+ return result;
+}
+
+
+
diff --git a/tools/globalcode/utility/winutil.h b/tools/globalcode/utility/winutil.h
new file mode 100644
index 0000000..bfe19ec
--- /dev/null
+++ b/tools/globalcode/utility/winutil.h
@@ -0,0 +1,37 @@
+#ifndef _WINUTIL_H
+#define _WINUTIL_H
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// winutil.h
+//
+// Description: A set of utilities which are specific to the windows development
+// environment.
+//
+// Modification History:
+// + Created Aug 03, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int winutil_VersionInfo( const char* name, char* info, int info_size );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/objectsnapper/build/Debug/objectsnapper.log b/tools/objectsnapper/build/Debug/objectsnapper.log
new file mode 100644
index 0000000..d96726d
--- /dev/null
+++ b/tools/objectsnapper/build/Debug/objectsnapper.log
@@ -0,0 +1,8 @@
+Build started 11/7/2015 5:44:23 PM.
+ 1>Project "G:\Code\Simpsons Hit&Run\tools\objectsnapper\build\objectsnapper.vcxproj" on node 6 (Build target(s)).
+ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(369,5): error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.
+ 1>Done Building Project "G:\Code\Simpsons Hit&Run\tools\objectsnapper\build\objectsnapper.vcxproj" (Build target(s)) -- FAILED.
+
+Build FAILED.
+
+Time Elapsed 00:00:00.66
diff --git a/tools/objectsnapper/build/objectsnapper.dsp b/tools/objectsnapper/build/objectsnapper.dsp
new file mode 100644
index 0000000..8506a0f
--- /dev/null
+++ b/tools/objectsnapper/build/objectsnapper.dsp
@@ -0,0 +1,295 @@
+# Microsoft Developer Studio Project File - Name="objectsnapper" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=objectsnapper - Win32 Tools Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "objectsnapper.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "objectsnapper.mak" CFG="objectsnapper - Win32 Tools Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "objectsnapper - Win32 Tools Release" (based on "Win32 (x86) Application")
+!MESSAGE "objectsnapper - Win32 Tools Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "objectsnapper"
+# PROP Scc_LocalPath "."
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "objectsnapper - Win32 Tools Release"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "objectsnapper___Win32_Tools_Release"
+# PROP BASE Intermediate_Dir "objectsnapper___Win32_Tools_Release"
+# PROP BASE Ignore_Export_Lib 1
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\code\\" /I "C:\AW\Maya4.0\include" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /D "_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /D "_WIN32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_RELEASE" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release\objectsnapper.mll" /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release\objectsnapper.mll" /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy trackeditor.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Release\objectsnapper.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\objectsnapper.mll copy .\Release\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapper.mll
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "objectsnapper - Win32 Tools Debug"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "objectsnapper___Win32_Tools_Debug"
+# PROP BASE Intermediate_Dir "objectsnapper___Win32_Tools_Debug"
+# PROP BASE Ignore_Export_Lib 1
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\code\\" /I "C:\AW\Maya4.0\include" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /FR /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\objectsnapper.mll" /pdbtype:sept /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\objectsnapper.mll" /pdbtype:sept /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy trackeditor.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Debug\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapperd.mll
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "objectsnapper - Win32 Tools Release"
+# Name "objectsnapper - Win32 Tools Debug"
+# Begin Group "main"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\main\mayaincludes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.cpp
+# ADD CPP /YX"precompiled\PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\stdafx.h
+# End Source File
+# End Group
+# Begin Group "mel scripts"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\scripts\os_cleanup.mel
+
+!IF "$(CFG)" == "objectsnapper - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\os_cleanup.mel
+InputName=os_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "objectsnapper - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\os_cleanup.mel
+InputName=os_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\os_main.mel
+
+!IF "$(CFG)" == "objectsnapper - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\os_main.mel
+InputName=os_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "objectsnapper - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\os_main.mel
+InputName=os_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "commands"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\commands\snapselected.cpp
+# ADD CPP /YX"precompiled\PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\snapselected.h
+# End Source File
+# End Group
+# Begin Group "utility"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.cpp
+# ADD CPP /YX"precompiled\PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.c
+# ADD CPP /YX"precompiled\PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\winutil.c
+# ADD CPP /YX"precompiled\PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\winutil.h
+# End Source File
+# End Group
+# Begin Group "precompiled header"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.cpp
+# ADD CPP /Yc"PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/objectsnapper/build/objectsnapper.vcproj b/tools/objectsnapper/build/objectsnapper.vcproj
new file mode 100644
index 0000000..26a8685
--- /dev/null
+++ b/tools/objectsnapper/build/objectsnapper.vcproj
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="objectsnapper"
+ SccProjectName="Perforce Project"
+ SccAuxPath=""
+ SccLocalPath="."
+ SccProvider="MSSCCI:Perforce SCM"
+ Keyword="MFCProj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Tools Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ OptimizeForWindowsApplication="TRUE"
+ AdditionalIncludeDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\include\,..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath"
+ PreprocessorDefinitions="_WIN32;NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_RELEASE"
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Release/objectsnapper.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalOptions="/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaUI.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaAnim.lib"
+ OutputFile="Release\objectsnapper.mll"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ IgnoreDefaultLibraryNames="LIBC.lib;LIBCMT.lib;LIBCPMT.lib"
+ ProgramDatabaseFile=".\Release/objectsnapper.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Release/objectsnapper.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/objectsnapper.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy trackeditor.mll to Distribution and Maya dir."
+ CommandLine="copy .\Release\objectsnapper.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\objectsnapper.mll
+copy .\Release\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapper.mll
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;NDEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Tools Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath,..\..\..\game\libs\pure3d\sdks\Maya4_0\include\"
+ PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Debug/objectsnapper.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib"
+ OutputFile="Debug\objectsnapper.mll"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/objectsnapper.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Debug/objectsnapper.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/objectsnapper.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy trackeditor.mll to Distribution and Maya dir."
+ CommandLine="copy .\Debug\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapperd.mll"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;_DEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="main"
+ Filter="">
+ <File
+ RelativePath="..\code\main\mayaincludes.h">
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.h">
+ </File>
+ <File
+ RelativePath="..\code\main\stdafx.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="mel scripts"
+ Filter="">
+ <File
+ RelativePath="..\code\scripts\os_cleanup.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\os_main.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="commands"
+ Filter="">
+ <File
+ RelativePath="..\code\commands\snapselected.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\commands\snapselected.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="utility"
+ Filter="">
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.c">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\winutil.c">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\winutil.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="precompiled header"
+ Filter="">
+ <File
+ RelativePath="..\code\precompiled\PCH.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\precompiled\PCH.h">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/objectsnapper/build/objectsnapper.vcxproj b/tools/objectsnapper/build/objectsnapper.vcxproj
new file mode 100644
index 0000000..f174963
--- /dev/null
+++ b/tools/objectsnapper/build/objectsnapper.vcxproj
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Tools Debug|Win32">
+ <Configuration>Tools Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Tools Release|Win32">
+ <Configuration>Tools Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath />
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>MFCProj</Keyword>
+ <ProjectGuid>{278283D0-FEC2-4B06-8AED-8DDB745215B4}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <OutDir>.\Release\</OutDir>
+ <IntDir>.\Release\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <OutDir>.\Debug\</OutDir>
+ <IntDir>.\Debug\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WIN32;NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_RELEASE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Release/objectsnapper.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaUI.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaAnim.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Release\objectsnapper.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>LIBC.lib;LIBCMT.lib;LIBCPMT.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>.\Release/objectsnapper.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>.\Release/objectsnapper.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/objectsnapper.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy trackeditor.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Release\objectsnapper.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\objectsnapper.mll
+copy .\Release\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapper.mll
+</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Debug/objectsnapper.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+ <ObjectFileName>.\Debug/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaUI.lib;OpenMayaAnim.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Debug\objectsnapper.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Debug/objectsnapper.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>.\Debug/objectsnapper.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/objectsnapper.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy trackeditor.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Debug\objectsnapper.mll C:\AW\Maya4.0\bin\plug-ins\objectsnapperd.mll</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\mayaincludes.h" />
+ <ClInclude Include="..\code\main\pluginMain.h" />
+ <ClInclude Include="..\code\main\stdafx.h" />
+ <ClInclude Include="..\code\commands\snapselected.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h" />
+ <ClInclude Include="..\..\globalcode\utility\MUI.h" />
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h" />
+ <ClInclude Include="..\..\globalcode\utility\util.h" />
+ <ClInclude Include="..\..\globalcode\utility\winutil.h" />
+ <ClInclude Include="..\code\precompiled\PCH.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\snapselected.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\util.c">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\winutil.c">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\os_cleanup.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\os_main.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\game\libs\pure3d\toollib\toollib_extras.vcxproj">
+ <Project>{cdb92e4a-1e5d-49a8-8153-34264b3fef29}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/tools/objectsnapper/build/objectsnapper.vcxproj.filters b/tools/objectsnapper/build/objectsnapper.vcxproj.filters
new file mode 100644
index 0000000..a5e3f99
--- /dev/null
+++ b/tools/objectsnapper/build/objectsnapper.vcxproj.filters
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="main">
+ <UniqueIdentifier>{63629421-51a6-4cb5-92ec-c9b7b0171f2c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="mel scripts">
+ <UniqueIdentifier>{6b7682fb-ce25-4823-b2de-c37177e8f8ab}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="commands">
+ <UniqueIdentifier>{a320b2f6-fc00-42dd-8379-fbfa8f7e1c5a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="utility">
+ <UniqueIdentifier>{ad0a5a1d-fa73-4b0a-995e-ad7c04385634}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="precompiled header">
+ <UniqueIdentifier>{ceba181d-db94-4612-8b9c-7698e86ea53e}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\mayaincludes.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\pluginMain.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\stdafx.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\snapselected.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MUI.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\util.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\winutil.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\precompiled\PCH.h">
+ <Filter>precompiled header</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp">
+ <Filter>main</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\snapselected.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\util.c">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\winutil.c">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <Filter>precompiled header</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\os_cleanup.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\os_main.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tools/objectsnapper/code/commands/snapselected.cpp b/tools/objectsnapper/code/commands/snapselected.cpp
new file mode 100644
index 0000000..e6ab048
--- /dev/null
+++ b/tools/objectsnapper/code/commands/snapselected.cpp
@@ -0,0 +1,435 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File:
+//
+// Description: Implement SnapSelectedCmd
+//
+// History: 18/03/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+// Foundation Tech
+
+//========================================
+// Project Includes
+//========================================
+#include "snapselected.h"
+#include "utility/MUI.h"
+#include "utility/mext.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+
+const char* SnapSelectedCmd::stringId = "OS_SnapSelected";
+const double OSScale = 100.0;
+
+enum SnapType
+{
+ ALL,
+ SINGLE,
+ TREELINE
+};
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// SnapSelectedCmd::SnapSelectedCmd
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SnapSelectedCmd::SnapSelectedCmd()
+{
+ mObjDagPaths.clear();
+ mNewPositions.clear();
+ mOldPositions.clear();
+}
+
+//==============================================================================
+// SnapSelectedCmd::~SnapSelectedCmd
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SnapSelectedCmd::~SnapSelectedCmd()
+{
+}
+
+//==============================================================================
+// SnapSelectedCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* SnapSelectedCmd::creator()
+{
+ return new SnapSelectedCmd();
+}
+
+//==============================================================================
+// SnapSelectedCmd::doit
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus SnapSelectedCmd::doIt( const MArgList& args )
+{
+ if ( !MUI::ConfirmDialog( "Are you sure you want to snap these objects?\nYou can not UNDO this command." ) == MUI::YES )
+ {
+ //quit.
+ return MStatus::kSuccess;
+ }
+
+ assert( args.length() == 2 );
+
+ double OFFSET = 0;
+ int snapType = ALL;
+
+ args.get( 0, OFFSET );
+ args.get( 1, snapType );
+
+ OFFSET *= OSScale;
+
+ MSelectionList list;
+ MGlobal::getActiveSelectionList( list );
+
+ MItSelectionList i( list );
+
+ MFnDagNode fnDagNode;
+ MDagPath dagPath;
+ MItDag itDag;
+ MObject obj;
+ MDagPath objDagPath;
+ MObject childObj;
+
+ //For all selected objects.
+ for ( ; !i.isDone(); i.next() )
+ {
+ i.getDagPath( dagPath );
+
+ itDag.reset( dagPath, MItDag::kBreadthFirst, MFn::kTransform );
+
+ for ( ; !itDag.isDone() && itDag.depth() < 2; itDag.next() )
+ {
+ obj = itDag.item();
+ fnDagNode.setObject( obj );
+
+ const char* objName = fnDagNode.name().asChar();
+ const char* objTypeName = fnDagNode.typeName().asChar();
+
+ int childCount = fnDagNode.childCount();
+
+ int whichChild;
+
+ for ( whichChild = 0; whichChild < childCount; ++whichChild )
+ {
+ childObj = fnDagNode.child( whichChild );
+ fnDagNode.setObject( childObj );
+
+ const char* childObjName = fnDagNode.name().asChar();
+ const char* childObjTypeName = fnDagNode.typeName().asChar();
+
+ //Find a mesh below me and move my pivot to the intersection.
+ itDag.getPath( objDagPath );
+ MFnTransform fnTrans( objDagPath );
+
+ //Get all the child meshes of this obj node to prevent snapping to
+ //something that is part of me.
+
+ MStringArray meshNames;
+
+ GetChildMeshNames( objDagPath, meshNames );
+
+
+ MVector pos = fnTrans.translation( MSpace::kWorld );
+ MPoint rotate = fnTrans.rotatePivot( MSpace::kWorld );
+ MVector rayDir( 0, -1.0, 0 );
+
+ MItDag meshIt( MItDag::kDepthFirst, MFn::kMesh );
+ MDagPath meshDagPath;
+ MPointArray intersectPoints;
+
+ bool found = false;
+
+ for ( ; !meshIt.isDone(); meshIt.next() )
+ {
+ meshIt.getPath( meshDagPath );
+ MFnMesh mesh( meshDagPath );
+
+ const char* meshName = mesh.name().asChar();
+
+ unsigned int i;
+ bool nameFound = false;
+ for ( i = 0; i < meshNames.length(); ++i )
+ {
+ if ( meshNames[i] == mesh.name() )
+ {
+ nameFound = true;
+ break;
+ }
+ }
+
+ if ( nameFound )
+ {
+ continue;
+ }
+
+ if ( snapType == TREELINE )
+ {
+
+ }
+ else
+ {
+ mesh.intersect( rotate, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ if ( intersectPoints.length() > 0 )
+ {
+ MVector diff( intersectPoints[ 0 ] - rotate );
+ diff.y += OFFSET;
+
+ //Prepare the command for the redo it ( which does all the work )
+ mObjDagPaths.append( fnTrans.dagPath() );
+ mNewPositions.append( diff );
+
+ //Save the old position.
+ MVector vector = fnTrans.translation( MSpace::kObject );
+ mOldPositions.append( vector );
+
+// //Move the transform.
+// fnTrans.translateBy( diff, MSpace::kWorld );
+
+ found = true;
+
+ break;
+ }
+ }
+ }
+
+ if ( !found )
+ {
+ //Look up
+ MPoint rotate = fnTrans.rotatePivot( MSpace::kWorld );
+ MVector rayDir( 0, 1.0, 0 );
+
+ MItDag meshIt( MItDag::kDepthFirst, MFn::kMesh );
+ MDagPath meshDagPath;
+ MPointArray intersectPoints;
+
+ for ( ; !meshIt.isDone(); meshIt.next() )
+ {
+ meshIt.getPath( meshDagPath );
+ MFnMesh mesh( meshDagPath );
+
+ const char* meshName = mesh.name().asChar();
+
+ unsigned int i;
+ bool nameFound = false;
+ for ( i = 0; i < meshNames.length(); ++i )
+ {
+ if ( meshNames[i] == mesh.name() )
+ {
+ nameFound = true;
+ break;
+ }
+ }
+
+ if ( nameFound )
+ {
+ continue;
+ }
+
+ if ( snapType == TREELINE )
+ {
+
+ }
+ else
+ {
+ mesh.intersect( rotate, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ if ( intersectPoints.length() > 0 )
+ {
+ MVector diff( intersectPoints[ 0 ] - rotate );
+ diff.y -= OFFSET;
+
+ //Prepare the command for the redo it ( which does all the work )
+ mObjDagPaths.append( fnTrans.dagPath() );
+ mNewPositions.append( diff );
+
+ //Save the old position.
+ MVector vector = fnTrans.translation( MSpace::kObject );
+ mOldPositions.append( vector );
+
+// //Move the transform.
+// fnTrans.translateBy( diff, MSpace::kWorld );
+
+ found = true;
+
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !found )
+ {
+ MString errorMsg( "The object: " );
+ errorMsg += fnTrans.name();
+ errorMsg += MString( " has no mesh below it.\nNo snapping done on it." );
+
+ MUI::InfoDialog( errorMsg.asChar() );
+ }
+ }
+
+ if ( snapType == SINGLE )
+ {
+ //No more iterations.
+ break;
+ }
+ }
+ }
+
+ redoIt();
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// SnapSelectedCmd::undoIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus SnapSelectedCmd::undoIt()
+{
+ unsigned int i;
+ for ( i = 0; i < mObjDagPaths.length(); ++i )
+ {
+ if ( mObjDagPaths[i].isValid() )
+ {
+ //Move this guy to the new position.
+ MFnTransform fnTransform( mObjDagPaths[i] );
+
+ fnTransform.setTranslation( mOldPositions[i], MSpace::kObject );
+ }
+ else
+ {
+ MExt::DisplayError( "Error performing snap due to invalid object or change in heirarchy" );
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// SnapSelectedCmd::redoIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus SnapSelectedCmd::redoIt()
+{
+ unsigned int i;
+ for ( i = 0; i < mObjDagPaths.length(); ++i )
+ {
+ if ( mObjDagPaths[i].isValid() )
+ {
+ //Move this guy to the new position.
+ MFnTransform fnTransform( mObjDagPaths[i] );
+
+ fnTransform.translateBy( mNewPositions[i], MSpace::kWorld );
+ }
+ else
+ {
+ MExt::DisplayError( "Error performing snap due to invalid object or change in heirarchy" );
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// SnapSelectedCmd::isUndoable
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool SnapSelectedCmd::isUndoable() const
+{
+ return true;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// SnapSelectedCmd::GetChildMeshNames
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MDagPath objDagPath, MStringArray& names )
+//
+// Return: void
+//
+//==============================================================================
+void SnapSelectedCmd::GetChildMeshNames( MDagPath objDagPath, MStringArray& names )
+{
+ names.clear();
+
+ MItDag itDag;
+ itDag.reset( objDagPath, MItDag::kDepthFirst, MFn::kMesh );
+
+ for ( ; !itDag.isDone(); itDag.next() )
+ {
+ MDagPath dagPath;
+ itDag.getPath( dagPath );
+ MFnMesh fnMesh( dagPath );
+
+ names.append( fnMesh.name() );
+
+ const char* meshName = fnMesh.name().asChar();
+ }
+
+}
diff --git a/tools/objectsnapper/code/commands/snapselected.h b/tools/objectsnapper/code/commands/snapselected.h
new file mode 100644
index 0000000..55e0f0d
--- /dev/null
+++ b/tools/objectsnapper/code/commands/snapselected.h
@@ -0,0 +1,59 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: snapselectedcmd.h
+//
+// Description: Blahblahblah
+//
+// History: 18/03/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef SNAPSELECTEDCMD_H
+#define SNAPSELECTEDCMD_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "main/mayaincludes.h"
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class SnapSelectedCmd : public MPxCommand
+{
+public:
+ SnapSelectedCmd();
+ virtual ~SnapSelectedCmd();
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+ virtual MStatus undoIt();
+ virtual MStatus redoIt();
+ virtual bool isUndoable() const;
+
+ static const char* stringId;
+
+private:
+
+ MDagPathArray mObjDagPaths;
+ MVectorArray mOldPositions;
+ MVectorArray mNewPositions;
+
+ void GetChildMeshNames( MDagPath objDagPath, MStringArray& names );
+
+ //Prevent wasteful constructor creation.
+SnapSelectedCmd( const SnapSelectedCmd& snapselectedcmd );
+SnapSelectedCmd& operator=( const SnapSelectedCmd& snapselectedcmd );
+};
+
+#endif //SNAPSELECTEDCMD_H
+
diff --git a/tools/objectsnapper/code/main/mayaincludes.h b/tools/objectsnapper/code/main/mayaincludes.h
new file mode 100644
index 0000000..5f91009
--- /dev/null
+++ b/tools/objectsnapper/code/main/mayaincludes.h
@@ -0,0 +1,49 @@
+#include <maya/M3dView.h>
+#include <maya/MArgList.h>
+#include <maya/MCursor.h>
+#include <maya/MDagPath.h>
+#include <maya/MDGMessage.h>
+#include <maya/MDGModifier.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MEulerRotation.h>
+#include <maya/MFnData.h>
+#include <maya/MFnDagNode.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnIkJoint.h>
+#include <maya/MFnIntArrayData.h>
+#include <maya/MFnMatrixData.h>
+#include <maya/MFnMesh.h>
+#include <maya/MFnMessageAttribute.h>
+#include <maya/MFnNumericAttribute.h>
+#include <maya/MFnStringArrayData.h>
+#include <maya/MFnTransform.h>
+#include <maya/MFnTypedAttribute.h>
+#include <maya/MGlobal.h>
+#include <maya/MIntArray.h>
+#include <maya/MItDag.h>
+#include <maya/MItMeshVertex.h>
+#include <maya/MItSelectionList.h>
+#include <maya/MMatrix.h>
+#include <maya/MNodeMessage.h>
+#include <maya/MObject.h>
+#include <maya/MObjectArray.h>
+#include <maya/MPlug.h>
+#include <maya/MPlugArray.h>
+#include <maya/MPoint.h>
+#include <maya/MPointArray.h>
+#include <maya/MPxCommand.h>
+#include <maya/MPxContext.h>
+#include <maya/MPxContextCommand.h>
+#include <maya/MPxLocatorNode.h>
+#include <maya/MQuaternion.h>
+#include <maya/MSelectionList.h>
+#include <maya/MStatus.h>
+#include <maya/MString.h>
+#include <maya/MStringArray.h>
+#include <maya/MTransformationMatrix.h>
+#include <maya/MTypeId.h>
+#include <maya/MUiMessage.h>
+#include <maya/MVector.h>
+
+#include <assert.h> \ No newline at end of file
diff --git a/tools/objectsnapper/code/main/pluginMain.cpp b/tools/objectsnapper/code/main/pluginMain.cpp
new file mode 100644
index 0000000..0e38b04
--- /dev/null
+++ b/tools/objectsnapper/code/main/pluginMain.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright (C) 2002 Radical Entertainment
+//
+// File: pluginMain.cpp
+//
+// Author: Maya SDK Wizard
+//
+#include <maya/MFnPlugin.h>
+
+#include "utility/mayahandles.h"
+
+#include "pluginmain.h"
+#include "commands/snapselected.h"
+
+MStatus initializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is loaded into Maya. It
+// registers all of the services that this plug-in provides with
+// Maya.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+
+ MayaHandles::SetHInstance( (void*)(MhInstPlugin) );
+
+ MFnPlugin plugin( obj, "Radical Entertainment", "4.0.1", "Any");
+
+ // Add plug-in feature registration here
+ //
+
+ //Register Nodes
+
+ //Register Contexts
+
+ //Register Commands
+ REGISTER_COMMAND( plugin, SnapSelectedCmd );
+
+
+ //Run any startup scripts.
+ MGlobal::sourceFile( "os_main.mel" );
+
+ return status;
+}
+
+MStatus uninitializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is unloaded from Maya. It
+// deregisters all of the services that it was providing.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+ MFnPlugin plugin( obj );
+
+ // Add plug-in feature deregistration here
+ //
+
+ //Run any cleanup scripts.
+ MGlobal::sourceFile( "os_cleanup.mel" );
+
+ //Unregister Commands
+
+ //Unregister Contexts
+
+ //Unregister Nodes
+
+ return status;
+}
+
diff --git a/tools/objectsnapper/code/main/pluginMain.h b/tools/objectsnapper/code/main/pluginMain.h
new file mode 100644
index 0000000..502f6fb
--- /dev/null
+++ b/tools/objectsnapper/code/main/pluginMain.h
@@ -0,0 +1,40 @@
+#include "mayaincludes.h"
+
+//----------------------------------------
+// MACROS
+//----------------------------------------
+
+#define REGISTER_COMMAND( p, c ) if ( ! ( ( p ).registerCommand( c##::stringId, \
+ c##::creator ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_CONTEXT( p, c ) if ( ! ( ( p ).registerContextCommand( c##::stringId, \
+ c##Cmd::creator ) \
+ ) \
+ ) return MS::kFailure
+
+
+#define REGISTER_LOCATOR( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize, \
+ MPxNode::kLocatorNode ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_NODE( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize ) \
+ ) \
+ ) return MS::kFailure
+
+#define DEREGISTER_COMMAND( p, c ) ( p ).deregisterCommand( c##::stringId )
+
+#define DEREGISTER_CONTEXT( p, c ) ( p ).deregisterContextCommand( c##::stringId )
+
+//#define DEREGISTER_NODE( p, n ) n##::Unload();\
+// ( p ).deregisterNode( n##::id )
+
+#define DEREGISTER_NODE( p, n ) ( p ).deregisterNode( n##::id )
diff --git a/tools/objectsnapper/code/main/stdafx.h b/tools/objectsnapper/code/main/stdafx.h
new file mode 100644
index 0000000..3152a3f
--- /dev/null
+++ b/tools/objectsnapper/code/main/stdafx.h
@@ -0,0 +1,19 @@
+#ifndef STDAFX
+#define STDAFX
+
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// stdafx.h
+//
+// Description: Header wrapper for using MFC.
+//
+// Modification History:
+// + Created Oct 12, 2001 -- bkusy
+//-----------------------------------------------------------------------------
+#define VC_EXTRALEAN
+#include <afxwin.h>
+#include <afxdlgs.h>
+
+
+#endif \ No newline at end of file
diff --git a/tools/objectsnapper/code/precompiled/PCH.cpp b/tools/objectsnapper/code/precompiled/PCH.cpp
new file mode 100644
index 0000000..5f77b4a
--- /dev/null
+++ b/tools/objectsnapper/code/precompiled/PCH.cpp
@@ -0,0 +1 @@
+#include "PCH.h" \ No newline at end of file
diff --git a/tools/objectsnapper/code/precompiled/PCH.h b/tools/objectsnapper/code/precompiled/PCH.h
new file mode 100644
index 0000000..c14ca45
--- /dev/null
+++ b/tools/objectsnapper/code/precompiled/PCH.h
@@ -0,0 +1,50 @@
+#include <maya/M3dView.h>
+#include <maya/MArgList.h>
+#include <maya/MCursor.h>
+#include <maya/MDagPath.h>
+#include <maya/MDagPathArray.h>
+#include <maya/MDGMessage.h>
+#include <maya/MDGModifier.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MEulerRotation.h>
+#include <maya/MFnData.h>
+#include <maya/MFnDagNode.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnIkJoint.h>
+#include <maya/MFnIntArrayData.h>
+#include <maya/MFnMatrixData.h>
+#include <maya/MFnMesh.h>
+#include <maya/MFnMessageAttribute.h>
+#include <maya/MFnNumericAttribute.h>
+#include <maya/MFnStringArrayData.h>
+#include <maya/MFnTransform.h>
+#include <maya/MFnTypedAttribute.h>
+#include <maya/MGlobal.h>
+#include <maya/MIntArray.h>
+#include <maya/MItDag.h>
+#include <maya/MItMeshVertex.h>
+#include <maya/MItSelectionList.h>
+#include <maya/MMatrix.h>
+#include <maya/MNodeMessage.h>
+#include <maya/MObject.h>
+#include <maya/MObjectArray.h>
+#include <maya/MPlug.h>
+#include <maya/MPlugArray.h>
+#include <maya/MPoint.h>
+#include <maya/MPointArray.h>
+#include <maya/MPxCommand.h>
+#include <maya/MPxContext.h>
+#include <maya/MPxContextCommand.h>
+#include <maya/MPxLocatorNode.h>
+#include <maya/MQuaternion.h>
+#include <maya/MSelectionList.h>
+#include <maya/MStatus.h>
+#include <maya/MString.h>
+#include <maya/MStringArray.h>
+#include <maya/MTransformationMatrix.h>
+#include <maya/MTypeId.h>
+#include <maya/MUiMessage.h>
+#include <maya/MVector.h>
+
+#include <assert.h> \ No newline at end of file
diff --git a/tools/objectsnapper/code/scripts/os_cleanup.mel b/tools/objectsnapper/code/scripts/os_cleanup.mel
new file mode 100644
index 0000000..020de04
--- /dev/null
+++ b/tools/objectsnapper/code/scripts/os_cleanup.mel
@@ -0,0 +1,3 @@
+
+
+os_RemoveUI(); \ No newline at end of file
diff --git a/tools/objectsnapper/code/scripts/os_main.mel b/tools/objectsnapper/code/scripts/os_main.mel
new file mode 100644
index 0000000..7a8c567
--- /dev/null
+++ b/tools/objectsnapper/code/scripts/os_main.mel
@@ -0,0 +1,228 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// TE_main.mel
+//
+// Description: Installs the Object Snapper (OS) interface.
+// As a convention all Object Snapper global procedures
+// and global variables are prefixed with "os_". All commands
+// exposed through OS plugins are prefixed with "OS_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created March 18 2002 -- Cary Brisebois
+//-----------------------------------------------------------------------------
+
+
+global float $gOS_Offset = 0.10;
+
+
+//-----------------------------------------------------------------------------
+// o s _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// o s _ M C B _ A b o u t
+//
+// Synopsis: Display an About Object Snapper window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_MCB_About()
+{
+ string $pluginVersion = "1.0";
+
+ string $message = ( "\nSimpsons Road Rage Object Snapper.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About Object Snapper"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// o s _ d o M a i n M e n u I t e m s
+//
+// Synopsis: Creates the OS menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_doMainMenuItems( string $menu )
+{
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Snap Single Selected" -command ( "os_MCB_SnapSingleSelected()" );
+
+ menuItem -divider true;
+
+ menuItem -label "Snap All Selected" -command ( "os_MCB_SnapSelected()" );
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Tree Line" -command ( "os_MCB_SnapTreeLine()" );
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "os_MCB_About()";
+
+ menuItem -optionBox true -command "os_MCB_OSOptions()";
+
+ setParent -m ..;
+}
+
+//-----------------------------------------------------------------------------
+// o s _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc os_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install OS menu as a root menu.
+ //
+ if ( `menu -exists os_MainMenu` ) deleteUI os_MainMenu;
+ menu -label "Object Snapper" -allowOptionBoxes true -parent $gMainWindow os_MainMenu;
+
+ os_doMainMenuItems "os_MainMenu";
+}
+
+//==============================================================================
+// global proc os_RemoveUI
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_RemoveUI()
+{
+ if ( `menu -exists os_MainMenu` ) deleteUI os_MainMenu;
+ if ( `window -exists os_OptionWindow` ) deleteUI os_OptionWindow;
+}
+
+//==============================================================================
+// global proc os_MCB_SnapSelected
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_SnapSelected()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 0 );
+}
+
+
+//==============================================================================
+// global proc os_MCB_SnapSingleSelected
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_SnapSingleSelected()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 1 );
+}
+
+//=============================================================================
+// global proc os_MCB_SnapTreeLine
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//=============================================================================
+global proc os_MCB_SnapTreeLine()
+{
+ global float $gOS_Offset;
+
+ OS_SnapSelected( $gOS_Offset, 2 );
+}
+
+//==============================================================================
+// global proc os_MCB_OSOptions
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: global
+//
+//==============================================================================
+global proc os_MCB_OSOptions()
+{
+ global float $gOS_Offset;
+
+ if ( `window -exists os_OptionWindow` ) deleteUI os_OptionWindow;
+
+ window -title "Object Snapper Options" os_OptionWindow;
+
+ columnLayout;
+
+ rowLayout -nc 2;
+
+ text -label "Offset (M):";
+
+ floatField -min -10.0 -max 10.0 -value $gOS_Offset -cc ("$gOS_Offset = #1");
+
+ setParent ..;
+
+ setParent ..;
+
+ showWindow;
+}
+
+evalDeferred "os_InstallUI"; \ No newline at end of file
diff --git a/tools/relatedfiles/Debug/relatedfiles.log b/tools/relatedfiles/Debug/relatedfiles.log
new file mode 100644
index 0000000..2585096
--- /dev/null
+++ b/tools/relatedfiles/Debug/relatedfiles.log
@@ -0,0 +1,14 @@
+Build started 11/7/2015 5:44:20 PM.
+ 1>Project "G:\Code\Simpsons Hit&Run\tools\relatedfiles\relatedfiles.vcxproj" on node 4 (Build target(s)).
+ 1>ClCompile:
+ C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /I../../game/code/constants /I../../game/libs/radmath /I../../game/libs/pure3d/toollib/inc /I../../game/libs/pure3d/constants /I../../game/libs/pure3d/toollib/chunks16/inc /ZI /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D RAD_DEBUG /D RAD_PC /D RAD_WIN32 /D _MBCS /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo".\Debug/" /Fd".\Debug/vc120.pdb" /Gd /TP /analyze- /errorReport:prompt ..\..\game\libs\pure3d\toollib\src\tlDataChunk.cpp ..\..\game\libs\pure3d\toollib\toollib_extras.cpp
+ tlDataChunk.cpp
+ 1>g:\code\simpsons hit&run\game\libs\pure3d\toollib\inc\chunkmanip.hpp(13): fatal error C1083: Cannot open include file: 'tlSmartPropChunk.hpp': No such file or directory
+ toollib_extras.cpp
+ 1>g:\code\simpsons hit&run\game\libs\pure3d\toollib\inc\chunkmanip.hpp(13): fatal error C1083: Cannot open include file: 'tlSmartPropChunk.hpp': No such file or directory
+ Generating Code...
+ 1>Done Building Project "G:\Code\Simpsons Hit&Run\tools\relatedfiles\relatedfiles.vcxproj" (Build target(s)) -- FAILED.
+
+Build FAILED.
+
+Time Elapsed 00:00:00.49
diff --git a/tools/relatedfiles/Debug/relatedfiles.tlog/cl.command.1.tlog b/tools/relatedfiles/Debug/relatedfiles.tlog/cl.command.1.tlog
new file mode 100644
index 0000000..46b134b
--- /dev/null
+++ b/tools/relatedfiles/Debug/relatedfiles.tlog/cl.command.1.tlog
@@ -0,0 +1 @@
+ÿþ \ No newline at end of file
diff --git a/tools/relatedfiles/Debug/relatedfiles.tlog/relatedfiles.lastbuildstate b/tools/relatedfiles/Debug/relatedfiles.tlog/relatedfiles.lastbuildstate
new file mode 100644
index 0000000..72cdac1
--- /dev/null
+++ b/tools/relatedfiles/Debug/relatedfiles.tlog/relatedfiles.lastbuildstate
@@ -0,0 +1,2 @@
+#TargetFrameworkVersion=v4.0:PlatformToolSet=v120:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit
+Debug|Win32|G:\Code\Simpsons Hit&Run\tools\|
diff --git a/tools/relatedfiles/Debug/relatedfiles.tlog/unsuccessfulbuild b/tools/relatedfiles/Debug/relatedfiles.tlog/unsuccessfulbuild
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/relatedfiles/Debug/relatedfiles.tlog/unsuccessfulbuild
diff --git a/tools/relatedfiles/Debug/vc120.idb b/tools/relatedfiles/Debug/vc120.idb
new file mode 100644
index 0000000..f2afced
--- /dev/null
+++ b/tools/relatedfiles/Debug/vc120.idb
Binary files differ
diff --git a/tools/relatedfiles/Debug/vc120.pdb b/tools/relatedfiles/Debug/vc120.pdb
new file mode 100644
index 0000000..33810eb
--- /dev/null
+++ b/tools/relatedfiles/Debug/vc120.pdb
Binary files differ
diff --git a/tools/relatedfiles/relatedfiles.dsp b/tools/relatedfiles/relatedfiles.dsp
new file mode 100644
index 0000000..a966e5d
--- /dev/null
+++ b/tools/relatedfiles/relatedfiles.dsp
@@ -0,0 +1,840 @@
+# Microsoft Developer Studio Project File - Name="relatedfiles" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=relatedfiles - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "relatedfiles.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "relatedfiles.mak" CFG="relatedfiles - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "relatedfiles - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "relatedfiles - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "relatedfiles"
+# PROP Scc_LocalPath "."
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "relatedfiles - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../game/libs/pure3d/toollib/inc" /I "../../game/libs/pure3d/constants" /I "../../game/libs/pure3d/toollib/chunks16/inc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x1009 /d "NDEBUG"
+# ADD RSC /l 0x1009 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "relatedfiles - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../game/libs/pure3d/toollib/inc" /I "../../game/libs/pure3d/constants" /I "../../game/libs/pure3d/toollib/chunks16/inc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x1009 /d "_DEBUG"
+# ADD RSC /l 0x1009 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "relatedfiles - Win32 Release"
+# Name "relatedfiles - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Group "chunks16"
+
+# PROP Default_Filter ""
+# Begin Group "chunks"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlAnimatedObjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlAnimationChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlBBoxChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlBillboardObjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlBSphereChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlChannelChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlCollisionObjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlExpressionChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFencelineChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleJointChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleObjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFontChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlGameAttrChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlImageChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlIntersectionChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlLightChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlLocatorChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlMeshChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlOpticEffectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlParticleSystemChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlPhotonMapChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlPhysicsObjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlPrimGroupChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlRoadChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlRoadSegmentChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlScroobyProjectChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlShaderChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlShadowSkinChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlSkinChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlSmartPropChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlSpriteChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlTextureChunk.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlWallChunk.sc
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlCameraAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlCameraChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlCompositeDrawableChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlEntityChannelChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlExportInfoChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlExpressionAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlHistoryChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlLightAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlLightGroupChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlMultiControllerChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlPoseAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphTransformAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlSkeletonChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlTextureAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlVertexAnimChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlVertexOffsetExpressionChunk16.sc
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\Schema16\tlVisibilityAnimChunk16.sc
+# End Source File
+# End Group
+# Begin Group "inc"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\DataManip.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\dospath.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\getopt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\glob.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\greyscale.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\hash.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\lzr.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\lzrf.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\pddi\ps2\packet.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\porc.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\pddi\ps2\ps2prim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\simdata.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlAdjFaceList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlBox.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlBSPTree.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlBuffer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlcamera.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlCollisionObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlColour.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlCompressedByteStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlExportInfo.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFile.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFlexibleJoint.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFlexibleObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFont.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlGCComponentQuantizer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlGCPrimBuffer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlHashTable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlImage.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlIndexedSkinVertex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlKeyDefs.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlLight.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlLightGroup.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlOffsetSkinVertex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPDDI.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPhysicsObject.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPlane.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPose.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlPS2SkinPrimBuffer.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlRay.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlRC.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSegment.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlShader.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlString.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTable.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTarga.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTranAnimKeys.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTsEdge.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTsTriangle.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTsTriangleToTriStripConverter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTsVertexCache.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTsVertexConnectivity.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlUV.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlversion.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\ChunkManip.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\code\constants\srrchunks.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\src\tlDataChunk.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\inc\toollib.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\game\libs\pure3d\toollib\toollib_extras.cpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/tools/relatedfiles/relatedfiles.vcproj b/tools/relatedfiles/relatedfiles.vcproj
new file mode 100644
index 0000000..a66642e
--- /dev/null
+++ b/tools/relatedfiles/relatedfiles.vcproj
@@ -0,0 +1,701 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="relatedfiles"
+ SccProjectName="Perforce Project"
+ SccAuxPath=""
+ SccLocalPath="."
+ SccProvider="MSSCCI:Perforce SCM">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="../../game/code/constants;../../game/libs/radmath;../../game/libs/pure3d/toollib/inc;../../game/libs/pure3d/constants;../../game/libs/pure3d/toollib/chunks16/inc"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;RAD_RELEASE;RAD_PC;RAD_WIN32"
+ StringPooling="TRUE"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Release/relatedfiles.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="odbc32.lib odbccp32.lib"
+ OutputFile=".\Release/relatedfiles.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ IgnoreDefaultLibraryNames="LIBC.lib;LIBCMT.lib"
+ ProgramDatabaseFile=".\Release/relatedfiles.pdb"
+ SubSystem="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/relatedfiles.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../game/code/constants;../../game/libs/radmath;../../game/libs/pure3d/toollib/inc;../../game/libs/pure3d/constants;../../game/libs/pure3d/toollib/chunks16/inc"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;RAD_DEBUG;RAD_PC;RAD_WIN32"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderFile=".\Debug/relatedfiles.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="odbc32.lib odbccp32.lib"
+ OutputFile=".\Debug/relatedfiles.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/relatedfiles.pdb"
+ SubSystem="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/relatedfiles.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl">
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\ChunkManip.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\code\constants\srrchunks.h">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\src\tlDataChunk.cpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\toollib.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\toollib_extras.cpp">
+ </File>
+ <Filter
+ Name="chunks16"
+ Filter="">
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlCameraAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlCameraChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlCompositeDrawableChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlEntityChannelChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlExportInfoChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlHistoryChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlLightAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlLightGroupChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlMultiControllerChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlPoseAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphTransformAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlSkeletonChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlTextureAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlVertexAnimChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlVertexOffsetExpressionChunk16.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlVisibilityAnimChunk16.sc">
+ </File>
+ <Filter
+ Name="chunks"
+ Filter="">
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlAnimatedObjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlAnimationChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlBBoxChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlBSphereChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlBillboardObjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlChannelChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlCollisionObjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFencelineChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleJointChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleObjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFontChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlGameAttrChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlImageChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlIntersectionChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlLightChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlLocatorChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlMeshChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlOpticEffectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlParticleSystemChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlPhotonMapChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlPhysicsObjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlPrimGroupChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlRoadChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlRoadSegmentChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlScroobyProjectChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlShaderChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlShadowSkinChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlSkinChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlSmartPropChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlSpriteChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlTextureChunk.sc">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\Schema16\tlWallChunk.sc">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="inc"
+ Filter="">
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\DataManip.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\dospath.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\getopt.h">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\glob.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\greyscale.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\hash.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\lzr.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\lzrf.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\pddi\ps2\packet.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\porc.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\pddi\ps2\ps2prim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\simdata.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlAdjFaceList.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlBSPTree.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlBox.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlCollisionObject.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlColour.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlCompressedByteStream.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlExportInfo.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFile.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFlexibleJoint.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFlexibleObject.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFont.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlGCComponentQuantizer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlGCPrimBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlHashTable.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlImage.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlIndexedSkinVertex.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlKeyDefs.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlLight.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlLightGroup.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlOffsetSkinVertex.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPDDI.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPS2SkinPrimBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPhysicsObject.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPlane.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPose.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlRC.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlRay.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSegment.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlShader.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlString.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTable.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTarga.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTranAnimKeys.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTsEdge.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTsTriangle.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTsTriangleToTriStripConverter.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTsVertexCache.h">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTsVertexConnectivity.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlUV.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlcamera.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp">
+ </File>
+ <File
+ RelativePath="..\..\game\libs\pure3d\toollib\inc\tlversion.hpp">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/relatedfiles/relatedfiles.vcxproj b/tools/relatedfiles/relatedfiles.vcxproj
new file mode 100644
index 0000000..3bb4594
--- /dev/null
+++ b/tools/relatedfiles/relatedfiles.vcxproj
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath />
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <ProjectGuid>{EF05D776-F91E-422F-BD64-16B3F5557888}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>.\Release\</OutDir>
+ <IntDir>.\Release\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>.\Debug\</OutDir>
+ <IntDir>.\Debug\</IntDir>
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>../../game/code/constants;../../game/libs/radmath;../../game/libs/pure3d/toollib/inc;../../game/libs/pure3d/constants;../../game/libs/pure3d/toollib/chunks16/inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;RAD_RELEASE;RAD_PC;RAD_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Release/relatedfiles.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>.\Release/relatedfiles.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreSpecificDefaultLibraries>LIBC.lib;LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>.\Release/relatedfiles.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ <Midl>
+ <TypeLibraryName>.\Release/relatedfiles.tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../game/code/constants;../../game/libs/radmath;../../game/libs/pure3d/toollib/inc;../../game/libs/pure3d/constants;../../game/libs/pure3d/toollib/chunks16/inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;RAD_DEBUG;RAD_PC;RAD_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader />
+ <PrecompiledHeaderOutputFile>.\Debug/relatedfiles.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+ <ObjectFileName>.\Debug/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>.\Debug/relatedfiles.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Debug/relatedfiles.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ <Midl>
+ <TypeLibraryName>.\Debug/relatedfiles.tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\ChunkManip.hpp" />
+ <ClInclude Include="..\..\game\code\constants\srrchunks.h" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\toollib.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\DataManip.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\dospath.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\getopt.h" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\glob.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\greyscale.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\hash.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\lzr.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\lzrf.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\pddi\ps2\packet.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\porc.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\pddi\ps2\ps2prim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\simdata.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAdjFaceList.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBSPTree.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBox.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCollisionObject.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlColour.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCompressedByteStream.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExportInfo.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFile.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFlexibleJoint.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFlexibleObject.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFont.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGCComponentQuantizer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGCPrimBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHashTable.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlImage.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIndexedSkinVertex.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlKeyDefs.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLight.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLightGroup.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOffsetSkinVertex.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPDDI.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPS2SkinPrimBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPhysicsObject.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPlane.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPose.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlRC.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlRay.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSegment.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlShader.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlString.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTable.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTarga.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTranAnimKeys.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsEdge.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsTriangle.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsTriangleToTriStripConverter.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsVertexCache.h" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsVertexConnectivity.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlUV.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlcamera.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp" />
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlversion.hpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\game\libs\pure3d\toollib\src\tlDataChunk.cpp" />
+ <ClCompile Include="..\..\game\libs\pure3d\toollib\toollib_extras.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCameraAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCameraChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCompositeDrawableChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlEntityChannelChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExportInfoChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlHistoryChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightGroupChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlMultiControllerChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPoseAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphTransformAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSkeletonChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlTextureAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVertexAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVertexOffsetExpressionChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVisibilityAnimChunk16.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlAnimatedObjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlAnimationChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBBoxChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBSphereChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBillboardObjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlChannelChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCollisionObjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFencelineChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleJointChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleObjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFontChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlGameAttrChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlImageChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlIntersectionChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLocatorChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlMeshChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlOpticEffectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlParticleSystemChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPhotonMapChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPhysicsObjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPrimGroupChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlRoadChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlRoadSegmentChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScroobyProjectChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlShaderChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlShadowSkinChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSkinChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSmartPropChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSpriteChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlTextureChunk.sc" />
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlWallChunk.sc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/tools/relatedfiles/relatedfiles.vcxproj.filters b/tools/relatedfiles/relatedfiles.vcxproj.filters
new file mode 100644
index 0000000..17d51c2
--- /dev/null
+++ b/tools/relatedfiles/relatedfiles.vcxproj.filters
@@ -0,0 +1,581 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{24f2d142-66d2-4581-8cb8-236b62fc2ead}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Header Files\chunks16">
+ <UniqueIdentifier>{6e945c09-ba0d-4148-b932-c83427a020fc}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\chunks16\chunks">
+ <UniqueIdentifier>{fe1fbc11-6d83-4fc4-ae75-0c211508c74d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files\inc">
+ <UniqueIdentifier>{ef15e62c-d49e-4ab4-9e8c-475560c344cc}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{6ef7a34c-377b-4dff-835c-a05ee7cb1176}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{6a3e65aa-0197-4465-85e8-796fe961e746}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\ChunkManip.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\code\constants\srrchunks.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\toollib.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\DataManip.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\dospath.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\getopt.h">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\glob.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\greyscale.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\hash.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\lzr.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\lzrf.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\pddi\ps2\packet.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\porc.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\pddi\ps2\ps2prim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\simdata.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAdjFaceList.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBSPTree.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBox.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCollisionObject.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlColour.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlCompressedByteStream.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExportInfo.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFile.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFlexibleJoint.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFlexibleObject.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFont.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGCComponentQuantizer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGCPrimBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHashTable.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlImage.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIndexedSkinVertex.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlKeyDefs.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLight.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLightGroup.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOffsetSkinVertex.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPDDI.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPS2SkinPrimBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPhysicsObject.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPlane.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPose.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlRC.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlRay.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSegment.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlShader.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlString.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTable.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTarga.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTranAnimKeys.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsEdge.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsTriangle.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsTriangleToTriStripConverter.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsVertexCache.h">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTsVertexConnectivity.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlUV.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlcamera.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\game\libs\pure3d\toollib\inc\tlversion.hpp">
+ <Filter>Header Files\inc</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\game\libs\pure3d\toollib\src\tlDataChunk.cpp">
+ <Filter>Header Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\game\libs\pure3d\toollib\toollib_extras.cpp">
+ <Filter>Header Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCameraAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCameraChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCompositeDrawableChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlEntityChannelChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExportInfoChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlHistoryChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightGroupChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlMultiControllerChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPoseAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphTransformAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSkeletonChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlTextureAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVertexAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVertexOffsetExpressionChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlVisibilityAnimChunk16.sc">
+ <Filter>Header Files\chunks16</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlAnimatedObjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlAnimationChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBBoxChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBSphereChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlBillboardObjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlChannelChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlCollisionObjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlExpressionChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFencelineChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleJointChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFlexibleObjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFontChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlFrameControllerChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlGameAttrChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlImageChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlIntersectionChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLightChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlLocatorChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlMeshChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlOpticEffectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlParticleSystemChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPhotonMapChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPhysicsObjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlPrimGroupChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlRoadChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlRoadSegmentChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScenegraphChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlScroobyProjectChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlShaderChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlShadowSkinChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSkinChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSmartPropChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlSpriteChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlTextureChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ <None Include="..\..\game\libs\pure3d\toollib\Schema16\tlWallChunk.sc">
+ <Filter>Header Files\chunks16\chunks</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/art/new.bmp b/tools/statepropbuilder/apps/spbuilder/art/new.bmp
new file mode 100644
index 0000000..df77654
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/art/new.bmp
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/art/open.bmp b/tools/statepropbuilder/apps/spbuilder/art/open.bmp
new file mode 100644
index 0000000..7a468c4
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/art/open.bmp
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/art/save.bmp b/tools/statepropbuilder/apps/spbuilder/art/save.bmp
new file mode 100644
index 0000000..8bfd2cc
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/art/save.bmp
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/art/saveas.bmp b/tools/statepropbuilder/apps/spbuilder/art/saveas.bmp
new file mode 100644
index 0000000..8845043
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/art/saveas.bmp
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/data/Copy of events.txt b/tools/statepropbuilder/apps/spbuilder/bin/data/Copy of events.txt
new file mode 100644
index 0000000..a2302b6
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/data/Copy of events.txt
@@ -0,0 +1,16 @@
+START
+STOP
+TOGGLE
+OPEN
+CLOSE
+ENABLE
+DISABLE
+TALK
+DESTROY
+BREAK
+IDLE
+ATTACK
+FLEE
+COLLECT
+GETHIT
+TRAMPOLINE_BOUNCE
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/data/callbacks.txt b/tools/statepropbuilder/apps/spbuilder/bin/data/callbacks.txt
new file mode 100644
index 0000000..79aad12
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/data/callbacks.txt
@@ -0,0 +1,18 @@
+REMOVE_FROM_WORLD
+SPAWN_5_COINS
+REMOVE_COLLISION_VOLUME
+FIRE_ENERGY_BOLT
+KILL SPEED
+SPAWN_10_COINS
+SPAWN_15_COINS
+SPAWN_20_COINS
+RADIATE_FORCE
+EMIT_LEAVES
+OBJECT_DESTROYED
+SPAWN_5_COINS_Z
+SPAWN_1_COIN
+COLA_DESTROYED
+CAMSHAKE
+REMOVE_1ST_VOL
+REMOVE_2ND_VOL
+REMOVE_3RD_VOL
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/data/events.txt b/tools/statepropbuilder/apps/spbuilder/bin/data/events.txt
new file mode 100644
index 0000000..16f124d
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/data/events.txt
@@ -0,0 +1,12 @@
+IDLE
+FADE_IN
+FADE_OUT
+MOVING
+ATTACK_CHARGING
+ATTACK_CHARGED
+ATTACKING
+DESTROYED
+HIT
+FEATHER_TOUCH
+STOMP
+VEHICLE_HIT \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/data/init.txt b/tools/statepropbuilder/apps/spbuilder/bin/data/init.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/data/init.txt
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/empty.txt b/tools/statepropbuilder/apps/spbuilder/bin/empty.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/empty.txt
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/pddidx8d.dll b/tools/statepropbuilder/apps/spbuilder/bin/pddidx8d.dll
new file mode 100644
index 0000000..a31fd8c
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/pddidx8d.dll
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/spbuilder.exe b/tools/statepropbuilder/apps/spbuilder/bin/spbuilder.exe
new file mode 100644
index 0000000..074eaa8
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/spbuilder.exe
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/bin/spengine.dll b/tools/statepropbuilder/apps/spbuilder/bin/spengine.dll
new file mode 100644
index 0000000..9efa51b
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/bin/spengine.dll
Binary files differ
diff --git a/tools/statepropbuilder/apps/spbuilder/build/spbuilder/spbuilder.bpr b/tools/statepropbuilder/apps/spbuilder/build/spbuilder/spbuilder.bpr
new file mode 100644
index 0000000..c51533b
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/build/spbuilder/spbuilder.bpr
@@ -0,0 +1,128 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value="../../bin\spbuilder.exe"/>
+ <OBJFILES value="spbuilder.obj ..\..\code\sp\builder\main.obj
+ ..\..\code\sp\builder\fcframe.obj ..\..\code\sp\builder\visframe.obj
+ ..\..\code\sp\builder\eventsframe.obj
+ ..\..\code\sp\builder\callbacksframe.obj"/>
+ <RESFILES value="spbuilder.res"/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES) ..\..\code\sp\builder\main.dfm
+ ..\..\code\sp\builder\fcframe.dfm ..\..\code\sp\builder\visframe.dfm
+ ..\..\code\sp\builder\eventsframe.dfm
+ ..\..\code\sp\builder\callbacksframe.dfm"/>
+ <LIBFILES value=""/>
+ <LIBRARIES value="Vclx50.lib Vcl50.lib"/>
+ <SPARELIBS value="Vcl50.lib Vclx50.lib"/>
+ <PACKAGES value="Vcl50.bpi Vclx50.bpi bcbsmp50.bpi Qrpt50.bpi Vcldb50.bpi Vclbde50.bpi
+ ibsmp50.bpi vcldbx50.bpi TeeUI50.bpi TeeDB50.bpi Tee50.bpi TeeQR50.bpi
+ VCLIB50.bpi bcbie50.bpi vclie50.bpi Inetdb50.bpi Inet50.bpi NMFast50.bpi
+ dclocx50.bpi bcb2kaxserver50.bpi"/>
+ <PATHCPP value=".;..\..\code\sp\builder"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+ <RELEASELIBPATH value="$(BCB)\lib\release"/>
+ <LINKER value="tlink32"/>
+ <USERDEFINES value="_DEBUG"/>
+ <SYSDEFINES value="NO_STRICT"/>
+ <MAINSOURCE value="spbuilder.cpp"/>
+ <INCLUDEPATH value="&quot;D:\Program Files\Borland\CBuilder5\Projects\&quot;;..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code"/>
+ <LIBPATH value="&quot;D:\Program Files\Borland\CBuilder5\Projects\&quot;;..\..\code\sp\builder;$(BCB)\lib\obj;$(BCB)\lib;..\..\bin"/>
+ <WARNINGS value="-w-par"/>
+ </MACROS>
+ <OPTIONS>
+ <CFLAG1 value="-Od -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
+ -tW -tWM"/>
+ <PFLAGS value="-$YD -$W -$O- -v -JPHNE -M"/>
+ <RFLAGS value=""/>
+ <AFLAGS value="/mx /w2 /zi"/>
+ <LFLAGS value="-D&quot;&quot; -aa -Tpe -x -Gn -v"/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
+ <ALLRES value="$(RESFILES)"/>
+ <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib spengineb.lib"/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=6
+Item0=D:\Program Files\Borland\CBuilder5\Projects\;..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code
+Item1=D:\Program Files\Borland\CBuilder5\Projects;..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code
+Item2=..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code
+Item3=..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code\sp
+Item4=..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl;..\..\code\sp\
+Item5=..\..\code\sp\builder;$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=4
+Item0=D:\Program Files\Borland\CBuilder5\Projects\;..\..\code\sp\builder;$(BCB)\lib\obj;$(BCB)\lib;..\..\bin
+Item1=D:\Program Files\Borland\CBuilder5\Projects;..\..\code\sp\builder;$(BCB)\lib\obj;$(BCB)\lib;..\..\bin
+Item2=..\..\code\sp\builder;$(BCB)\lib\obj;$(BCB)\lib;..\..\bin
+Item3=..\..\code\sp\builder;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[HistoryLists\hlFinalOutputDir]
+Count=2
+Item0=../../bin\
+Item1=../../bin
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+ </IDEOPTIONS>
+</PROJECT> \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsp b/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsp
new file mode 100644
index 0000000..0e4b5e2
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsp
@@ -0,0 +1,179 @@
+# Microsoft Developer Studio Project File - Name="spengine" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=spengine - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "spengine.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "spengine.mak" CFG="spengine - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "spengine - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "spengine - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "spengine"
+# PROP Scc_LocalPath "."
+CPP=snCl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "spengine - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPENGINE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../code" /I "../../../../../ftech/radcore/inc/" /I "../../../../../radmath/" /I "../../../../../pure3d/" /I "../../../../../poser/inc/" /I "../../../../../pure3d/toollib/inc" /I "../../../../../pure3d/constants/" /I "../../../../../sim/" /D "NDEBUG" /D "RAD_TUNE" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RAD_WIN32" /D "RAD_PC" /D "SMARTPROP_ENGINE" /FR /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /dll /machine:I386 /out:"../../bin/spengine.dll"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\..\..\..\..\pure3d\build\lib\pddidx8t.dll ..\..\bin coff2omf release\spengine.lib ..\..\bin\spengineb.lib
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "spengine - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPENGINE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GR /ZI /Od /I "../../code/" /I "../../../../../radcore/inc/" /I "../../../../../radmath" /I "../../../../../pure3d/" /I "../../../../../sim/" /I "../../../../../poser/inc/" /I "../../../../../pure3d/toollib/inc" /I "../../../../../pure3d/constants/" /I "../../../../../radcontent/inc" /D "_DEBUG" /D "RAD_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RAD_WIN32" /D "RAD_PC" /D "SMARTPROP_ENGINE" /FR /YX /FD /I /I /I /I /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libc.lib" /out:"../../bin/spengine.dll" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\..\..\..\..\pure3d\build\lib\pddidx8d.dll ..\..\bin coff2omf debug\spengine.lib ..\..\bin\spengineb.lib
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "spengine - Win32 Release"
+# Name "spengine - Win32 Debug"
+# Begin Group "interface"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\code\sp\interface\base.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\interface\context.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\interface.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\interface\platform.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\interface\workspace.hpp
+# End Source File
+# End Group
+# Begin Group "engine"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\aicollisionsolveragent.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\aicollisionsolveragent.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\context.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\context.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\dllmain.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\platform.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\stateprop.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\stateprop.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\statepropdata.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\statepropdata.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\statepropdatatypes.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\workspace.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\code\sp\engine\workspace.hpp
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsw b/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsw
new file mode 100644
index 0000000..520d8ab
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/build/spengine/spengine.dsw
@@ -0,0 +1,245 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Pure3D"=..\..\..\..\..\pure3d\build\win32\Pure3D.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Pure3D
+ ..\..\..\..\..\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "freetype"=..\..\..\..\..\pure3d\lib\freetype\builds\win32\visualc\freetype.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ "$/DEV/freetype", KAOAAAAA
+ ..\..\..\..\..\pure3d\lib\freetype\builds\win32\visualc
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libpng"=..\..\..\..\..\pure3d\build\win32\libpng.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ libpng
+ ..\..\..\..\..\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "pddidx8"=..\..\..\..\..\pure3d\build\win32\pddidx8.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ nbrooke-dual
+ ..\..\..\..\..\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "poser"=..\..\..\..\..\poser\build\win32\poser.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ poser
+ ..\..\..\..\..\poser
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "radcontent"=..\..\..\..\..\radcontent\build\win32\radcontent.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ radcontent
+ ..\..\..\..\..\radcontent
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "radcore"=..\..\..\..\..\radcore\build\win32\radcore.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ radcore
+ ..\..\..\..\..\radcore\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "radmath"=..\..\..\..\..\radmath\build\win32\radmath.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ nbrooke-dual
+ ..\..\..\..\..\radmath\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "sim"=..\..\..\..\..\sim\build\win32\sim.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ sim
+ ..\..\..\..\..\sim
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "spengine"=.\spengine.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ spengine
+ .
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name pddidx8
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Pure3D
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcore
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name sim
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name poser
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcontent
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "toollib"=..\..\..\..\..\pure3d\toollib\toollib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ toollib
+ ..\..\..\..\..\pure3d\toollib
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "zlib"=..\..\..\..\..\pure3d\build\win32\zlib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ zlib
+ ..\..\..\..\..\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.cpp
new file mode 100644
index 0000000..adc81aa
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.cpp
@@ -0,0 +1,73 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include <sp/interface.hpp>
+#include "callbacksframe.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+extern bool g_ForceDataUpdate;
+extern bool g_IsDataSaved;
+
+TFrame4 *Frame4;
+//---------------------------------------------------------------------------
+__fastcall TFrame4::TFrame4(TComponent* Owner,int cbindex) :
+ TFrame(Owner),
+ m_CBIndex( cbindex )
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrame4::CallbackComboBoxChange(TObject *Sender)
+{
+ CallbackData cbData;
+ SPGetCallbackData( SPGetCurrentState() , m_CBIndex , &cbData );
+
+ int index = CallbackComboBox->ItemIndex;
+ AnsiString eventname = CallbackComboBox->Items->Strings[index];
+ SPEditCallback( SPGetCurrentState() , m_CBIndex , eventname.c_str() , index , cbData.onFrame );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame4::OnFrameEditBoxChange(TObject *Sender)
+{
+ CallbackData cbData;
+ SPGetCallbackData( SPGetCurrentState() , m_CBIndex , &cbData );
+
+ AnsiString onFrame = OnFrameEditBox->Text;
+ float frame = 0.f;
+ try
+ {
+ frame = onFrame.ToDouble();
+ }
+ catch (Exception&)
+ {
+ frame = cbData.onFrame;
+ AnsiString oldFrame;
+ oldFrame.sprintf("%0.3f" , frame);
+ OnFrameEditBox->Text = oldFrame;
+ }
+
+ SPEditCallback( SPGetCurrentState() , m_CBIndex , cbData.callbackName , cbData.callbackID , frame );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame4::Button1Click(TObject *Sender)
+{
+ SPDeleteCallback( SPGetCurrentState() , m_CBIndex );
+ g_ForceDataUpdate = true;
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+
+void __fastcall TFrame4::OnFrameEditBoxExit(TObject *Sender)
+{
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.dfm b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.dfm
new file mode 100644
index 0000000..bddefe4
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.dfm
@@ -0,0 +1,58 @@
+object Frame4: TFrame4
+ Left = 0
+ Top = 0
+ Width = 286
+ Height = 71
+ TabOrder = 0
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 286
+ Height = 71
+ Align = alClient
+ BevelInner = bvLowered
+ TabOrder = 0
+ object Label2: TLabel
+ Left = 8
+ Top = 10
+ Width = 41
+ Height = 13
+ Caption = 'Callback'
+ end
+ object Label1: TLabel
+ Left = 8
+ Top = 35
+ Width = 43
+ Height = 13
+ Caption = 'On frame'
+ end
+ object CallbackComboBox: TComboBox
+ Left = 56
+ Top = 5
+ Width = 121
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 0
+ OnChange = CallbackComboBoxChange
+ end
+ object OnFrameEditBox: TEdit
+ Left = 56
+ Top = 30
+ Width = 49
+ Height = 21
+ TabOrder = 1
+ OnChange = OnFrameEditBoxChange
+ OnExit = OnFrameEditBoxExit
+ end
+ object Button1: TButton
+ Left = 110
+ Top = 30
+ Width = 67
+ Height = 23
+ Caption = 'delete'
+ TabOrder = 2
+ OnClick = Button1Click
+ end
+ end
+end
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.h b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.h
new file mode 100644
index 0000000..b2b0519
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/callbacksframe.h
@@ -0,0 +1,34 @@
+//---------------------------------------------------------------------------
+
+
+#ifndef callbacksframeH
+#define callbacksframeH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TFrame4 : public TFrame
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TLabel *Label2;
+ TComboBox *CallbackComboBox;
+ TLabel *Label1;
+ TEdit *OnFrameEditBox;
+ TButton *Button1;
+ void __fastcall CallbackComboBoxChange(TObject *Sender);
+ void __fastcall OnFrameEditBoxChange(TObject *Sender);
+ void __fastcall Button1Click(TObject *Sender);
+ void __fastcall OnFrameEditBoxExit(TObject *Sender);
+private: // User declarations
+ int m_CBIndex;
+public: // User declarations
+ __fastcall TFrame4(TComponent* Owner,int cbindex);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrame4 *Frame4;
+//---------------------------------------------------------------------------
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.cpp
new file mode 100644
index 0000000..09ded82
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.cpp
@@ -0,0 +1,75 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+#include <sp/interface.hpp>
+#include "eventsframe.h"
+#include "main.h"
+
+extern float g_ForceDataUpdate;
+extern bool g_IsDataSaved;
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrame3 *Frame3;
+//---------------------------------------------------------------------------
+__fastcall TFrame3::TFrame3(TComponent* Owner , int EventIndex ) :
+ TFrame(Owner),
+ m_EventIndex( EventIndex )
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrame3::EventComboBoxChange(TObject *Sender)
+{
+ EventData eventData;
+ SPGetEventData( SPGetCurrentState() , m_EventIndex , &eventData );
+ int index = EventComboBox->ItemIndex;
+ AnsiString eventname = EventComboBox->Items->Strings[index];
+ SPEditEvent( SPGetCurrentState() , m_EventIndex , eventname.c_str() , index , eventData.toState );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame3::ToFrameEditBoxChange(TObject *Sender)
+{
+ EventData eventData;
+ SPGetEventData( SPGetCurrentState() , m_EventIndex , &eventData );
+
+ int index = EventComboBox->ItemIndex;
+ AnsiString eventname = EventComboBox->Items->Strings[index];
+ AnsiString toState = ToFrameEditBox->Text;
+ int state = 0;
+ try
+ {
+ state = toState.ToInt();
+ }
+ catch (Exception&)
+ {
+ state = eventData.toState + 1;
+ }
+ if ( state > SPGetNumberOfStates() || state == 0 )
+ {
+ state = eventData.toState + 1;
+ g_ForceDataUpdate = true;
+ }
+
+ SPEditEvent( SPGetCurrentState() , m_EventIndex , eventname.c_str() , index , state - 1 );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame3::Button1Click(TObject *Sender)
+{
+ SPDeleteEvent( SPGetCurrentState() , m_EventIndex );
+ g_ForceDataUpdate = true;
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame3::ToFrameEditBoxExit(TObject *Sender)
+{
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.dfm b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.dfm
new file mode 100644
index 0000000..cf1d0e6
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.dfm
@@ -0,0 +1,58 @@
+object Frame3: TFrame3
+ Left = 0
+ Top = 0
+ Width = 212
+ Height = 62
+ TabOrder = 0
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 212
+ Height = 62
+ Align = alClient
+ BevelInner = bvLowered
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 8
+ Top = 10
+ Width = 44
+ Height = 13
+ Caption = 'On event'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 35
+ Width = 50
+ Height = 13
+ Caption = 'go to state'
+ end
+ object EventComboBox: TComboBox
+ Left = 64
+ Top = 5
+ Width = 113
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 0
+ OnChange = EventComboBoxChange
+ end
+ object ToFrameEditBox: TEdit
+ Left = 64
+ Top = 30
+ Width = 41
+ Height = 21
+ TabOrder = 1
+ OnChange = ToFrameEditBoxChange
+ OnExit = ToFrameEditBoxExit
+ end
+ object Button1: TButton
+ Left = 110
+ Top = 30
+ Width = 67
+ Height = 23
+ Caption = 'delete'
+ TabOrder = 2
+ OnClick = Button1Click
+ end
+ end
+end
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.h b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.h
new file mode 100644
index 0000000..9154617
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/eventsframe.h
@@ -0,0 +1,34 @@
+//---------------------------------------------------------------------------
+
+
+#ifndef eventsframeH
+#define eventsframeH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TFrame3 : public TFrame
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TLabel *Label1;
+ TComboBox *EventComboBox;
+ TLabel *Label2;
+ TEdit *ToFrameEditBox;
+ TButton *Button1;
+ void __fastcall EventComboBoxChange(TObject *Sender);
+ void __fastcall ToFrameEditBoxChange(TObject *Sender);
+ void __fastcall Button1Click(TObject *Sender);
+ void __fastcall ToFrameEditBoxExit(TObject *Sender);
+private: // User declarations
+ int m_EventIndex;
+public: // User declarations
+ __fastcall TFrame3(TComponent* Owner , int EventIndex );
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrame3 *Frame3;
+//---------------------------------------------------------------------------
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.cpp
new file mode 100644
index 0000000..0a508b4
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.cpp
@@ -0,0 +1,136 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include <sp/interface.hpp>
+#pragma hdrstop
+
+#include "fcframe.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+extern bool g_IsDataSaved;
+extern bool g_ForceDataUpdate;
+
+TFrame1 *Frame1;
+//---------------------------------------------------------------------------
+__fastcall TFrame1::TFrame1(TComponent* Owner , int fcindex)
+ : TFrame(Owner) , m_FCIndex( fcindex )
+{
+}
+
+//---------------------------------------------------------------------------
+
+
+void __fastcall TFrame1::CyclicCheckBoxClick(TObject *Sender)
+{
+ SPSetCyclic( SPGetCurrentState() , m_FCIndex , this->CyclicCheckBox->State != cbUnchecked );
+ this->cycleForEditBox->Enabled = CyclicCheckBox->State != cbUnchecked;
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::MaxFrameEditBoxChange(TObject *Sender)
+{
+ FrameControllerData fcData;
+ SPGetFrameControllerData( SPGetCurrentState() , m_FCIndex , &fcData );
+
+ AnsiString frame;
+ frame = this->MaxFrameEditBox->Text;
+ float f = 0.0f;
+ try
+ {
+ f = frame.ToDouble();
+ }
+ catch (Exception&)
+ {
+ f = fcData.maxFrame;
+ }
+
+ SPSetFrameRange( SPGetCurrentState() , m_FCIndex , fcData.minFrame , f );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::MinFrameEditBoxChange(TObject *Sender)
+{
+ FrameControllerData fcData;
+ SPGetFrameControllerData( SPGetCurrentState() , m_FCIndex , &fcData );
+
+ AnsiString frame;
+ frame = this->MinFrameEditBox->Text;
+ float f = 0.0f;
+
+ try
+ {
+ f = frame.ToDouble();
+
+ }
+ catch (Exception&)
+ {
+ f = fcData.minFrame;
+ }
+
+ SPSetFrameRange( SPGetCurrentState() , m_FCIndex , f , fcData.maxFrame );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::holdFrameCheckboxClick(TObject *Sender)
+{
+ SPSetHoldFrame( SPGetCurrentState() , m_FCIndex , holdFrameCheckbox->Checked );
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::speedEditBoxChange(TObject *Sender)
+{
+ FrameControllerData fcData;
+ SPGetFrameControllerData( SPGetCurrentState() , m_FCIndex , &fcData );
+
+ AnsiString speed;
+ speed = this->speedEditBox->Text;
+ float fSpeed = 0.0f;
+
+ try
+ {
+ fSpeed = speed.ToDouble();
+ }
+ catch (Exception&)
+ {
+ fSpeed = fcData.relativeSpeed;
+ }
+
+ SPSetRelativeSpeed( SPGetCurrentState() , m_FCIndex , fSpeed );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::cycleForEditBoxChange(TObject *Sender)
+{
+ FrameControllerData fcData;
+ SPGetFrameControllerData( SPGetCurrentState() , m_FCIndex , &fcData );
+
+ AnsiString cycles;
+ cycles = cycleForEditBox->Text;
+ int iCycles = 0;
+ try
+ {
+ iCycles = cycles.ToInt();
+ }
+ catch (Exception&)
+ {
+ iCycles = fcData.numberOfCycles;
+ }
+
+ SPSetNumberOfCycles( SPGetCurrentState() , m_FCIndex , iCycles );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrame1::EditBoxExit(TObject *Sender)
+{
+ //do something here
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.dfm b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.dfm
new file mode 100644
index 0000000..fb63774
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.dfm
@@ -0,0 +1,120 @@
+object Frame1: TFrame1
+ Left = 0
+ Top = 0
+ Width = 1066
+ Height = 30
+ TabOrder = 0
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 1066
+ Height = 30
+ Align = alClient
+ BevelInner = bvLowered
+ TabOrder = 0
+ object FrameControllerNameLabel: TLabel
+ Left = 10
+ Top = 7
+ Width = 24
+ Height = 13
+ Caption = 'none'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -8
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label1: TLabel
+ Left = 130
+ Top = 7
+ Width = 52
+ Height = 13
+ Caption = 'Frame: Min'
+ end
+ object Label3: TLabel
+ Left = 256
+ Top = 7
+ Width = 20
+ Height = 13
+ Caption = 'Max'
+ end
+ object Label4: TLabel
+ Left = 720
+ Top = 7
+ Width = 29
+ Height = 13
+ Caption = 'Frame'
+ end
+ object Label5: TLabel
+ Left = 352
+ Top = 8
+ Width = 31
+ Height = 13
+ Caption = 'Speed'
+ end
+ object MinFrameEditBox: TEdit
+ Left = 186
+ Top = 4
+ Width = 60
+ Height = 21
+ TabOrder = 0
+ OnChange = MinFrameEditBoxChange
+ OnExit = EditBoxExit
+ end
+ object MaxFrameEditBox: TEdit
+ Left = 280
+ Top = 4
+ Width = 60
+ Height = 21
+ TabOrder = 1
+ OnChange = MaxFrameEditBoxChange
+ OnExit = EditBoxExit
+ end
+ object CyclicCheckBox: TCheckBox
+ Left = 456
+ Top = 7
+ Width = 49
+ Height = 17
+ Caption = 'Cycle'
+ TabOrder = 2
+ OnClick = CyclicCheckBoxClick
+ end
+ object CurrentFrameLabel: TEdit
+ Left = 760
+ Top = 4
+ Width = 60
+ Height = 21
+ TabOrder = 3
+ end
+ object holdFrameCheckbox: TCheckBox
+ Left = 560
+ Top = 7
+ Width = 57
+ Height = 17
+ Caption = 'Hold'
+ TabOrder = 4
+ OnClick = holdFrameCheckboxClick
+ end
+ object cycleForEditBox: TEdit
+ Left = 503
+ Top = 4
+ Width = 39
+ Height = 21
+ Enabled = False
+ TabOrder = 5
+ Text = '0'
+ OnChange = cycleForEditBoxChange
+ OnExit = EditBoxExit
+ end
+ object speedEditBox: TEdit
+ Left = 387
+ Top = 4
+ Width = 57
+ Height = 21
+ TabOrder = 6
+ OnChange = speedEditBoxChange
+ OnExit = EditBoxExit
+ end
+ end
+end
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.h b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.h
new file mode 100644
index 0000000..fcc0f0a
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/fcframe.h
@@ -0,0 +1,44 @@
+//---------------------------------------------------------------------------
+
+
+#ifndef fcframeH
+#define fcframeH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TFrame1 : public TFrame
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TLabel *FrameControllerNameLabel;
+ TLabel *Label1;
+ TEdit *MinFrameEditBox;
+ TLabel *Label3;
+ TEdit *MaxFrameEditBox;
+ TCheckBox *CyclicCheckBox;
+ TLabel *Label4;
+ TEdit *CurrentFrameLabel;
+ TCheckBox *holdFrameCheckbox;
+ TEdit *cycleForEditBox;
+ TEdit *speedEditBox;
+ TLabel *Label5;
+ void __fastcall CyclicCheckBoxClick(TObject *Sender);
+ void __fastcall MaxFrameEditBoxChange(TObject *Sender);
+ void __fastcall MinFrameEditBoxChange(TObject *Sender);
+ void __fastcall holdFrameCheckboxClick(TObject *Sender);
+ void __fastcall speedEditBoxChange(TObject *Sender);
+ void __fastcall cycleForEditBoxChange(TObject *Sender);
+ void __fastcall EditBoxExit(TObject *Sender);
+private: // User declarations
+ int m_FCIndex;
+public: // User declarations
+ __fastcall TFrame1(TComponent* Owner , int fcindex);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrame1 *Frame1;
+//---------------------------------------------------------------------------
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.cpp
new file mode 100644
index 0000000..1192623
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.cpp
@@ -0,0 +1,704 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include <sp/interface.hpp>
+#include <direct.h>
+
+#include <errno.h>
+#include <dos.h>
+#include <io.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#pragma hdrstop
+
+#include "main.h"
+#include "sp/builder/fcframe.h"
+#include "sp/builder/eventsframe.h"
+
+float g_ForceDataUpdate = false;
+bool g_IsDataSaved = true;
+
+/* returns the attributes of a DOS file */
+int get_file_attrib(char *filename)
+{
+ return(_rtl_chmod(filename, 0));
+}
+//---------------------------------------------------------------------------
+
+void FVUShiftStateToMouse(TShiftState shiftState, int& buttons, int& shift)
+{
+ buttons = 0;
+ if (shiftState.Contains(ssLeft))
+ buttons |= MK_LBUTTON;
+ if (shiftState.Contains(ssRight))
+ buttons |= MK_RBUTTON;
+ if (shiftState.Contains(ssMiddle))
+ buttons |= MK_MBUTTON;
+
+ shift = 0;
+ if (shiftState.Contains(ssShift))
+ shift |= MK_SHIFT;
+ if (shiftState.Contains(ssCtrl))
+ shift |= MK_CONTROL;
+}
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TMainForm *MainForm;
+//---------------------------------------------------------------------------
+__fastcall TMainForm::TMainForm(TComponent* Owner) :
+ TForm(Owner),
+ m_numFCPanels(0),
+ m_numDrawablePanels(0),
+ m_numEvents(0),
+ m_numCallbacks(0),
+ m_CurrentPropState(-1)
+{
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::ApplicationEvents1Idle(TObject *Sender,
+ bool &Done)
+{
+ int i;
+ SPContextAdvance();
+ SPContextDisplay();
+
+ //update frames
+ float currentFrame = SPGetBaseFrameControllerFrame();
+ AnsiString frame;
+ frame.sprintf("%0.3f",currentFrame);
+ CurrentFrameWindow->Text = frame;
+
+ for ( i = 0; i < m_numFCPanels; i++ )
+ {
+ frame.sprintf("%0.3f",SPGetFrameControllerFrame( i ));
+ m_FCPanels[i]->CurrentFrameLabel->Text = frame;
+ }
+
+ Save1->Enabled = ! g_IsDataSaved;
+
+ //check for a new state
+ int newState = SPGetCurrentState();
+ if ( m_CurrentPropState != newState || g_ForceDataUpdate )
+ {
+ UpdateStateInfo();
+ UpdateFrameControllers();
+ UpdateDrawables();
+ UpdateEvents();
+ UpdateCallbacks();
+ m_CurrentPropState = newState;
+ g_ForceDataUpdate = false;
+ }
+
+ static bool bgloaded = false;
+ if ( ! bgloaded )
+ {
+ //load the events list
+ AnsiString fname = Application->ExeName;
+ fname.SetLength( fname.Length() - 13 );
+ fname.cat_sprintf("data\\init.txt");
+ TComboBox* cbox = new TComboBox( this );
+ cbox->Parent = Panel4;
+ cbox->Items->LoadFromFile(fname);
+ if ( cbox->Items->Count >= 1 )
+ {
+ AnsiString bgfilename = cbox->Items->Strings[0];
+ SPLoadBackground( bgfilename.c_str() );
+ }
+
+ delete cbox;
+ bgloaded = true;
+ }
+
+ Done = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::FormShow(TObject *Sender)
+{
+ SPPlatformOpen( Handle );
+
+ HWND desktopHwnd = GetDesktopWindow();
+ RECT rect;
+ GetWindowRect(desktopHwnd, &rect);
+
+ P3DPanel->Width = rect.right - rect.left;
+ P3DPanel->Height = rect.bottom - rect.top;
+ SPContextOpen(P3DPanel->Handle);
+ SPContextViewResize(P3DClientPanel->ClientWidth, P3DClientPanel->ClientHeight);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
+{
+ SPContextClose();
+ SPPlatformClose();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::P3DClientPanelResize(TObject *Sender)
+{
+ SPContextViewResize(P3DClientPanel->ClientWidth, P3DClientPanel->ClientHeight);
+ SPContextDisplay();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::FileOpenExecute(TObject *Sender)
+{
+ if (OpenDialog1->Execute())
+ {
+ int i;
+ SPLoad( OpenDialog1->FileName.c_str() );
+ FileName = OpenDialog1->FileName;
+ m_CurrentPropState = -1;
+
+ //Remove old panels
+ for (i = 0; i < m_numFCPanels; i++)
+ {
+ delete m_FCPanels[i];
+ m_FCPanels[i] = NULL;
+ }
+ m_numFCPanels = 0;
+
+ for (i = 0; i < m_numDrawablePanels; i++)
+ {
+ delete m_DrawablePanels[i];
+ m_DrawablePanels[i] = NULL;
+ }
+ m_numDrawablePanels = 0;
+
+ //Set up new panels
+ int numfc = SPGetNumFrameControllers();
+ m_numFCPanels = numfc;
+ for (i = 0; i < numfc; i++ )
+ {
+ AnsiString framename;
+ framename.sprintf("fcframe%i", i );
+ TFrame1* f = new TFrame1( this , i );
+ f->Parent = Panel4;
+ f->Name = framename;
+ m_FCPanels[i] = f;
+ }
+ Panel2->Height = numfc * 33 + 35 + 32;
+ int panel4height = numfc * 33;
+ if ( panel4height < 6 * 33 )
+ {
+ Panel4->Height = numfc * 33;
+ }
+ else
+ {
+ Panel4->Height = 6 * 33;
+ }
+
+ for (i = numfc - 1; i >= 0; i-- )
+ {
+ m_FCPanels[i]->Align = alTop;
+ }
+
+ m_numDrawablePanels = SPGetNumDrawables();
+ for (i = 0; i < m_numDrawablePanels; i++ )
+ {
+ AnsiString framename;
+ framename.sprintf("drawframe%i", i );
+ TFrame2* f = new TFrame2( this , i );
+ f->Parent = Panel5;
+ f->Name = framename;
+ m_DrawablePanels[i] = f;
+ }
+ for ( i = m_numDrawablePanels-1; i >= 0; i-- )
+ {
+ m_DrawablePanels[i]->Align = alTop;
+ }
+ g_IsDataSaved = true;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::P3DPanelMouseDown(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+ int buttons, shift;
+ FVUShiftStateToMouse(Shift, buttons, shift);
+ SPContextMouseDown(buttons, shift, X, Y);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::P3DPanelMouseMove(TObject *Sender,
+ TShiftState Shift, int X, int Y)
+{
+ int buttons, shift;
+ FVUShiftStateToMouse(Shift, buttons, shift);
+ SPContextMouseMove(buttons, shift, X, Y);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::P3DPanelMouseUp(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+ int buttons, shift;
+ FVUShiftStateToMouse(Shift, buttons, shift);
+ SPContextMouseUp(buttons, shift, X, Y);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::FormKeyPress(TObject *Sender, char &Key)
+{
+ switch (Key)
+ {
+ case '.':
+ SPNextState();
+ g_ForceDataUpdate = true;
+ break;
+ case ',':
+ SPPrevState();
+ g_ForceDataUpdate = true;
+ break;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::PlayButtonClick(TObject *Sender)
+{
+ static bool play = true;
+ SPPause( play );
+ play = !play;
+ if (play)
+ {
+ PlayButton->Caption = "| |";
+ }
+ else
+ {
+ PlayButton->Caption = ">";
+ }
+}
+//---------------------------------------------------------------------------
+
+
+
+void __fastcall TMainForm::PrevStatebuttonClick(TObject *Sender)
+{
+ SPPrevState();
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::NextStateButtonClick(TObject *Sender)
+{
+ SPNextState();
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::ForwardStepButtonClick(TObject *Sender)
+{
+ SPAdvanceOneFrame();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::BackStepButtonClick(TObject *Sender)
+{
+ SPBackOneFrame();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button1Click(TObject *Sender)
+{
+ SPAddEvent( "" , 0 , 0 , SPGetCurrentState() );
+ UpdateEvents();
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::UpdateStateInfo()
+{
+ AnsiString propname;
+ propname.sprintf( "%s", SPGetPropName() );
+ PropNameLabel->Caption = propname;
+ PropNameLabelTop->Caption = propname;
+
+ AnsiString numstates;
+ numstates.sprintf("%i", SPGetNumberOfStates() );
+ NumPropStatesLabel->Caption = numstates;
+ NumPropStatesLabelTop->Caption = numstates;
+
+ AnsiString curstate;
+ curstate.sprintf("%i" , SPGetCurrentState() + 1 );
+ CurrentStateLabel->Caption = curstate;
+ CurrentStateLabelTop->Caption = curstate;
+ StateStateLabel->Caption = curstate;
+
+ TransitionData transitionData;
+ if ( SPGetTransitionData( SPGetCurrentState() , &transitionData ) )
+ {
+ AutoTransitionCheckBox->Checked = transitionData.autoTransition;
+
+ AnsiString tostate;
+ tostate.sprintf("%i", transitionData.toState + 1);
+ ToStateEditBox->Text = tostate;
+ ToStateEditBox->Enabled = transitionData.autoTransition;
+
+ AnsiString onframe;
+ onframe.sprintf("%0.3f", transitionData.onFrame );
+ OnFrameEditBox->Text = onframe;
+ OnFrameEditBox->Enabled = transitionData.autoTransition;
+ }
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::UpdateFrameControllers()
+{
+ //Set up fc's
+ int i;
+ for ( i = 0; i < m_numFCPanels; i++ )
+ {
+ AnsiString text;
+ text.sprintf("%s",SPGetFrameControllerName( i ));
+ m_FCPanels[i]->FrameControllerNameLabel->Caption = text;
+
+ FrameControllerData fcData;
+ if ( SPGetFrameControllerData( SPGetCurrentState() , i , &fcData ) )
+ {
+ text.sprintf("%0.3f", fcData.minFrame );
+ m_FCPanels[i]->MinFrameEditBox->Text = text;
+
+ text.sprintf("%0.3f",fcData.maxFrame);
+ m_FCPanels[i]->MaxFrameEditBox->Text = text;
+
+ text.sprintf("%0.3f", fcData.relativeSpeed );
+ m_FCPanels[i]->speedEditBox->Text = text;
+
+ if ( fcData.isCyclic )
+ {
+ m_FCPanels[i]->CyclicCheckBox->State = cbChecked;
+ }
+ else
+ {
+ m_FCPanels[i]->CyclicCheckBox->State = cbUnchecked;
+ }
+ m_FCPanels[i]->holdFrameCheckbox->Checked = fcData.holdFrame;
+
+ if ( fcData.numberOfCycles == 0 )
+ {
+ text.sprintf("forever" );
+ m_FCPanels[i]->cycleForEditBox->Text = text;
+ }
+ else
+ {
+ text.sprintf("%i" , fcData.numberOfCycles);
+ m_FCPanels[i]->cycleForEditBox->Text = text;
+ }
+
+ m_FCPanels[i]->cycleForEditBox->Enabled = m_FCPanels[i]->CyclicCheckBox->State != cbUnchecked;
+ }
+ }
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::UpdateDrawables()
+{
+ //Set up drawables
+ int i;
+ for ( i = 0; i < m_numDrawablePanels; i++ )
+ {
+ AnsiString n;
+ n.sprintf("%s",SPGetDrawableName( i ));
+ m_DrawablePanels[i]->NameLabel->Caption = n;
+
+ VisibilityData visData;
+ if ( SPGetVisibilityData( SPGetCurrentState() , i , &visData ) )
+ {
+ if ( visData.isVisible )
+ {
+ m_DrawablePanels[i]->VisibilityCheckBox->State = cbChecked;
+ }
+ else
+ {
+ m_DrawablePanels[i]->VisibilityCheckBox->State = cbUnchecked;
+ }
+ }
+ }
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::UpdateEvents()
+{
+ int i;
+ for ( i = 0; i < m_numEvents; i++ )
+ {
+ //delete old panels
+ delete m_EventPanels[i];
+ m_EventPanels[i] = NULL;
+ }
+ m_numEvents = SPGetNumberOfEvents( SPGetCurrentState() );
+ for ( i = 0; i < m_numEvents; i++ )
+ {
+ //create panels
+ AnsiString framename;
+ framename.sprintf("eventframe%i", i );
+ TFrame3* f = new TFrame3( this , i );
+ f->Parent = Panel6;
+ f->Name = framename;
+
+ //load the events list
+ AnsiString fname = Application->ExeName;
+ fname.SetLength( fname.Length() - 13 );
+ fname.cat_sprintf("data\\events.txt");
+ f->EventComboBox->Items->LoadFromFile(fname);
+
+ //set up events fields
+ EventData eventData;
+ if ( SPGetEventData( SPGetCurrentState() , i , &eventData ) )
+ {
+ AnsiString eventname;
+ eventname.sprintf( eventData.eventName );
+ int eventindex = f->EventComboBox->Items->IndexOf( eventname );
+ f->EventComboBox->ItemIndex = eventindex;
+ AnsiString toState;
+ toState.sprintf("%i", eventData.toState + 1);
+ f->ToFrameEditBox->Text = toState;
+ }
+
+ //add panel to panel list
+ m_EventPanels[i] = f;
+ }
+
+ for ( i = m_numEvents-1; i >= 0 ; i-- )
+ {
+ m_EventPanels[i]->Align = alTop;
+ }
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::UpdateCallbacks()
+{
+ int i;
+ for ( i = 0; i < m_numCallbacks; i++ )
+ {
+ //delete old panels
+ delete m_CallbackPanels[i];
+ m_CallbackPanels[i] = NULL;
+ }
+ m_numCallbacks = SPGetNumberOfCallbacks( SPGetCurrentState() );
+ for ( i = 0; i < m_numCallbacks; i++ )
+ {
+ //create panels
+ AnsiString framename;
+ framename.sprintf("callbackframe%i", i );
+ TFrame4* f = new TFrame4( this , i );
+ f->Parent = CallbackPanel;
+ f->Name = framename;
+
+ //load the callbacks list
+ AnsiString fname = Application->ExeName;
+ fname.SetLength( fname.Length() - 13 );
+ fname.cat_sprintf("data\\callbacks.txt");
+ f->CallbackComboBox->Items->LoadFromFile(fname);
+
+ CallbackData cbData;
+ if ( SPGetCallbackData( SPGetCurrentState() , i , &cbData ) )
+ {
+ //set up events fields
+ AnsiString callbackname;
+ callbackname.sprintf( cbData.callbackName );
+ int cbindex = f->CallbackComboBox->Items->IndexOf( callbackname );
+ f->CallbackComboBox->ItemIndex = cbindex;
+ AnsiString onFrame;
+ onFrame.sprintf("%0.3f", cbData.onFrame );
+ f->OnFrameEditBox->Text = onFrame;
+ }
+ //add panel to panel list
+ m_CallbackPanels[i] = f;
+ }
+
+ for ( i = m_numCallbacks-1; i >= 0 ; i-- )
+ {
+ m_CallbackPanels[i]->Align = alTop;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button2Click(TObject *Sender)
+{
+ SPAddCallback( SPGetCurrentState() , "" , 0 , 0.f );
+ UpdateCallbacks();
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Save1Click(TObject *Sender)
+{
+ SaveData();
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::SaveData()
+{
+ char buf[256];
+ memcpy( buf , FileName.c_str() , strlen(FileName.c_str()) - 4 );
+ buf[strlen(FileName.c_str()) - 4] = '\0';
+ strcat(buf , "data.p3d");
+
+ int attrib = get_file_attrib( buf );
+
+ if ( ( attrib & FA_RDONLY ) && ( attrib != -1 ) )
+ {
+ AnsiString out;
+ out.sprintf( "%s is read-only.\n" , FileName.c_str() );
+ if ( Application->MessageBox( out.c_str() , "" , MB_RETRYCANCEL ) == IDRETRY )
+ {
+ SaveData();
+ }
+ }
+ else
+ {
+ SPExportStatePropData( FileName.c_str() );
+ g_IsDataSaved = true;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::FileSaveExecute(TObject *Sender)
+{
+ SaveData();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::AutoTransitionCheckBoxClick(TObject *Sender)
+{
+ bool autotransition = AutoTransitionCheckBox->State == cbChecked ? true : false;
+ SPSetAutoTransition( SPGetCurrentState() , autotransition );
+ g_ForceDataUpdate = true;
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::ToStateEditBoxChange(TObject *Sender)
+{
+ AnsiString toState = ToStateEditBox->Text;
+ int state = 0;
+ try
+ {
+ state = toState.ToInt();
+ }
+ catch (Exception&)
+ {
+ TransitionData tranData;
+ SPGetTransitionData( SPGetCurrentState() , &tranData );
+ state = tranData.toState + 1;
+ }
+ if ( state > SPGetNumberOfStates() || state <= 0 )
+ {
+ state = 1;
+ }
+ SPSetAutoTransitionToState( SPGetCurrentState() , state - 1 );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::OnFrameEditBoxChange(TObject *Sender)
+{
+ AnsiString toframe = OnFrameEditBox->Text;
+ float frame = 0;
+ try
+ {
+ frame = toframe.ToDouble();
+ }
+ catch (Exception&)
+ {
+ TransitionData tranData;
+ SPGetTransitionData( SPGetCurrentState() , &tranData );
+ frame = tranData.onFrame;
+ }
+
+ SPSetAutoTransitionOnFrame( SPGetCurrentState() , frame );
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button4Click(TObject *Sender)
+{
+ AnsiString caption;
+ caption.sprintf("Delete State");
+ AnsiString out;
+ out.sprintf( "Delete State: %i\n It won't come back!", SPGetCurrentState() + 1 );
+ if ( Application->MessageBox(out.c_str() , caption.c_str() , MB_YESNO) != IDOK )
+ {
+ SPDeleteState( SPGetCurrentState() );
+ if ( SPGetCurrentState() - 1 >= 0 )
+ {
+ SPSetState( SPGetCurrentState() - 1 );
+ }
+ g_ForceDataUpdate = true;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button3Click(TObject *Sender)
+{
+ SPInsertState( SPGetCurrentState() );
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+void __fastcall TMainForm::Button6Click(TObject *Sender)
+{
+ SPHideAll( SPGetCurrentState() );
+ g_ForceDataUpdate = true;
+ g_IsDataSaved = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button7Click(TObject *Sender)
+{
+ SPShowAll( SPGetCurrentState() );
+ g_ForceDataUpdate = true;
+ g_IsDataSaved = false;
+}
+
+//---------------------------------------------------------------------------
+void __fastcall TMainForm::B1Click(TObject *Sender)
+{
+ if ( ColorDialog1->Execute() )
+ {
+ TColor color = ColorDialog1->Color;
+ int blue = (int) ((color & 0x00ff0000) >> 16);
+ int green = (int) ((color & 0x0000ff00) >> 8);
+ int red = (int) ((color & 0x000000ff));
+ SPSetBackgroundColour( red , green , blue );
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::PDDICheckBoxClick(TObject *Sender)
+{
+ SPContextSetIsPDDIStatsEnabled( PDDICheckBox->Checked );
+}
+//---------------------------------------------------------------------------
+
+
+
+void __fastcall TMainForm::ToStateEditBoxExit(TObject *Sender)
+{
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::OnFrameEditBoxExit(TObject *Sender)
+{
+ g_ForceDataUpdate = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::P3DBackgroundArt1Click(TObject *Sender)
+{
+ if (OpenDialog1->Execute())
+ {
+ SPLoadBackground( OpenDialog1->FileName.c_str() );
+ }
+}
+//---------------------------------------------------------------------------
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.dfm b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.dfm
new file mode 100644
index 0000000..0b6eee2
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.dfm
@@ -0,0 +1,783 @@
+object MainForm: TMainForm
+ Left = 197
+ Top = 118
+ Width = 1262
+ Height = 869
+ Caption = 'State Animation Builder'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ Menu = MainMenu1
+ OldCreateOrder = False
+ OnClose = FormClose
+ OnKeyPress = FormKeyPress
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter2: TSplitter
+ Left = 0
+ Top = 628
+ Width = 1254
+ Height = 3
+ Cursor = crVSplit
+ Align = alBottom
+ end
+ object Splitter1: TSplitter
+ Left = 230
+ Top = 0
+ Width = 3
+ Height = 628
+ Cursor = crHSplit
+ end
+ object Panel2: TPanel
+ Left = 0
+ Top = 631
+ Width = 1254
+ Height = 192
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Panel3: TPanel
+ Left = 0
+ Top = 0
+ Width = 1254
+ Height = 33
+ Align = alTop
+ BevelInner = bvLowered
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 2
+ Top = 2
+ Width = 31
+ Height = 29
+ Align = alLeft
+ Caption = ' Prop: '
+ end
+ object PropNameLabel: TLabel
+ Left = 33
+ Top = 2
+ Width = 24
+ Height = 29
+ Align = alLeft
+ Caption = 'none'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label2: TLabel
+ Left = 124
+ Top = 2
+ Width = 26
+ Height = 29
+ Align = alLeft
+ Caption = ' Of: '
+ end
+ object NumPropStatesLabel: TLabel
+ Left = 150
+ Top = 2
+ Width = 6
+ Height = 29
+ Align = alLeft
+ Caption = '0'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label3: TLabel
+ Left = 57
+ Top = 2
+ Width = 61
+ Height = 29
+ Align = alLeft
+ Caption = ' State: '
+ end
+ object CurrentStateLabel: TLabel
+ Left = 118
+ Top = 2
+ Width = 6
+ Height = 29
+ Align = alLeft
+ Caption = '0'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label4: TLabel
+ Left = 720
+ Top = 7
+ Width = 29
+ Height = 13
+ Caption = 'Frame'
+ end
+ object PlayButton: TButton
+ Left = 560
+ Top = 5
+ Width = 30
+ Height = 20
+ Hint = 'Play / Pause'
+ Caption = '| |'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 0
+ OnClick = PlayButtonClick
+ end
+ object ForwardStepButton: TButton
+ Left = 592
+ Top = 5
+ Width = 30
+ Height = 20
+ Hint = 'Step Forward One Frame'
+ Caption = '> |'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 1
+ OnClick = ForwardStepButtonClick
+ end
+ object BackStepButton: TButton
+ Left = 528
+ Top = 5
+ Width = 30
+ Height = 20
+ Hint = 'Step Back One Frame'
+ Caption = '| <'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 2
+ OnClick = BackStepButtonClick
+ end
+ object CurrentFrameWindow: TEdit
+ Left = 760
+ Top = 4
+ Width = 60
+ Height = 21
+ Hint = 'Current Frame, seconds'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 3
+ end
+ object PrevStatebutton: TButton
+ Left = 495
+ Top = 5
+ Width = 30
+ Height = 20
+ Hint = 'Previous State'
+ Caption = '| <<'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 4
+ OnClick = PrevStatebuttonClick
+ end
+ object NextStateButton: TButton
+ Left = 624
+ Top = 5
+ Width = 30
+ Height = 20
+ Hint = 'Next State'
+ Caption = '>> |'
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 5
+ OnClick = NextStateButtonClick
+ end
+ end
+ object Panel4: TScrollBox
+ Left = 0
+ Top = 33
+ Width = 1254
+ Height = 159
+ Align = alClient
+ BorderStyle = bsNone
+ TabOrder = 1
+ end
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 230
+ Height = 628
+ Align = alLeft
+ BevelOuter = bvNone
+ TabOrder = 1
+ object PageControl1: TPageControl
+ Left = 0
+ Top = 0
+ Width = 230
+ Height = 628
+ ActivePage = TabSheet1
+ Align = alClient
+ MultiLine = True
+ TabOrder = 0
+ object TabSheet1: TTabSheet
+ Caption = 'Drawables'
+ object Panel12: TPanel
+ Left = 0
+ Top = 0
+ Width = 222
+ Height = 41
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Button6: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Hide All'
+ TabOrder = 0
+ OnClick = Button6Click
+ end
+ object Button7: TButton
+ Left = 96
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Show All'
+ TabOrder = 1
+ OnClick = Button7Click
+ end
+ end
+ object Panel5: TScrollBox
+ Left = 0
+ Top = 41
+ Width = 222
+ Height = 559
+ Align = alClient
+ BorderStyle = bsNone
+ TabOrder = 1
+ end
+ end
+ object TabSheet2: TTabSheet
+ Caption = 'Events'
+ ImageIndex = 1
+ object EventsPanel: TPanel
+ Left = 0
+ Top = 0
+ Width = 222
+ Height = 41
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Button1: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Add Event'
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+ end
+ object Panel6: TScrollBox
+ Left = 0
+ Top = 41
+ Width = 222
+ Height = 559
+ Align = alClient
+ BorderStyle = bsNone
+ TabOrder = 1
+ end
+ end
+ object TabSheet3: TTabSheet
+ Caption = 'Callbacks'
+ ImageIndex = 2
+ object Panel7: TPanel
+ Left = 0
+ Top = 0
+ Width = 222
+ Height = 600
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Panel8: TPanel
+ Left = 0
+ Top = 0
+ Width = 222
+ Height = 41
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Button2: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Add Callback'
+ TabOrder = 0
+ OnClick = Button2Click
+ end
+ end
+ object CallbackPanel: TScrollBox
+ Left = 0
+ Top = 41
+ Width = 222
+ Height = 559
+ Align = alClient
+ BorderStyle = bsNone
+ TabOrder = 1
+ end
+ end
+ end
+ object TabSheet4: TTabSheet
+ Caption = 'State'
+ ImageIndex = 3
+ object Panel11: TPanel
+ Left = 0
+ Top = 0
+ Width = 222
+ Height = 265
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label10: TLabel
+ Left = 7
+ Top = 10
+ Width = 34
+ Height = 16
+ Caption = 'State:'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -15
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object StateStateLabel: TLabel
+ Left = 42
+ Top = 10
+ Width = 7
+ Height = 16
+ Caption = '0'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -15
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label6: TLabel
+ Left = 8
+ Top = 130
+ Width = 44
+ Height = 13
+ Caption = 'To State:'
+ end
+ object Label8: TLabel
+ Left = 8
+ Top = 154
+ Width = 49
+ Height = 13
+ Caption = 'On Frame:'
+ end
+ object AutoTransitionCheckBox: TCheckBox
+ Left = 8
+ Top = 105
+ Width = 97
+ Height = 17
+ Caption = 'Auto Transition'
+ TabOrder = 0
+ OnClick = AutoTransitionCheckBoxClick
+ end
+ object ToStateEditBox: TEdit
+ Left = 64
+ Top = 126
+ Width = 41
+ Height = 21
+ TabOrder = 1
+ OnChange = ToStateEditBoxChange
+ OnExit = ToStateEditBoxExit
+ end
+ object OnFrameEditBox: TEdit
+ Left = 64
+ Top = 150
+ Width = 41
+ Height = 21
+ TabOrder = 2
+ OnChange = OnFrameEditBoxChange
+ OnExit = OnFrameEditBoxExit
+ end
+ object Button4: TButton
+ Left = 8
+ Top = 64
+ Width = 75
+ Height = 25
+ Caption = 'Delete State'
+ TabOrder = 3
+ OnClick = Button4Click
+ end
+ object Button3: TButton
+ Left = 8
+ Top = 32
+ Width = 75
+ Height = 25
+ Caption = 'Add State'
+ TabOrder = 4
+ OnClick = Button3Click
+ end
+ object PDDICheckBox: TCheckBox
+ Left = 8
+ Top = 184
+ Width = 97
+ Height = 17
+ Caption = 'PDDI Stats'
+ TabOrder = 5
+ OnClick = PDDICheckBoxClick
+ end
+ end
+ end
+ end
+ end
+ object Panel9: TPanel
+ Left = 233
+ Top = 0
+ Width = 1021
+ Height = 628
+ Align = alClient
+ BevelOuter = bvNone
+ Caption = 'Panel9'
+ TabOrder = 2
+ object P3DClientPanel: TPanel
+ Left = 0
+ Top = 33
+ Width = 1021
+ Height = 595
+ Align = alClient
+ BevelInner = bvLowered
+ Caption = 'P3DClientPanel'
+ Color = clCaptionText
+ TabOrder = 0
+ OnResize = P3DClientPanelResize
+ object P3DPanel: TPanel
+ Left = 2
+ Top = 2
+ Width = 1065
+ Height = 793
+ BevelOuter = bvNone
+ Color = clActiveCaption
+ TabOrder = 0
+ OnMouseDown = P3DPanelMouseDown
+ OnMouseMove = P3DPanelMouseMove
+ OnMouseUp = P3DPanelMouseUp
+ end
+ end
+ object Panel10: TPanel
+ Left = 0
+ Top = 0
+ Width = 1021
+ Height = 33
+ Align = alTop
+ BevelInner = bvLowered
+ TabOrder = 1
+ object Label5: TLabel
+ Left = 10
+ Top = 7
+ Width = 41
+ Height = 20
+ Caption = 'Prop: '
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object PropNameLabelTop: TLabel
+ Left = 56
+ Top = 7
+ Width = 36
+ Height = 20
+ Caption = 'none'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object NumPropStatesLabelTop: TLabel
+ Left = 309
+ Top = 7
+ Width = 9
+ Height = 20
+ Caption = '0'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label9: TLabel
+ Left = 210
+ Top = 7
+ Width = 43
+ Height = 20
+ Caption = 'State:'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object CurrentStateLabelTop: TLabel
+ Left = 256
+ Top = 7
+ Width = 9
+ Height = 20
+ Caption = '0'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object Label7: TLabel
+ Left = 286
+ Top = 7
+ Width = 21
+ Height = 20
+ Caption = 'Of:'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -16
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ end
+ end
+ object ApplicationEvents1: TApplicationEvents
+ OnIdle = ApplicationEvents1Idle
+ Left = 1040
+ Top = 72
+ end
+ object MainMenu1: TMainMenu
+ Images = ImageList1
+ Left = 1072
+ Top = 72
+ object N1: TMenuItem
+ Caption = '&File'
+ object Open1: TMenuItem
+ Action = FileOpen
+ end
+ object Save1: TMenuItem
+ Action = FileSave
+ end
+ object Exit1: TMenuItem
+ Action = FileExit
+ end
+ end
+ object Edit1: TMenuItem
+ Caption = '&Edit'
+ object B1: TMenuItem
+ Caption = '&Background Color'
+ OnClick = B1Click
+ end
+ object P3DBackgroundArt1: TMenuItem
+ Caption = '&P3D Background Art'
+ OnClick = P3DBackgroundArt1Click
+ end
+ end
+ object Help1: TMenuItem
+ Caption = '&Help'
+ object About1: TMenuItem
+ Action = HelpAbout
+ end
+ end
+ end
+ object ActionList1: TActionList
+ Left = 1136
+ Top = 72
+ object FileOpen: TAction
+ Category = 'File'
+ Caption = '&Open'
+ Hint = 'Open File'
+ ImageIndex = 0
+ OnExecute = FileOpenExecute
+ end
+ object FileSave: TAction
+ Category = 'File'
+ Caption = '&Save'
+ Hint = 'Save File'
+ ImageIndex = 1
+ OnExecute = FileSaveExecute
+ end
+ object FileExit: TAction
+ Category = 'File'
+ Caption = '&Exit'
+ Hint = 'Exit Application'
+ end
+ object HelpAbout: TAction
+ Category = 'Help'
+ Caption = '&About'
+ end
+ end
+ object ImageList1: TImageList
+ Left = 1104
+ Top = 72
+ Bitmap = {
+ 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000001000000001002000000000000010
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000084
+ 8400000000000000000000000000000000000000000000000000C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000084
+ 8400008484000084840000848400008484000084840000848400008484000000
+ 0000000000000000000000000000000000000000000000000000008484000084
+ 8400000000000000000000000000000000000000000000000000C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000084
+ 8400008484000084840000848400008484000084840000848400008484000084
+ 8400000000000000000000000000000000000000000000000000008484000084
+ 8400000000000000000000000000000000000000000000000000C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF0000FFFF000000
+ 0000008484000084840000848400008484000084840000848400008484000084
+ 8400008484000000000000000000000000000000000000000000008484000084
+ 8400000000000000000000000000000000000000000000000000000000000000
+ 0000000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
+ FF00000000000084840000848400008484000084840000848400008484000084
+ 8400008484000084840000000000000000000000000000000000008484000084
+ 8400008484000084840000848400008484000084840000848400008484000084
+ 8400008484000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000084
+ 8400000000000000000000000000000000000000000000000000000000000000
+ 0000008484000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
+ FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600000000000084840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000008484000000
+ 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C60000000000C6C6C60000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000100000000100010000000000800000000000000000000000
+ 000000000000000000000000FFFFFF00FFFFFFFF00000000FFFFC00100000000
+ 001F800100000000000F80010000000000078001000000000003800100000000
+ 00018001000000000000800100000000001F800100000000001F800100000000
+ 001F8001000000008FF1800100000000FFF9800100000000FF75800100000000
+ FF8F800100000000FFFFFFFF0000000000000000000000000000000000000000
+ 000000000000}
+ end
+ object OpenDialog1: TOpenDialog
+ DefaultExt = 'p3d'
+ Filter = 'P3D|*.p3d|All files|*.*'
+ Title = 'Open File'
+ Left = 1042
+ Top = 112
+ end
+ object ColorDialog1: TColorDialog
+ Ctl3D = True
+ Left = 1075
+ Top = 115
+ end
+end
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.h b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.h
new file mode 100644
index 0000000..23fc13d
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/main.h
@@ -0,0 +1,163 @@
+//---------------------------------------------------------------------------
+
+#ifndef mainH
+#define mainH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <AppEvnts.hpp>
+#include <ExtCtrls.hpp>
+#include <ComCtrls.hpp>
+#include <Menus.hpp>
+#include <ActnList.hpp>
+#include <ImgList.hpp>
+#include <Dialogs.hpp>
+#include <CheckLst.hpp>
+#include "fcframe.h"
+#include "visframe.h"
+#include "eventsframe.h"
+#include "callbacksframe.h"
+
+//---------------------------------------------------------------------------
+class TMainForm : public TForm
+{
+__published: // IDE-managed Components
+ TApplicationEvents *ApplicationEvents1;
+ TSplitter *Splitter2;
+ TPanel *Panel2;
+ TPanel *Panel1;
+ TSplitter *Splitter1;
+ TMainMenu *MainMenu1;
+ TMenuItem *N1;
+ TMenuItem *Open1;
+ TMenuItem *Save1;
+ TActionList *ActionList1;
+ TImageList *ImageList1;
+ TAction *FileOpen;
+ TAction *FileSave;
+ TAction *FileExit;
+ TAction *HelpAbout;
+ TMenuItem *Exit1;
+ TMenuItem *Edit1;
+ TMenuItem *Help1;
+ TMenuItem *About1;
+ TOpenDialog *OpenDialog1;
+ TPanel *Panel3;
+ TLabel *Label1;
+ TLabel *PropNameLabel;
+ TLabel *Label2;
+ TLabel *NumPropStatesLabel;
+ TLabel *Label3;
+ TLabel *CurrentStateLabel;
+ TButton *PlayButton;
+ TButton *ForwardStepButton;
+ TButton *BackStepButton;
+ TEdit *CurrentFrameWindow;
+ TButton *PrevStatebutton;
+ TButton *NextStateButton;
+ TLabel *Label4;
+ TPageControl *PageControl1;
+ TTabSheet *TabSheet1;
+ TTabSheet *TabSheet2;
+ TTabSheet *TabSheet3;
+ TPanel *EventsPanel;
+ TButton *Button1;
+ TPanel *Panel7;
+ TPanel *Panel8;
+ TButton *Button2;
+ TPanel *Panel9;
+ TPanel *P3DClientPanel;
+ TPanel *P3DPanel;
+ TPanel *Panel10;
+ TLabel *Label5;
+ TLabel *PropNameLabelTop;
+ TLabel *NumPropStatesLabelTop;
+ TLabel *Label9;
+ TLabel *CurrentStateLabelTop;
+ TTabSheet *TabSheet4;
+ TPanel *Panel11;
+ TLabel *Label10;
+ TLabel *StateStateLabel;
+ TCheckBox *AutoTransitionCheckBox;
+ TLabel *Label6;
+ TEdit *ToStateEditBox;
+ TLabel *Label8;
+ TEdit *OnFrameEditBox;
+ TButton *Button4;
+ TButton *Button3;
+ TLabel *Label7;
+ TPanel *Panel12;
+ TButton *Button6;
+ TButton *Button7;
+ TScrollBox *Panel5;
+ TScrollBox *Panel6;
+ TScrollBox *CallbackPanel;
+ TScrollBox *Panel4;
+ TMenuItem *B1;
+ TColorDialog *ColorDialog1;
+ TCheckBox *PDDICheckBox;
+ TMenuItem *P3DBackgroundArt1;
+ void __fastcall ApplicationEvents1Idle(TObject *Sender,
+ bool &Done);
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+ void __fastcall P3DClientPanelResize(TObject *Sender);
+ void __fastcall FileOpenExecute(TObject *Sender);
+ void __fastcall P3DPanelMouseDown(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y);
+ void __fastcall P3DPanelMouseMove(TObject *Sender,
+ TShiftState Shift, int X, int Y);
+ void __fastcall P3DPanelMouseUp(TObject *Sender,
+ TMouseButton Button, TShiftState Shift, int X, int Y);
+ void __fastcall FormKeyPress(TObject *Sender, char &Key);
+ void __fastcall PlayButtonClick(TObject *Sender);
+ void __fastcall PrevStatebuttonClick(TObject *Sender);
+ void __fastcall NextStateButtonClick(TObject *Sender);
+ void __fastcall ForwardStepButtonClick(TObject *Sender);
+ void __fastcall BackStepButtonClick(TObject *Sender);
+ void __fastcall Button1Click(TObject *Sender);
+ void __fastcall Button2Click(TObject *Sender);
+ void __fastcall Save1Click(TObject *Sender);
+ void __fastcall FileSaveExecute(TObject *Sender);
+ void __fastcall AutoTransitionCheckBoxClick(TObject *Sender);
+ void __fastcall ToStateEditBoxChange(TObject *Sender);
+ void __fastcall OnFrameEditBoxChange(TObject *Sender);
+ void __fastcall Button4Click(TObject *Sender);
+ void __fastcall Button3Click(TObject *Sender);
+ void __fastcall Button6Click(TObject *Sender);
+ void __fastcall Button7Click(TObject *Sender);
+ void __fastcall B1Click(TObject *Sender);
+ void __fastcall PDDICheckBoxClick(TObject *Sender);
+ void __fastcall ToStateEditBoxExit(TObject *Sender);
+ void __fastcall OnFrameEditBoxExit(TObject *Sender);
+ void __fastcall P3DBackgroundArt1Click(TObject *Sender);
+private: // User declarations
+ int m_CurrentPropState;
+ int m_numFCPanels;
+ TFrame1* m_FCPanels[250];
+ int m_numDrawablePanels;
+ TFrame2* m_DrawablePanels[250];
+ int m_numEvents;
+ TFrame3* m_EventPanels[250];
+ int m_numCallbacks;
+ TFrame4* m_CallbackPanels[250];
+ int m_numForces;
+
+ void UpdateStateInfo();
+ void UpdateFrameControllers();
+ void UpdateDrawables();
+ void UpdateEvents();
+ void UpdateCallbacks();
+ void SaveData();
+
+public: // User declarations
+ __fastcall TMainForm(TComponent* Owner);
+
+ AnsiString FileName;
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TMainForm *MainForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.cpp
new file mode 100644
index 0000000..66f224e
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.cpp
@@ -0,0 +1,24 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include <sp/interface.hpp>
+#pragma hdrstop
+
+#include "visframe.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrame2 *Frame2;
+//---------------------------------------------------------------------------
+__fastcall TFrame2::TFrame2(TComponent* Owner , int dindex )
+ : TFrame(Owner),
+ m_DrawableIndex( dindex )
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrame2::VisibilityCheckBoxClick(TObject *Sender)
+{
+ SPSetVisible( SPGetCurrentState() , m_DrawableIndex , this->VisibilityCheckBox->State != cbUnchecked );
+}
+//---------------------------------------------------------------------------
+
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.dfm b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.dfm
new file mode 100644
index 0000000..c9010d2
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.dfm
@@ -0,0 +1,42 @@
+object Frame2: TFrame2
+ Left = 0
+ Top = 0
+ Width = 152
+ Height = 43
+ TabOrder = 0
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 152
+ Height = 43
+ Align = alClient
+ BevelInner = bvLowered
+ TabOrder = 0
+ object NameLabel: TLabel
+ Left = 8
+ Top = 5
+ Width = 26
+ Height = 13
+ Caption = 'name'
+ Color = clSilver
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clNavy
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentColor = False
+ ParentFont = False
+ end
+ object VisibilityCheckBox: TCheckBox
+ Left = 8
+ Top = 21
+ Width = 97
+ Height = 17
+ Caption = 'Visible'
+ ParentShowHint = False
+ ShowHint = False
+ TabOrder = 0
+ OnClick = VisibilityCheckBoxClick
+ end
+ end
+end
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.h b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.h
new file mode 100644
index 0000000..aacf3da
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/builder/visframe.h
@@ -0,0 +1,28 @@
+//---------------------------------------------------------------------------
+
+
+#ifndef visframeH
+#define visframeH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TFrame2 : public TFrame
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TCheckBox *VisibilityCheckBox;
+ TLabel *NameLabel;
+ void __fastcall VisibilityCheckBoxClick(TObject *Sender);
+private: // User declarations
+ int m_DrawableIndex;
+public: // User declarations
+ __fastcall TFrame2(TComponent* Owner , int dindex );
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrame2 *Frame2;
+//---------------------------------------------------------------------------
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.cpp
new file mode 100644
index 0000000..2c10a5b
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.cpp
@@ -0,0 +1,59 @@
+
+
+#include "aicollisionsolveragent.hpp"
+#include "simcollision/collisionanalyserdata.hpp"
+
+AICollisionSolverAgent::AICollisionSolverAgent()
+{
+ EnableCollisionAnalyser();
+}
+
+AICollisionSolverAgent::~AICollisionSolverAgent()
+{
+ DisableCollisionAnalyser();
+}
+
+
+// =======================================================
+// PRE_COLLISION_EVENT
+//
+sim::Solving_Answer AICollisionSolverAgent::PreCollisionEvent(sim::Collision& inCollision, int inPass)
+{
+ return sim::Solving_Continue;
+}
+
+
+// =======================================================
+// COLLISION_EVENT
+//
+sim::Solving_Answer AICollisionSolverAgent::CollisionEvent(
+ sim::SimState* inSimStateA, int indexA,
+ sim::SimState* inSimStateB, int indexB,
+ const rmt::Vector& inPos, float inDvN, float inDvT)
+{
+
+ return sim::Solving_Continue;
+}
+
+
+// =======================================================
+// TEST_IMPULSE
+//
+sim::Solving_Answer AICollisionSolverAgent::TestImpulse(rmt::Vector& mImpulse,
+ sim::Collision& inCollision)
+{
+ sim::SimState* inSimStateA = inCollision.mCollisionObjectA->GetSimState();
+ sim::SimState* inSimStateB = inCollision.mCollisionObjectB->GetSimState();
+
+ return sim::Solving_Continue;
+}
+
+// =======================================================
+// END_OBJECT_COLLISION
+//
+sim::Solving_Answer AICollisionSolverAgent::EndObjectCollision(
+ sim::SimState* inSimState,
+ int inIndex)
+{
+ return sim::Solving_Continue;
+} \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.hpp
new file mode 100644
index 0000000..10097a8
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/aicollisionsolveragent.hpp
@@ -0,0 +1,43 @@
+#ifndef _AICOLLISIONSOLVERAGENT_HPP_
+#define _AICOLLISIONSOLVERAGENT_HPP_
+
+#include "simcommon/tlist.hpp"
+#include "simcollision/impulsebasedcollisionsolver.hpp"
+#include "simcollision/collisionanalyser.hpp"
+#include "simcollision/collisionanalyserdata.hpp"
+
+class AICollisionSolverAgent
+: public sim::CollisionSolverAgent
+{
+public:
+ AICollisionSolverAgent();
+ ~AICollisionSolverAgent();
+
+ //
+ // this method is called at the beginning before anything is done with the collision
+ // returning Solving_Aborted would cause the collision to be ignored.
+ //
+ sim::Solving_Answer PreCollisionEvent(sim::Collision& inCollision, int inPass);
+
+ //
+ // this method allows to trigger sounds, animation and modify the objects state.
+ //
+ sim::Solving_Answer CollisionEvent( sim::SimState* inSimStateA, int indexA,
+ sim::SimState* inSimStateB, int indexB,
+ const rmt::Vector& inPos, float inDvN, float inDvT);
+
+ //
+ // this is called everytime an impulse is computed, before it gets added to the objects
+ //
+ sim::Solving_Answer TestImpulse(rmt::Vector& mImpulse, sim::Collision& inCollision);
+
+ //
+ // the impulse has been added to the object's cache, testing that cache tells
+ // the consequence of adding the cache to the object's state. It is also a good
+ // time for adding the cache of the root node of an articulated object to its
+ // virtual center of mass.
+ //
+ sim::Solving_Answer EndObjectCollision(sim::SimState* inSimState, int inIndex);
+};
+
+#endif \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.cpp
new file mode 100644
index 0000000..f994e0d
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.cpp
@@ -0,0 +1,792 @@
+/*
+ * sp/engine/context.cpp
+ */
+
+
+#include <SP/engine/workspace.hpp>
+#include <SP/engine/context.hpp>
+#include <SP/interface/context.hpp>
+
+
+//#include <SP/engine/project.hpp>
+//#include <choreo/load.hpp>
+
+#include <p3d/context.hpp>
+#include <p3d/utility.hpp>
+#include <p3d/view.hpp>
+#include <p3d/directionallight.hpp>
+#include <p3d/pointcamera.hpp>
+#include <p3d/geometry.hpp>
+#include <p3d/anim/drawablepose.hpp>
+#include <radload/radload.hpp>
+
+#include <radtime.hpp>
+#include <radplatform.hpp>
+
+#include <shlwapi.h>
+
+#include <typeinfo>
+
+
+#ifdef RAD_DEBUG
+static const char* pddiDLL = "pddidx8d.dll";
+#endif
+
+#ifdef RAD_TUNE
+static const char* pddiDLL = "pddidx8t.dll";
+#endif
+
+#ifdef RAD_RELEASE
+static const char* pddiDLL = "pddidx8r.dll";
+#endif
+
+
+// global SPContext reference
+SPContext* g_SPContext = 0;
+
+extern Workspace* g_Workspace;
+
+
+//---------------------------------------------------------------------------
+// class SPContext - implementation
+//---------------------------------------------------------------------------
+
+SPContext::SPContext(HWND hwnd):
+ m_HWnd(hwnd),
+
+ m_Context(0),
+ m_View(0),
+ m_Camera(0),
+ m_Light(0),
+ m_Shader(0),
+
+ m_CurrentTime(-1.0f),
+ m_FPSIndex(0),
+ m_SimRate(1.0f),
+
+ m_MouseCapture(0),
+ m_MouseX(0),
+ m_MouseY(0),
+
+ m_IsCameraLocked(false)
+{
+ memset(m_FPS, 0, sizeof(m_FPS));
+}
+
+SPContext::~SPContext()
+{
+ tRefCounted::Release(m_Shader);
+ tRefCounted::Release(m_Light);
+ tRefCounted::Release(m_Camera);
+ tRefCounted::Release(m_View);
+}
+
+bool SPContext::Open()
+{
+ // p3d context init
+ RECT wndRect;
+ GetWindowRect(m_HWnd, &wndRect);
+
+ tContextInitData init;
+ init.hwnd = m_HWnd;
+ init.displayMode = PDDI_DISPLAY_WINDOW;
+ init.bufferMask = PDDI_BUFFER_COLOUR | PDDI_BUFFER_DEPTH;
+ int wndWidth = wndRect.right - wndRect.left;
+ int wndHeight = wndRect.bottom - wndRect.top;
+ init.xsize = wndWidth;
+ init.ysize = wndHeight;
+ init.bpp = 32;
+ strcpy(init.PDDIlib, pddiDLL);
+
+ //p3d::platform->SetActiveContext(0);
+ m_Context = p3d::platform->CreateContext(&init);
+ if (m_Context == 0)
+ return false;
+
+ p3d::platform->SetActiveContext(m_Context);
+
+ // Call into PDDI to enable Z-buffering.
+ p3d::pddi->EnableZBuffer(true);
+
+
+ radLoadInitialize();
+
+ // This call installs chunk handlers for all the primary chunk types that
+ // Pure3D supports. This includes textures, materials, geometries, and the
+ // like.
+ p3d::InstallDefaultLoaders();
+
+ // install default choreo loaders
+ //choreo::InstallDefaultLoaders();
+
+ // p3d view init
+ m_View = new tView;
+ m_View->AddRef();
+
+ m_View->SetBackgroundColour(tColour(64, 64, 128));
+ m_View->SetAmbientLight(tColour(40, 40, 40));
+
+ // p3d light init
+ m_Light = new tDirectionalLight;
+ m_Light->AddRef();
+
+ m_Light->SetDirection(0.0f, 0.0f, 1.0f);
+ m_Light->SetColour(tColour(255, 255, 255));
+ m_View->AddLight(m_Light);
+
+ // p3d camera init
+ m_Camera = new tPointCamera;
+ m_Camera->AddRef();
+ m_Camera->SetNearPlane(0.01f);
+ m_Camera->SetFarPlane(5000.0f);
+ m_Camera->SetFOV(rmt::DegToRadian(90.0f), (float)wndWidth / (float)wndHeight);
+ m_View->SetCamera(m_Camera);
+
+ m_CameraTarget.Clear();
+ m_CameraRotateX = rmt::DegToRadian(-45.0f);
+ m_CameraRotateY = 0.0f;
+ m_CameraDistance = 5.0f;
+
+ // pddi shader
+ m_Shader = p3d::device->NewShader("simple");
+ m_Shader->AddRef();
+ m_Shader->SetInt(PDDI_SP_ISLIT, 0);
+
+ // workspace create
+ if (g_Workspace == 0)
+ {
+ g_Workspace = new Workspace;
+ g_Workspace->AddRef();
+ }
+
+ return true;
+}
+
+bool SPContext::Close()
+{
+ // p3d release stuff
+ tRefCounted::Release(m_Shader);
+ tRefCounted::Release(m_Light);
+ tRefCounted::Release(m_Camera);
+ tRefCounted::Release(m_View);
+
+ // p3d context destroy
+ if (m_Context != 0)
+ {
+ p3d::platform->DestroyContext(m_Context);
+ m_Context = 0;
+ }
+
+ radLoadTerminate();
+
+ return true;
+}
+
+bool SPContext::ViewResize(int w, int h)
+{
+ if (w <= 0)
+ w = 1;
+ if (h <= 0)
+ h = 1;
+
+ RECT wndRect;
+ GetWindowRect(m_HWnd, &wndRect);
+ int wndWidth = wndRect.right - wndRect.left;
+ if (wndWidth <= 0)
+ wndWidth = 1;
+ int wndHeight = wndRect.bottom - wndRect.top;
+ if (wndHeight <= 0)
+ wndHeight = 1;
+
+ if (w > wndWidth)
+ w = wndWidth;
+ if (h > wndHeight)
+ h = wndHeight;
+
+ m_View->SetWindow(0.0f, 0.0f, (float)w / (float)wndWidth, (float)h / (float)wndHeight);
+ m_Camera->SetFOV(rmt::DegToRadian(90.0f), (float)w / (float)h);
+
+ return true;
+}
+
+bool SPContext::Advance()
+{
+ // do time
+ float deltaTime;
+ {
+ float newTime = (float)radTimeGetMilliseconds() / 1000.0f;
+
+ if (m_CurrentTime < 0.0f)
+ {
+ deltaTime = 0.0f;
+ m_CurrentTime = newTime;
+ }
+ else
+ {
+ deltaTime = newTime - m_CurrentTime;
+
+ if (deltaTime < 0.0f)
+ {
+ deltaTime = 0.0f;
+ }
+ else
+ {
+ m_CurrentTime = newTime;
+ }
+
+ // for debugging
+ if (deltaTime > 1.0f)
+ {
+ deltaTime = 1.0f / 60.0f;
+ }
+ else
+ {
+ // do fps
+ m_FPS[m_FPSIndex] = deltaTime;
+ m_FPSIndex = (m_FPSIndex + 1) % MAX_FPS_COUNT;
+ }
+ }
+ }
+
+ float simDeltaTime = m_SimRate * deltaTime;
+ if ( g_Workspace )
+ {
+ g_Workspace->Advance(simDeltaTime * 1000.0f);
+ }
+
+ // update camera & light
+ {
+ /*if (m_IsCameraLocked)
+ {
+ rmt::Vector desiredTarget = m_CVPuppet->GetCameraTarget();
+
+ rmt::Vector delta = desiredTarget;
+ delta.Sub(m_CameraTarget);
+ float mag = delta.NormalizeSafe();
+
+ static const float cameraSpeed = 1.5f; // m/s
+ float maxMag = cameraSpeed * deltaTime * mag;
+ if (mag > maxMag)
+ {
+ mag = maxMag;
+ }
+
+ delta.Scale(mag);
+ m_CameraTarget.Add(delta);
+ m_CameraTarget.x = desiredTarget.x;
+ m_CameraTarget.z = desiredTarget.z;
+ }*/
+
+ m_Camera->SetTarget(m_CameraTarget);
+ rmt::Matrix mY;
+ mY.FillRotateY(m_CameraRotateY);
+ rmt::Matrix mX;
+ mX.FillRotateX(m_CameraRotateX);
+ rmt::Vector cameraPos(0.0f, 0.0f, m_CameraDistance);
+ cameraPos.Rotate(mX);
+ cameraPos.Rotate(mY);
+ cameraPos.Add(m_CameraTarget);
+ m_Camera->SetPosition(cameraPos);
+
+ rmt::Vector lightDir;
+ lightDir = m_CameraTarget;
+ lightDir.Sub(cameraPos);
+ m_Light->SetDirection(lightDir);
+ }
+
+ //return rc;
+ return true;
+}
+
+bool SPContext::Display()
+{
+ m_Context->BeginFrame();
+ m_View->BeginRender();
+
+ // render game context
+ if ( g_Workspace )
+ {
+ g_Workspace->Display(m_Context);
+ }
+
+ // draw origin
+ {
+ rmt::Matrix m;
+ m.Identity();
+ DrawAxes(m, 0.5f);
+ }
+
+ m_View->EndRender();
+ m_Context->EndFrame();
+
+ //return rc;
+ return true;
+}
+
+void SPContext::DrawAxes(const rmt::Matrix& m, float radius)
+{
+ rmt::Vector oldVtx[4] =
+ {
+ rmt::Vector(0,0,0),
+ rmt::Vector(radius,0,0),
+ rmt::Vector(0,radius,0),
+ rmt::Vector(0,0,radius)
+ };
+ rmt::Vector newVtx[4];
+ m.Transform(4, oldVtx, newVtx);
+
+ pddiPrimStream* stream = p3d::pddi->BeginPrims(m_Shader, PDDI_PRIM_LINES, PDDI_V_C , 6);
+
+ stream->Vertex((pddiVector*)newVtx, pddiColour(255,0,0));
+ stream->Vertex((pddiVector*)(newVtx + 1), pddiColour(255,0,0));
+
+ stream->Vertex((pddiVector*)newVtx, pddiColour(0,255,0));
+ stream->Vertex((pddiVector*)(newVtx + 2), pddiColour(0,255,0));
+
+ stream->Vertex((pddiVector*)newVtx, pddiColour(0,0,255));
+ stream->Vertex((pddiVector*)(newVtx + 3), pddiColour(0,0,255));
+
+ p3d::pddi->EndPrims(stream);
+}
+
+void SPContext::DrawLine(const rmt::Vector& a, const rmt::Vector& b, tColour c)
+{
+ pddiPrimStream* stream = p3d::pddi->BeginPrims(m_Shader, PDDI_PRIM_LINES, PDDI_V_C , 2 );
+ stream->Vertex((pddiVector*)(&a), c);
+ stream->Vertex((pddiVector*)(&b), c);
+ p3d::pddi->EndPrims(stream);
+}
+
+void SPContext::RenderPose(tPose* pose)
+{
+ pose->Evaluate();
+
+ int i;
+ int startJoint = 0;
+ for (i = startJoint; i < pose->GetNumJoint(); ++i)
+ {
+ tPose::Joint* joint = pose->GetJoint(i);
+ tPose::Joint* parent = joint->parent;
+
+ if (parent != 0)
+ {
+ DrawLine(parent->worldMatrix.Row(3), joint->worldMatrix.Row(3), tColour(255,255,255));
+ DrawAxes(parent->worldMatrix, 0.02f);
+ }
+ }
+}
+
+void SPContext::MouseDown(int button, int shift, int x, int y)
+{
+ if (m_MouseCapture == 0)
+ {
+ SetCapture(m_HWnd);
+ m_MouseCapture = 1;
+ }
+
+ m_MouseX = x;
+ m_MouseY = y;
+}
+
+void SPContext::MouseMove(int button, int shift, int x, int y)
+{
+ if (m_MouseCapture == 0)
+ return;
+ if (GetCapture() != m_HWnd)
+ return;
+
+ int dx = x - m_MouseX;
+ int dy = y - m_MouseY;
+ m_MouseX = x;
+ m_MouseY = y;
+
+ if ((button & MK_LBUTTON) != 0)
+ {
+ if ((button & MK_MBUTTON) != 0)
+ {
+ CameraZoom(dx * 10);
+ }
+ else
+ {
+ CameraRotate(dx, dy);
+ }
+ }
+ else if ((button & MK_MBUTTON) != 0)
+ {
+ CameraPan(dx, dy);
+ }
+}
+
+void SPContext::MouseUp(int button, int shift, int x, int y)
+{
+ MouseMove(button, shift, x, y);
+
+ if (m_MouseCapture == 0)
+ return;
+
+ ReleaseCapture();
+ m_MouseCapture = 0;
+}
+
+void SPContext::MouseWheel(int scroll)
+{
+ CameraZoom(scroll);
+}
+
+void SPContext::CameraPan(int dx, int dy)
+{
+ RECT wndRect;
+ GetWindowRect(m_HWnd, &wndRect);
+
+ rmt::Vector v((float)-dx / (float)(wndRect.right - wndRect.left),
+ (float)dy / (float)(wndRect.bottom - wndRect.top), 0.0f);
+ rmt::Vector a, b;
+ m_Camera->ViewToWorld(v, &a, &b);
+ b.Sub(a);
+ b.NormalizeSafe();
+ b.Scale(m_CameraDistance - m_Camera->GetNearPlane());
+ b.Add(a);
+ m_CameraTarget = b;
+}
+
+void SPContext::CameraZoom(int dz)
+{
+ m_CameraDistance += ((float)-dz * 0.001f * m_CameraDistance);
+
+ if (m_CameraDistance < 0.1f)
+ {
+ m_CameraDistance = 0.1f;
+ }
+}
+
+void SPContext::CameraRotate(int dx, int dy)
+{
+ m_CameraRotateX += ((float)-dy * 0.01f);
+
+ if (m_CameraRotateX > rmt::DegToRadian(89.9f))
+ {
+ m_CameraRotateX = rmt::DegToRadian(89.9f);
+ }
+
+ if (m_CameraRotateX < rmt::DegToRadian(-89.9f))
+ {
+ m_CameraRotateX = rmt::DegToRadian(-89.9f);
+ }
+
+ m_CameraRotateY += ((float)dx * 0.01f);
+}
+
+float SPContext::SimulationGetFPS() const
+{
+ float fps = 0.0f;
+
+ for (int i = 0; i < MAX_FPS_COUNT; ++i)
+ {
+ fps += m_FPS[i];
+ }
+
+ fps /= (float)MAX_FPS_COUNT;
+
+ if (!rmt::Epsilon(fps, 0.0f))
+ {
+ fps = 1.0f / fps;
+ }
+
+ return fps;
+}
+
+void SPContext::SimulationSetRate(float simRate)
+{
+ m_SimRate = simRate;
+
+ if (m_SimRate < 0.0f)
+ {
+ m_SimRate = 0.0f;
+ }
+}
+
+bool SPContext::GetEntityName(tEntity* entity, char* name, int maxLen)
+{
+ if (maxLen > 0)
+ {
+ name[0] = 0;
+ }
+
+ if (entity == 0)
+ return false;
+
+ if (entity->GetName() != 0)
+ {
+ _snprintf(name, maxLen, "%s", entity->GetName());
+ }
+ else
+ {
+ _snprintf(name, maxLen, "0x%016I64x", entity->GetUID());
+ }
+
+ if (maxLen > 0)
+ {
+ name[maxLen - 1] = 0;
+ }
+
+ return true;
+}
+
+void SPContext::InventoryClear()
+{
+ if (m_Context != 0)
+ {
+ m_Context->GetInventory()->RemoveAllElements();
+ }
+}
+
+int SPContext::InventoryGetEntityCount() const
+{
+ if (m_Context == 0)
+ return 0;
+
+ int entityCount = 0;
+ /*
+ for (int s = 0; s < m_Context->GetInventory()->GetSectionCount(); ++s)
+ {
+ entityCount += m_Context->GetInventory()->GetSectionByIndex(s)->GetElementCount();
+ }
+ */
+
+ return entityCount;
+}
+
+bool SPContext::InventoryGetEntityName(int index,
+ char* name, int nameLen,
+ char* type, int typeLen) const
+{
+ int entityCount = 0;
+
+ /*
+ for (int s = 0; s < m_Context->GetInventory()->GetSectionCount(); ++s)
+ {
+ tEntityTable::RawIterator itor(m_Context->GetInventory()->GetSectionByIndex(s));
+
+ tEntity* obj = itor.First();
+ while (obj)
+ {
+ if (entityCount == index)
+ {
+ GetEntityName(obj, name, nameLen);
+ _snprintf(type, typeLen, "%s", typeid(*obj).name());
+ type[typeLen - 1] = '\0';
+
+ return true;
+ }
+
+ ++entityCount;
+ obj = itor.Next();
+ }
+ }
+ */
+
+ return false;
+}
+
+void SPContext::SetBackgroundColour(int r , int g , int b )
+{
+ m_View->SetBackgroundColour( tColour( r , g , b ) );
+}
+
+
+//---------------------------------------------------------------------------
+// SPContext - DLL interface
+//---------------------------------------------------------------------------
+
+int SP_CALLCONV SPContextOpen(HWND hwnd)
+{
+ P3DASSERT(g_SPContext == 0);
+ if (g_SPContext != 0)
+ return -1;
+
+ g_SPContext = new SPContext(hwnd);
+ if (!g_SPContext->Open())
+ {
+ delete g_SPContext;
+ g_SPContext = 0;
+ return -1;
+ }
+
+ return 1;
+}
+
+int SP_CALLCONV SPContextClose()
+{
+ if (g_SPContext == 0)
+ return 0;
+
+ if (!g_SPContext->Close())
+ {
+ delete g_SPContext;
+ g_SPContext = 0;
+ return -1;
+ }
+
+ delete g_SPContext;
+ g_SPContext = 0;
+ return 1;
+}
+
+int SP_CALLCONV SPContextViewResize(int w, int h)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->ViewResize(w, h);
+ return 1;
+}
+
+int SP_CALLCONV SPContextIsPDDIStatsEnabled()
+{
+ if (p3d::pddi == 0)
+ return -1;
+ return p3d::pddi->IsStatsOverlayEnabled();
+}
+
+int SP_CALLCONV SPContextSetIsPDDIStatsEnabled(int statsEnabled)
+{
+ if (p3d::pddi == 0)
+ return -1;
+ p3d::pddi->EnableStatsOverlay(statsEnabled != 0);
+ return 1;
+}
+
+int SP_CALLCONV SPContextAdvance()
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ return g_SPContext->Advance();
+}
+
+int SP_CALLCONV SPContextDisplay()
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ return g_SPContext->Display();
+}
+
+int SP_CALLCONV SPContextMouseDown(int button, int shift, int x, int y)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->MouseDown(button, shift, x, y);
+ return 0;
+}
+
+int SP_CALLCONV SPContextMouseMove(int button, int shift, int x, int y)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->MouseMove(button, shift, x, y);
+ return 0;
+}
+
+int SP_CALLCONV SPContextMouseUp(int button, int shift, int x, int y)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->MouseUp(button, shift, x, y);
+ return 0;
+}
+
+int SP_CALLCONV SPContextMouseWheel(int scroll)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->MouseWheel(scroll);
+ return 0;
+}
+
+float SP_CALLCONV SPSimulationGetFPS()
+{
+ if (g_SPContext == 0)
+ return 0.0f;
+
+ return g_SPContext->SimulationGetFPS();
+}
+
+float SP_CALLCONV SPSimulationGetRate()
+{
+ if (g_SPContext == 0)
+ return 0.0f;
+
+ return g_SPContext->SimulationGetRate();
+}
+
+int SP_CALLCONV SPSimulationSetRate(float rate)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->SimulationSetRate(rate);
+ return 0;
+}
+
+int SP_CALLCONV SPContextGetCameraLock()
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ return g_SPContext->IsCameraLocked();
+}
+
+int SP_CALLCONV SPContextSetCameraLock(int cameraLock)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->SetIsCameraLocked(cameraLock != 0);
+ return 0;
+}
+
+int SP_CALLCONV SPInventoryClear()
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ g_SPContext->InventoryClear();
+ return 0;
+}
+
+int SP_CALLCONV SPInventoryGetEntityCount()
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ return g_SPContext->InventoryGetEntityCount();
+}
+
+int SP_CALLCONV SPInventoryGetEntityName(int index, char* name, int nameLen, char* type, int typeLen)
+{
+ if (g_SPContext == 0)
+ return -1;
+
+ if (!g_SPContext->InventoryGetEntityName(index, name, nameLen, type, typeLen))
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+int SP_CALLCONV SPSetBackgroundColour( int r , int g , int b )
+{
+ if (g_SPContext == 0)
+ return 0;
+
+ g_SPContext->SetBackgroundColour( r , g , b );
+ return 1;
+}
+
+// End of file.
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.hpp
new file mode 100644
index 0000000..faf88c0
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/context.hpp
@@ -0,0 +1,119 @@
+/*
+ * sp/engine/context.hpp
+ */
+
+
+#ifndef SP_ENGINE_CONTEXT_HPP
+#define SP_ENGINE_CONTEXT_HPP
+
+
+#define WIN32_LEAN_AND_MEAN
+#define WIN32_EXTRA_LEAN
+#include <windows.h>
+
+#include <radmath/radmath.hpp>
+#include <p3d/p3dtypes.hpp>
+
+
+class tEntity;
+class tContext;
+class tView;
+class tPointCamera;
+class tDirectionalLight;
+class tPose;
+class pddiShader;
+
+
+//---------------------------------------------------------------------------
+// class SPContext
+//---------------------------------------------------------------------------
+
+class SPContext
+{
+public:
+
+ enum
+ {
+ MAX_FPS_COUNT = 10
+ };
+
+ SPContext(HWND hwnd);
+ virtual ~SPContext();
+
+ tContext* GetContext()
+ { return m_Context; }
+
+ bool Open();
+ bool Close();
+
+ bool ViewResize(int w, int h);
+
+ bool Advance();
+ bool Display();
+
+ void MouseDown(int button, int shift, int x, int y);
+ void MouseMove(int button, int shift, int x, int y);
+ void MouseUp(int button, int shift, int x, int y);
+ void MouseWheel(int scroll);
+
+ float SimulationGetFPS() const;
+ float SimulationGetRate() const
+ { return m_SimRate; }
+ void SimulationSetRate(float simRate);
+
+ bool IsCameraLocked() const
+ { return m_IsCameraLocked; }
+ void SetIsCameraLocked(bool cameraLock)
+ { m_IsCameraLocked = cameraLock; }
+ tPointCamera* GetCamera() const
+ { return m_Camera; }
+
+ static bool GetEntityName(tEntity* entity, char* name, int maxLen);
+
+ void InventoryClear();
+ int InventoryGetEntityCount() const;
+ bool InventoryGetEntityName(int index,
+ char* name, int nameLen,
+ char* type, int typeLen) const;
+
+ void RenderPose(tPose* pose);
+ void DrawAxes(const rmt::Matrix& m, float radius);
+ void DrawLine(const rmt::Vector& a, const rmt::Vector& b, tColour c);
+
+ void SetBackgroundColour( int r , int g , int b );
+
+private:
+
+ void CameraPan(int dx, int dy);
+ void CameraZoom(int dz);
+ void CameraRotate(int dx, int dy);
+
+ HWND m_HWnd;
+
+ tContext* m_Context;
+ tView* m_View;
+ tPointCamera* m_Camera;
+ tDirectionalLight* m_Light;
+ pddiShader* m_Shader;
+
+ float m_CurrentTime;
+ float m_FPS[MAX_FPS_COUNT];
+ int m_FPSIndex;
+ float m_SimRate;
+
+ rmt::Vector m_CameraTarget;
+ float m_CameraRotateX;
+ float m_CameraRotateY;
+ float m_CameraDistance;
+ bool m_IsCameraLocked;
+
+ int m_MouseCapture;
+ int m_MouseX;
+ int m_MouseY;
+};
+
+
+extern SPContext* g_SPContext;
+
+
+#endif // SP_ENGINE_CONTEXT_HPP
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/dllmain.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/dllmain.cpp
new file mode 100644
index 0000000..5d2df57
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/dllmain.cpp
@@ -0,0 +1,43 @@
+/*
+ * fightviewer/code/engine/dllmain.cpp
+ */
+
+
+#include <windows.h>
+
+
+HINSTANCE SPHInstance = 0;
+
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,
+ DWORD reason,
+ LPVOID reserved)
+{
+ SPHInstance = hinstDLL;
+
+ // Perform actions based on the reason for calling.
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ // Initialize once for each new process.
+ // Return FALSE to fail DLL load.
+ break;
+
+ case DLL_THREAD_ATTACH:
+ // Do thread-specific initialization.
+ break;
+
+ case DLL_THREAD_DETACH:
+ // Do thread-specific cleanup.
+ break;
+
+ case DLL_PROCESS_DETACH:
+ // Perform any necessary cleanup.
+ break;
+ }
+
+ return TRUE;
+}
+
+
+// End of file.
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/platform.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/platform.cpp
new file mode 100644
index 0000000..c27a39e
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/platform.cpp
@@ -0,0 +1,94 @@
+/*
+ * sp/engine/platform.cpp
+ */
+
+
+#include <sp/interface/platform.hpp>
+
+#include <radmemory.hpp>
+#include <radplatform.hpp>
+#include <radtime.hpp>
+#include <radfile.hpp>
+#include <radthread.hpp>
+
+#include <p3d/utility.hpp>
+
+
+extern HINSTANCE SPHInstance;
+
+//---------------------------------------------------------------------------
+// SPPlatform - DLL interface
+//---------------------------------------------------------------------------
+
+int SP_CALLCONV SPPlatformOpen(HWND hwnd)
+{
+ // ftt thread init
+ radThreadInitialize();
+
+ // ftt memory init
+ radMemoryInitialize();
+
+ // ftt platform init
+ radPlatformInitialize(hwnd, SPHInstance);
+
+ // ftt time init
+ radTimeInitialize();
+
+ // ftt file init
+ radFileInitialize();
+
+ // p3d platform init
+ tPlatform* platform = tPlatform::Create(SPHInstance);
+ if (platform == 0)
+ return -1;
+
+ // game project create
+ /*
+ if (g_SPProject == 0)
+ {
+ g_SPProject = SP_PROC_NEWPROJECT();
+ P3DASSERT(g_SPProject != 0);
+ if (g_SPProject == 0)
+ return -1;
+ g_SPProject->AddRef();
+ g_SPProject->ProjectInit();
+ }
+ */
+
+ return 0;
+}
+
+int SP_CALLCONV SPPlatformClose()
+{
+ // destroy game project
+ //tRefCounted::Release(g_SPProject);
+
+ // destroy workspace
+ //tRefCounted::Release(g_SPWorkspace);
+
+ // p3d platform destroy
+ if (p3d::platform != 0)
+ {
+ tPlatform::Destroy(p3d::platform);
+ }
+
+ // ftt file destroy
+ radFileTerminate();
+
+ // ftt time destroy
+ radTimeTerminate();
+
+ // ftt platform destroy
+ radPlatformTerminate();
+
+ // ftt memory destroy
+ radMemoryTerminate();
+
+ // ftt thread destroy
+ radThreadTerminate();
+
+ return 0;
+}
+
+
+// End of file.
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.cpp
new file mode 100644
index 0000000..cbfa84d
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.cpp
@@ -0,0 +1,445 @@
+#include <p3d/utility.hpp>
+#include <p3d/matrixstack.hpp>
+#include <p3d/anim/multicontroller.hpp>
+#include <p3d/anim/compositedrawable.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <p3d/anim/animate.hpp>
+
+#include <toollib/chunks16/inc/tlStatePropChunk.hpp>
+#include <toollib/inc/tlFile.hpp>
+#include <toollib/inc/tlFileByteStream.hpp>
+
+#include "stateprop.hpp"
+#include "statepropdata.hpp"
+
+CStateProp* CStateProp::CreateCStateProp( CStatePropData* statePropData , unsigned int state )
+{
+ tAnimatedObjectFactory* objectFactory = statePropData->m_ObjectFactory;
+
+ if ( !objectFactory )
+ {
+ objectFactory = p3d::find<tAnimatedObjectFactory>( statePropData->m_FactoryName );
+ if ( objectFactory )
+ {
+ statePropData->m_ObjectFactory = objectFactory;
+ statePropData->m_ObjectFactory->AddRef();
+ }
+ }
+
+ if ( objectFactory )
+ {
+ tAnimatedObject* animatedObject = objectFactory->CreateObject(NULL);
+ CStateProp* stateProp = new CStateProp( animatedObject , statePropData , state );
+ return stateProp;
+ }
+
+ return NULL;
+}
+
+CStateProp::CStateProp( tAnimatedObject* animatedObject , CStatePropData* statePropData , unsigned int state ) :
+ m_StatePropData( NULL ),
+ m_AnimatedObject( NULL ),
+ m_BaseFrameController( NULL ),
+ m_StatePropListener( NULL ),
+ m_CurrentState( state )
+{
+ //set state data
+ P3DASSERT( statePropData );
+ m_StatePropData = statePropData;
+ m_StatePropData->AddRef();
+
+ //set animated object
+ P3DASSERT( animatedObject );
+ m_AnimatedObject = animatedObject;
+ m_AnimatedObject->AddRef();
+
+ //base frame controller is run in milliseconds (ie the 1 is the timer)
+ m_BaseFrameController = new tMultiController(0 , 1000.f);
+ m_BaseFrameController->AddRef();
+ m_BaseFrameController->Reset();
+
+ //initilize transform
+ rmt::Matrix identity;
+ identity.Identity();
+ SetTransformationMatrix( identity );
+
+ //initialize the state
+ SetState( state );
+}
+
+CStateProp::~CStateProp()
+{
+ if ( m_BaseFrameController )
+ m_BaseFrameController->Release();
+ if ( m_StatePropData )
+ m_StatePropData->Release();
+ if ( m_AnimatedObject )
+ m_AnimatedObject->Release();
+}
+
+void CStateProp::Update( float dt )
+{
+ unsigned int i;
+
+ float lastFrame = m_BaseFrameController->GetFrame();
+ m_BaseFrameController->Advance( dt );
+ float newFrame = m_BaseFrameController->GetFrame();
+
+ //Check out transition
+ TransitionData tansdata = m_StatePropData->GetTransitionData( m_CurrentState );
+ if ( tansdata.autoTransition )
+ {
+ if (tansdata.onFrame >= lastFrame && tansdata.onFrame < newFrame)
+ {
+ SetState( tansdata.toState );
+ }
+ }
+
+ //Check callback events
+ if ( m_StatePropListener )
+ {
+ for ( i = 0; i < m_StatePropData->GetNumberOfCallbacks( m_CurrentState ); i++ )
+ {
+ CallbackData callbackData = m_StatePropData->GetCallbackData( m_CurrentState , i );
+ if ( callbackData.onFrame >= lastFrame && callbackData.onFrame < newFrame)
+ {
+ m_StatePropListener->RecieveEvent( callbackData.callbackID , this );
+ }
+ }
+ }
+
+ //update frame controllers
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( i = 0; i < numFrameControllers; i++ )
+ {
+ FrameControllerData fcData = m_StatePropData->GetFrameControllerData( m_CurrentState , i );
+
+ //if we need to update
+ if ( fcData.minFrame != fcData.maxFrame )
+ {
+ tFrameController* fc = GetFrameControllerByIndex( i );
+
+ //if the min frame is greater than the max frame then reverse the update
+ if ( fcData.minFrame > fcData.maxFrame )
+ {
+ fc->Advance( -dt , false );
+ }
+ else
+ {
+ fc->Advance( dt , false );
+ }
+
+ if ( fcData.isCyclic && fcData.numberOfCycles > 0 )
+ {
+ unsigned int currentNumberOfCycles = fc->LastFrameReached();
+ if ( currentNumberOfCycles >= fcData.numberOfCycles )
+ {
+ fc->SetCycleMode( FORCE_NON_CYCLIC );
+ fc->SetFrame( fcData.maxFrame );
+ }
+ }
+ }
+ }
+}
+
+void CStateProp::Render()
+{
+ p3d::stack->Push();
+ p3d::stack->Multiply( m_Transform );
+
+ m_AnimatedObject->Display();
+
+ p3d::stack->Pop();
+}
+
+void CStateProp::UpdateFrameControllersForRender()
+{
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( unsigned int i = 0; i < numFrameControllers; i++ )
+ {
+ GetFrameControllerByIndex( i )->Advance( 0.f , true );
+ }
+}
+
+unsigned int CStateProp::GetState()
+{
+ return m_CurrentState;
+}
+
+void CStateProp::NextState()
+{
+ if ( m_CurrentState + 1 >= m_StatePropData->GetNumberOfStates() )
+ {
+ SetState( 0 );
+ }
+ else
+ {
+ SetState( m_CurrentState + 1 );
+ }
+}
+
+void CStateProp::PrevState()
+{
+ if ( m_CurrentState - 1 < 0 )
+ {
+ SetState( m_StatePropData->GetNumberOfStates() - 1 );
+ }
+ else
+ {
+ SetState( m_CurrentState - 1 );
+ }
+}
+
+void CStateProp::SetState( unsigned int state )
+{
+ if ( state < m_StatePropData->GetNumberOfStates() && state >= 0 )
+ {
+ m_CurrentState = state;
+ }
+
+ m_BaseFrameController->SetFrame(0.f);
+
+ unsigned int i;
+
+ //reset the FC for new state
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( i = 0; i < numFrameControllers; i++ )
+ {
+ FrameControllerData frameControllerData = m_StatePropData->GetFrameControllerData( m_CurrentState , i );
+ tFrameController* fc = GetFrameControllerByIndex(i);
+
+ //if we are holding a frame over from last state dont reset
+ if ( !frameControllerData.holdFrame )
+ {
+ //Reset() MUST come first or it will trounce frame ranges etc...
+ fc->Reset();
+ }
+ fc->SetRelativeSpeed( frameControllerData.relativeSpeed );
+ fc->SetCycleMode( (frameControllerData.isCyclic == 1) ? FORCE_CYCLIC : FORCE_NON_CYCLIC );
+ if ( frameControllerData.minFrame > frameControllerData.maxFrame )
+ {
+ fc->SetFrameRange( frameControllerData.maxFrame , frameControllerData.minFrame );
+ }
+ else
+ {
+ fc->SetFrameRange( frameControllerData.minFrame , frameControllerData.maxFrame );
+ }
+
+ if ( !frameControllerData.holdFrame )
+ {
+ fc->SetFrame( frameControllerData.minFrame );
+ }
+ }
+
+ //Set visibility for new state
+ unsigned int numElements = m_AnimatedObject->GetBaseObject()->GetNumDrawableElement();
+ for ( i = 0; i < numElements; i++ )
+ {
+ tCompositeDrawable::DrawableElement* de = GetDrawableElement(i);
+
+ de->SetLockVisibility(false);
+ VisibilityData visibilityData = m_StatePropData->GetVisibilityData( m_CurrentState , i );
+ bool visible = visibilityData.isVisible == 1;
+ de->SetVisibility( visible );
+
+ //lock visibility if visiblility if false
+ de->SetLockVisibility(!visible);
+ }
+}
+
+void CStateProp::OnEvent( unsigned int eventID )
+{
+ unsigned int i;
+ unsigned int numEvents = m_StatePropData->GetNumberOfEvents( m_CurrentState );
+ for ( i = 0; i < numEvents; i++ )
+ {
+ EventData eventData = m_StatePropData->GetEventData( m_CurrentState , i );
+ if ( eventData.eventID == eventID )
+ {
+ SetState( eventData.toState );
+ }
+ }
+}
+
+void CStateProp::UpdateOnDataEdit()
+{
+ //Update without reseting the current frame or current state info
+ unsigned int i;
+
+ //update frame controllers
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( i = 0; i < numFrameControllers; i++ )
+ {
+ FrameControllerData frameControllerData = m_StatePropData->GetFrameControllerData( m_CurrentState , i );
+ tFrameController* fc = GetFrameControllerByIndex(i);
+ float frame = fc->GetFrame();
+ fc->Reset();
+ fc->SetRelativeSpeed( frameControllerData.relativeSpeed );
+ fc->SetCycleMode( (frameControllerData.isCyclic == 1) ? FORCE_CYCLIC : FORCE_NON_CYCLIC );
+ if ( frameControllerData.minFrame > frameControllerData.maxFrame )
+ {
+ fc->SetFrameRange( frameControllerData.maxFrame , frameControllerData.minFrame );
+ }
+ else
+ {
+ fc->SetFrameRange( frameControllerData.minFrame , frameControllerData.maxFrame );
+ }
+
+ fc->SetFrame( frame );
+ }
+
+ //set visibilites
+ unsigned int numDrawableElements = GetNumberOfDrawableElements();
+ for ( i = 0; i < numDrawableElements; i++ )
+ {
+ tCompositeDrawable::DrawableElement* de = GetDrawableElement(i);
+
+ de->SetLockVisibility(false);
+ VisibilityData visibilityData = m_StatePropData->GetVisibilityData( m_CurrentState , i );
+ bool visible = visibilityData.isVisible == 1;
+ de->SetVisibility( visible );
+
+ //lock visibility if visiblility if false
+ de->SetLockVisibility(!visible);
+ }
+}
+
+float CStateProp::GetBaseFrameControllerFrame()
+{
+ return m_BaseFrameController->GetFrame();
+}
+
+CStatePropData* CStateProp::GetCStatePropData()
+{
+ return m_StatePropData;
+}
+
+unsigned int CStateProp::GetNumberOfFrameControllers()
+{
+ return m_AnimatedObject->GetCurrentAnimation()->GetNumFrameControllers();
+}
+
+tFrameController* CStateProp::GetFrameControllerByIndex( unsigned int i )
+{
+ return m_AnimatedObject->GetCurrentAnimation()->GetFrameControllerByIndex(i);
+}
+
+unsigned int CStateProp::GetNumberOfDrawableElements()
+{
+ return m_AnimatedObject->GetBaseObject()->GetNumDrawableElement();
+}
+
+tCompositeDrawable::DrawableElement* CStateProp::GetDrawableElement( unsigned int i )
+{
+ return m_AnimatedObject->GetBaseObject()->GetDrawableElement( i );
+}
+
+const char* CStateProp::GetDrawableName( unsigned int i )
+{
+ return m_AnimatedObject->GetBaseObject()->GetDrawableElement( i )->GetDrawable()->GetName();
+}
+
+const char* CStateProp::GetPropName( )
+{
+ return GetName();
+}
+
+//Export the CStatePropData
+void CStateProp::ExportChunk( const char* filename )
+{
+ //create the outchunk data chunk
+ tlDataChunk* outchunk = new tlDataChunk;
+
+ //create smart prop chunk
+ char buf[256];
+ tlStatePropChunk* statepropchunk = new tlStatePropChunk;
+
+ //version one has extra floats and ints
+ statepropchunk->SetVersion( 1 );
+
+ statepropchunk->SetName( m_StatePropData->GetName() );
+ statepropchunk->SetObjectFactoryName( m_StatePropData->GetName() );
+ statepropchunk->SetNumStates( m_StatePropData->GetNumberOfStates() );
+
+ unsigned int state;
+ int j;
+ //create state subchunks
+ for ( state = 0; state < m_StatePropData->GetNumberOfStates(); state++ )
+ {
+ tlStatePropStateDataChunk* statechunk = new tlStatePropStateDataChunk;
+ sprintf(buf, "state%i", state );
+ statechunk->SetName( buf );
+ TransitionData tData = m_StatePropData->GetTransitionData( state );
+ statechunk->SetAutoTransition( tData.autoTransition );
+ statechunk->SetOutFrame( tData.onFrame );
+ statechunk->SetOutState( tData.toState );
+
+ int numDrawables = GetNumberOfDrawableElements();
+ statechunk->SetNumDrawables( numDrawables );
+ for ( j = 0; j < numDrawables; j++ )
+ {
+ tlStatePropVisibilitiesDataChunk* visibilitychunk = new tlStatePropVisibilitiesDataChunk;
+ VisibilityData vData = m_StatePropData->GetVisibilityData( state , j );
+ visibilitychunk->SetName( GetDrawableElement(j)->GetDrawable()->GetName() );
+ visibilitychunk->SetVisible( vData.isVisible );
+ statechunk->AppendSubChunk( visibilitychunk );
+ }
+
+ int numFrameControllers = GetNumberOfFrameControllers();
+ statechunk->SetNumFrameControllers( numFrameControllers );
+ for ( j = 0; j < numFrameControllers; j++ )
+ {
+ tlStatePropFrameControllerDataChunk* framecontrollerchunk = new tlStatePropFrameControllerDataChunk;
+ FrameControllerData fData = m_StatePropData->GetFrameControllerData( state , j );
+ framecontrollerchunk->SetName( GetFrameControllerByIndex(j)->GetName() );
+ framecontrollerchunk->SetCyclic( fData.isCyclic );
+ framecontrollerchunk->SetMinFrame( fData.minFrame );
+ framecontrollerchunk->SetMaxFrame( fData.maxFrame );
+ framecontrollerchunk->SetRelativeSpeed( fData.relativeSpeed );
+ framecontrollerchunk->SetHoldFrame( fData.holdFrame );
+ framecontrollerchunk->SetNumberOfCycles( fData.numberOfCycles );
+ statechunk->AppendSubChunk( framecontrollerchunk );
+ }
+
+ int numEvents = m_StatePropData->GetNumberOfEvents( state );
+ statechunk->SetNumEvents( numEvents );
+ for ( j = 0; j < numEvents; j++ )
+ {
+ tlStatePropEventDataChunk* eventdatachunk = new tlStatePropEventDataChunk;
+ EventData eData = m_StatePropData->GetEventData( state , j );
+ eventdatachunk->SetName( eData.eventName );
+ eventdatachunk->SetState( eData.toState );
+ eventdatachunk->SetEventEnum( eData.eventID );
+ statechunk->AppendSubChunk( eventdatachunk );
+ }
+
+ int numCallbacks = m_StatePropData->GetNumberOfCallbacks( state );
+ statechunk->SetNumCallbacks( numCallbacks );
+ for ( j = 0; j < numCallbacks; j++ )
+ {
+ tlStatePropCallbackDataChunk* callbackChunk = new tlStatePropCallbackDataChunk;
+ CallbackData cData = m_StatePropData->GetCallbackData( state , j );
+ callbackChunk->SetName( cData.callbackName );
+ callbackChunk->SetOnFrame( cData.onFrame );
+ callbackChunk->SetEventEnum( cData.callbackID );
+ statechunk->AppendSubChunk( callbackChunk );
+ }
+
+ //append the sate chunk
+ statepropchunk->AppendSubChunk( statechunk );
+ }
+
+ outchunk->AppendSubChunk( statepropchunk );
+
+ // create the new output file
+ tlFile output(new tlFileByteStream(filename,omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+ printf("Could not open %s for writing\n", filename);
+ return ;
+ }
+
+ outchunk->Write(&output);
+ output.Close();
+} \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.hpp
new file mode 100644
index 0000000..c72b76b
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/stateprop.hpp
@@ -0,0 +1,120 @@
+#ifndef _STATEPROP_HPP_
+#define _STATEPROP_HPP_
+
+#include "radmath/radmath.hpp"
+
+//=============================================================================
+// Forward Class/Struct Declarations
+//=============================================================================
+
+class tFrameController;
+class tAnimatedObject;
+class CStatePropData;
+class CStateProp;
+class tCompositeDrawable;
+
+
+//=============================================================================
+// Class Declarations
+// PropListener
+//=============================================================================
+
+class CStatePropListener : public tRefCounted
+{
+public:
+ virtual void RecieveEvent( int event , CStateProp* stateProp ) = 0;
+};
+
+//=============================================================================
+// Definitions
+//=============================================================================
+
+
+//=============================================================================
+// Class Declarations
+// CStateProp
+//=============================================================================
+class CStateProp : public tEntity
+{
+public:
+
+ static CStateProp* CreateCStateProp( CStatePropData* statePropData , unsigned int state );
+
+ CStateProp( tAnimatedObject* animatedObject , CStatePropData* statePropData , unsigned int state = 0 );
+ ~CStateProp();
+
+ //Per frame update
+ void Update( float dt );
+
+ //Render
+ void Render();
+
+ //call before render
+ void UpdateFrameControllersForRender();
+
+ unsigned int GetState();
+ void SetState( unsigned int state );
+ void NextState();
+ void PrevState();
+
+ void OnEvent( unsigned int eventID );
+
+ void SetTransformationMatrix( const rmt::Matrix &tm);
+ const rmt::Matrix& GetTransformationMatrix() const;
+
+ void SetPosition( const rmt::Vector& pos );
+ const rmt::Vector& GetPosition() const;
+
+ //Get State Prop Data
+ CStatePropData* GetCStatePropData();
+
+ // Update for new data
+ void UpdateOnDataEdit();
+
+ //accessors
+ float GetBaseFrameControllerFrame();
+ unsigned int GetNumberOfFrameControllers();
+ tFrameController* GetFrameControllerByIndex( unsigned int i );
+ unsigned int GetNumberOfDrawableElements();
+ tCompositeDrawable::DrawableElement* GetDrawableElement( unsigned int i );
+ const char* GetDrawableName( unsigned int i );
+ const char* GetPropName();
+
+ //Export the SmartPropData
+ void ExportChunk( const char* filename );
+
+
+private:
+
+ // Orientation and location
+ rmt::Matrix m_Transform;
+
+ //Private members
+ CStatePropData* m_StatePropData;
+ tAnimatedObject* m_AnimatedObject;
+ tFrameController* m_BaseFrameController;
+ unsigned int m_CurrentState;
+
+ CStatePropListener* m_StatePropListener;
+};
+
+
+inline void CStateProp::SetPosition( const rmt::Vector& pos )
+{
+ m_Transform.FillTranslate( pos );
+}
+inline const rmt::Vector& CStateProp::GetPosition() const
+{
+ return const_cast< RadicalMathLibrary::Matrix & >( m_Transform ).Row(3);
+}
+
+inline void CStateProp::SetTransformationMatrix(const rmt::Matrix& tmx)
+{
+ m_Transform = tmx;
+}
+inline const rmt::Matrix& CStateProp::GetTransformationMatrix() const
+{
+ return m_Transform;
+}
+
+#endif //_STATEPROP_HPP_ \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp
new file mode 100644
index 0000000..eb88194
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp
@@ -0,0 +1,509 @@
+#include <string.h>
+#include <p3d/utility.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <constants/chunkids.hpp>
+#include <p3d/chunkfile.hpp>
+
+#include "statepropdata.hpp"
+
+//=============================================================================
+// Class Declarations
+// Prop
+//=============================================================================
+
+CStatePropData::CStatePropData( tAnimatedObjectFactory* factory ) :
+ tEntity(),
+ m_NumStates(1)
+{
+ P3DASSERT ( factory );
+ m_ObjectFactory = factory;
+ m_ObjectFactory->AddRef();
+ SetName( m_ObjectFactory->GetName() );
+
+ ResetData();
+}
+
+CStatePropData::CStatePropData( ) :
+ tEntity(),
+ m_NumStates(1),
+ m_ObjectFactory( NULL )
+{
+ ResetData();
+}
+
+CStatePropData::~CStatePropData()
+{
+ m_ObjectFactory->Release();
+}
+
+//=============================================================================
+//State Data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfStates()
+{
+ return m_NumStates;
+}
+StateData CStatePropData::GetStateData( unsigned int state )
+{
+ return m_StateData[ state ];
+}
+
+//Set
+void CStatePropData::InsertState( unsigned int state )
+{
+ if ( m_NumStates >= MAX_STATES - 1)
+ return;
+
+ //increase the number of states and copy all the data up a state
+ m_NumStates++;
+
+ unsigned int i , j;
+ for ( i = m_NumStates - 1; i > state + 1; i-- )
+ {
+ //transition data for each state
+ m_StateData[i].transitionData.autoTransition = m_StateData[i-1].transitionData.autoTransition;
+ m_StateData[i].transitionData.onFrame = m_StateData[i-1].transitionData.onFrame;
+ m_StateData[i].transitionData.toState = m_StateData[i-1].transitionData.toState;
+
+ //visibility data for each drawable in each state
+ for (j = 0; j < MAX_VISIBILITIES; j++ )
+ {
+ m_StateData[i].visibilityData[j].isVisible = m_StateData[i-1].visibilityData[j].isVisible;
+ }
+
+ //framecontroller data in each state
+ for (j = 0; j < MAX_FRAMECONTROLLERS; j++ )
+ {
+ m_StateData[i].frameControllerData[j].isCyclic = m_StateData[i-1].frameControllerData[j].isCyclic;
+ m_StateData[i].frameControllerData[j].maxFrame = m_StateData[i-1].frameControllerData[j].maxFrame;
+ m_StateData[i].frameControllerData[j].minFrame = m_StateData[i-1].frameControllerData[j].minFrame;
+ m_StateData[i].frameControllerData[j].relativeSpeed = m_StateData[i-1].frameControllerData[j].relativeSpeed;
+ m_StateData[i].frameControllerData[j].holdFrame = m_StateData[i-1].frameControllerData[j].holdFrame;
+ m_StateData[i].frameControllerData[j].numberOfCycles = m_StateData[i-1].frameControllerData[j].numberOfCycles;
+ }
+
+ //event data for each state
+ m_StateData[i].numEvents = m_StateData[i-1].numEvents;
+ m_StateData[i].numCallbacks = m_StateData[i-1].numCallbacks;
+ for (j = 0; j < MAX_EVENTS; j++ )
+ {
+ strcpy( m_StateData[i].eventData[j].eventName , m_StateData[i-1].eventData[j].eventName );
+ m_StateData[i].eventData[j].toState = m_StateData[i-1].eventData[j].toState;
+ m_StateData[i].eventData[j].eventID = m_StateData[i-1].eventData[j].eventID;
+
+ strcpy( m_StateData[i].callbackData[j].callbackName , m_StateData[i-1].callbackData[j].callbackName );
+ m_StateData[i].callbackData[j].onFrame = m_StateData[i-1].callbackData[j].onFrame;
+ m_StateData[i].callbackData[j].callbackID = m_StateData[i-1].callbackData[j].callbackID;
+ }
+ }
+
+ //Initialize the newly added state
+
+ //transition data for each state
+ m_StateData[state + 1].transitionData.autoTransition = 0;
+ m_StateData[state + 1].transitionData.onFrame = 0.f;
+ m_StateData[state + 1].transitionData.toState = 0;
+
+ //visibility data for each drawable in each state
+ for (j = 0; j < MAX_VISIBILITIES; j++ )
+ {
+ m_StateData[state + 1].visibilityData[j].isVisible = 1;
+ }
+
+ //framecontroller data in each state
+ for (j = 0; j < MAX_FRAMECONTROLLERS; j++ )
+ {
+ m_StateData[state + 1].frameControllerData[j].isCyclic = 0;
+ m_StateData[state + 1].frameControllerData[j].maxFrame = 0.f;
+ m_StateData[state + 1].frameControllerData[j].minFrame = 0.f;
+ m_StateData[state + 1].frameControllerData[j].relativeSpeed = 1.f;
+ m_StateData[state + 1].frameControllerData[j].holdFrame = 0;
+ m_StateData[state + 1].frameControllerData[j].numberOfCycles = 0;
+ }
+
+ //event data for each state
+ m_StateData[state + 1].numEvents = 0;
+ m_StateData[state + 1].numCallbacks = 0;
+}
+
+void CStatePropData::DeleteState( unsigned int state )
+{
+ if ( m_NumStates == 1 )
+ {
+ ResetData();
+ return;
+ }
+
+ int i;
+ int j;
+
+ for ( i = state; i < m_NumStates - 1; i++ )
+ {
+ //transition data for each state
+ m_StateData[i].transitionData.autoTransition = m_StateData[i+1].transitionData.autoTransition;
+ m_StateData[i].transitionData.onFrame = m_StateData[i+1].transitionData.onFrame;
+ m_StateData[i].transitionData.toState = m_StateData[i+1].transitionData.toState;
+
+ //visibility data for each drawable in each state
+ for (j = 0; j < MAX_VISIBILITIES; j++ )
+ {
+ m_StateData[i].visibilityData[j].isVisible = m_StateData[i+1].visibilityData[j].isVisible;
+ }
+
+ //framecontroller data in each state
+ for (j = 0; j < MAX_FRAMECONTROLLERS; j++ )
+ {
+ m_StateData[i].frameControllerData[j].isCyclic = m_StateData[i+1].frameControllerData[j].isCyclic;
+ m_StateData[i].frameControllerData[j].maxFrame = m_StateData[i+1].frameControllerData[j].maxFrame;
+ m_StateData[i].frameControllerData[j].minFrame = m_StateData[i+1].frameControllerData[j].minFrame;
+ m_StateData[i].frameControllerData[j].relativeSpeed = m_StateData[i+1].frameControllerData[j].relativeSpeed;
+ m_StateData[i].frameControllerData[j].holdFrame = m_StateData[i+1].frameControllerData[j].holdFrame;
+ m_StateData[i].frameControllerData[j].numberOfCycles = m_StateData[i+1].frameControllerData[j].numberOfCycles;
+ }
+
+ //event data for each state
+ m_StateData[i].numEvents = m_StateData[i+1].numEvents;
+ m_StateData[i].numCallbacks = m_StateData[i+1].numCallbacks;
+ for (j = 0; j < MAX_EVENTS; j++ )
+ {
+ strcpy( m_StateData[i].eventData[j].eventName , m_StateData[i+1].eventData[j].eventName );
+ m_StateData[i].eventData[j].toState = m_StateData[i+1].eventData[j].toState;
+ m_StateData[i].eventData[j].eventID = m_StateData[i+1].eventData[j].eventID;
+
+ strcpy( m_StateData[i].callbackData[j].callbackName , m_StateData[i+1].callbackData[j].callbackName );
+ m_StateData[i].callbackData[j].onFrame = m_StateData[i+1].callbackData[j].onFrame;
+ m_StateData[i].callbackData[j].callbackID = m_StateData[i+1].callbackData[j].callbackID;
+ }
+ }
+
+ m_NumStates--;
+}
+
+//=============================================================================
+//Transition Data
+//=============================================================================
+
+//Get
+TransitionData CStatePropData::GetTransitionData( int state )
+{
+ return m_StateData[state].transitionData;
+}
+
+//Set
+void CStatePropData::SetAutoTransition( int state, bool b )
+{
+ m_StateData[state].transitionData.autoTransition = b;
+}
+void CStatePropData::SetAutoTransitionOnFrame( int state, float onFrame )
+{
+ m_StateData[state].transitionData.onFrame = onFrame;
+}
+void CStatePropData::SetAutoTransitionToState( int state, int toState )
+{
+ m_StateData[state].transitionData.toState = toState;
+}
+
+//=============================================================================
+//Visibility Data
+//=============================================================================
+
+//Get
+VisibilityData CStatePropData::GetVisibilityData( int state , int index)
+{
+ return ( m_StateData[state].visibilityData[index] );
+}
+
+//Set
+void CStatePropData::SetVisible( int state , int index , bool b )
+{
+ m_StateData[state].visibilityData[index].isVisible = b;
+}
+void CStatePropData::SetAllVisibilities( int state , bool b )
+{
+ for ( int i = 0; i < MAX_VISIBILITIES; i++ )
+ {
+ m_StateData[state].visibilityData[i].isVisible = b;
+ }
+}
+void CStatePropData::ShowAll(int state)
+{
+ SetAllVisibilities( state , true );
+}
+void CStatePropData::HideAll(int state)
+{
+ SetAllVisibilities( state , false );
+}
+
+//=============================================================================
+//Frame controller data
+//=============================================================================
+
+//Get
+FrameControllerData CStatePropData::GetFrameControllerData( int state, int fc )
+{
+ return m_StateData[state].frameControllerData[fc];
+}
+
+//Set
+void CStatePropData::SetCyclic( int state ,int fc, bool isCyclic )
+{
+ m_StateData[state].frameControllerData[fc].isCyclic = isCyclic;
+}
+void CStatePropData::SetRelativeSpeed( int state ,int fc, float speed )
+{
+ m_StateData[state].frameControllerData[fc].relativeSpeed = speed;
+}
+void CStatePropData::SetFrameRange( int state , int fc, float min, float max )
+{
+ m_StateData[state].frameControllerData[fc].minFrame = min;
+ m_StateData[state].frameControllerData[fc].maxFrame = max;
+}
+void CStatePropData::SetHoldFrame( int state , int fc , bool holdFrame )
+{
+ m_StateData[state].frameControllerData[fc].holdFrame = holdFrame;
+}
+void CStatePropData::SetNumberOfCycles( int state , int fc , unsigned int numberOfCycles )
+{
+ m_StateData[state].frameControllerData[fc].numberOfCycles = numberOfCycles;
+}
+
+
+//=============================================================================
+//Event data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfEvents( int state )
+{
+ return m_StateData[state].numEvents;
+}
+EventData CStatePropData::GetEventData( int state , int eventindex )
+{
+ return m_StateData[state].eventData[eventindex];
+}
+
+//Set
+void CStatePropData::AddEvent( const char* event , int eventEnum , int toState , int fromState )
+{
+ int n_events = m_StateData[fromState].numEvents;
+
+ strcpy( m_StateData[fromState].eventData[n_events].eventName , event );
+ m_StateData[fromState].eventData[n_events].toState = toState;
+ m_StateData[fromState].eventData[n_events].eventID = eventEnum;
+
+ m_StateData[fromState].numEvents = n_events + 1;
+}
+void CStatePropData::EditEvent( int state, int EventIndex, char* eventName, int eventID , int toState )
+{
+ strcpy( m_StateData[state].eventData[EventIndex].eventName , eventName );
+ m_StateData[state].eventData[EventIndex].toState = toState;
+ m_StateData[state].eventData[EventIndex].eventID = eventID;
+}
+void CStatePropData::DeleteEvent( int state , int index )
+{
+ int numEvents = m_StateData[state].numEvents;
+ for ( int i = index; i < numEvents - 1; i++ )
+ {
+ strcpy( m_StateData[state].eventData[i].eventName , m_StateData[state].eventData[i+1].eventName );
+ m_StateData[state].eventData[i].toState = m_StateData[state].eventData[i+1].toState;
+ m_StateData[state].eventData[i].eventID = m_StateData[state].eventData[i+1].eventID;
+ }
+
+ strcpy( m_StateData[state].eventData[numEvents - 1].eventName , "" );
+ m_StateData[state].eventData[numEvents - 1].toState = 0;
+ m_StateData[state].eventData[numEvents - 1].eventID = 0;
+
+ m_StateData[state].numEvents = numEvents - 1;
+}
+
+//=============================================================================
+//Callback Data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfCallbacks( int state )
+{
+ return m_StateData[state].numCallbacks;
+}
+CallbackData CStatePropData::GetCallbackData( int state , int eventindex )
+{
+ return m_StateData[state].callbackData[eventindex];
+}
+
+//Set
+void CStatePropData::AddCallback( int state , const char* callback , int callbackID , float onFrame )
+{
+ int n_callbacks = m_StateData[state].numCallbacks;
+
+ strcpy( m_StateData[state].callbackData[n_callbacks].callbackName , callback );
+ m_StateData[state].callbackData[n_callbacks].onFrame = onFrame;
+ m_StateData[state].callbackData[n_callbacks].callbackID = callbackID;
+
+ m_StateData[state].numCallbacks = n_callbacks + 1;
+}
+void CStatePropData::EditCallback( int state, int CBIndex, char* callbackname, int callbackID , float onFrame )
+{
+ strcpy( m_StateData[state].callbackData[CBIndex].callbackName , callbackname );
+ m_StateData[state].callbackData[CBIndex].onFrame = onFrame;
+ m_StateData[state].callbackData[CBIndex].callbackID = callbackID;
+}
+void CStatePropData::DeleteCallback( int state , int index )
+{
+ int numCallbacks = m_StateData[state].numCallbacks;
+ for ( int i = index; i < numCallbacks - 1; i++ )
+ {
+ strcpy( m_StateData[state].callbackData[i].callbackName , m_StateData[state].callbackData[i+1].callbackName );
+ m_StateData[state].callbackData[i].onFrame = m_StateData[state].callbackData[i+1].onFrame;
+ m_StateData[state].callbackData[i].callbackID = m_StateData[state].callbackData[i+1].callbackID;
+ }
+
+ strcpy( m_StateData[state].callbackData[numCallbacks - 1].callbackName , "" );
+ m_StateData[state].callbackData[numCallbacks - 1].onFrame = 0.f;
+ m_StateData[state].callbackData[numCallbacks - 1].callbackID = 0;
+
+ m_StateData[state].numCallbacks = numCallbacks - 1;
+}
+
+
+
+//=============================================================================
+//Utility
+//=============================================================================
+void CStatePropData::ResetData()
+{
+ unsigned int state;
+ unsigned int j;
+
+ for ( state = 0; state < MAX_STATES; state++ )
+ {
+ //transition data
+ m_StateData[state].transitionData.autoTransition = 0;
+ m_StateData[state].transitionData.onFrame = 0.f;
+ m_StateData[state].transitionData.toState = 0;
+
+ //framecontrollers
+ for ( j = 0; j < MAX_FRAMECONTROLLERS; j++ )
+ {
+ m_StateData[state].frameControllerData[j].isCyclic = false;
+ m_StateData[state].frameControllerData[j].minFrame = 0.f;
+ m_StateData[state].frameControllerData[j].maxFrame = 0.f;
+ m_StateData[state].frameControllerData[j].relativeSpeed = 1.f;
+ m_StateData[state].frameControllerData[j].holdFrame = 0;
+ m_StateData[state].frameControllerData[j].numberOfCycles = 0;
+
+ }
+
+ //visibilites
+ for ( j = 0; j < MAX_VISIBILITIES; j++ )
+ {
+ m_StateData[state].visibilityData[j].isVisible = true;
+ }
+
+ //events && callbacks
+ m_StateData[state].numEvents = 0;
+ m_StateData[state].numCallbacks = 0;
+ for ( j = 0; j < MAX_EVENTS; j++ )
+ {
+ strcpy( m_StateData[state].eventData[j].eventName , "" );
+ m_StateData[state].eventData[j].toState = 0;
+ m_StateData[state].eventData[j].eventID = 0;
+
+ strcpy( m_StateData[state].callbackData[j].callbackName , "" );
+ m_StateData[state].callbackData[j].onFrame = 0.f;
+ m_StateData[state].callbackData[j].callbackID = 0;
+ }
+ }
+}
+
+
+
+//=============================================================================
+// Class Declarations
+// PropLoader
+//=============================================================================
+CStatePropDataLoader::CStatePropDataLoader() :
+ tSimpleChunkHandler(StateProp::STATEPROP)
+{
+}
+
+//-------------------------------------------------------------------------
+tEntity* CStatePropDataLoader::LoadObject(tChunkFile* f, tEntityStore* store)
+{
+ unsigned int version = f->GetLong();
+
+ CStatePropData* statePropData = new CStatePropData();
+ statePropData->ResetData();
+
+ char buf[256];
+
+ f->GetPString(buf);
+ statePropData->SetName(buf);
+
+ strcpy( statePropData->m_FactoryName , f->GetPString(buf) );
+ statePropData->m_ObjectFactory = p3d::find<tAnimatedObjectFactory>(store, statePropData->m_FactoryName);
+ if ( statePropData->m_ObjectFactory )
+ {
+ statePropData->m_ObjectFactory->AddRef();
+ }
+
+ statePropData->m_NumStates = f->GetLong();
+
+ for ( int currState = 0; currState < statePropData->m_NumStates; currState++ )
+ {
+ f->BeginChunk();
+
+ f->GetPString(buf);
+ statePropData->m_StateData[currState].transitionData.autoTransition = ( f->GetLong() != 0 );
+ statePropData->m_StateData[currState].transitionData.toState = f->GetLong();
+ int numDrawables = f->GetLong();
+ int numFrameControllers = f->GetLong();
+ statePropData->m_StateData[currState].numEvents = f->GetLong();
+ statePropData->m_StateData[currState].numCallbacks = f->GetLong();
+ statePropData->m_StateData[currState].transitionData.onFrame = f->GetFloat();
+
+ for ( int currDrawable=0; currDrawable < numDrawables; currDrawable++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ statePropData->m_StateData[currState].visibilityData[currDrawable].isVisible = ( f->GetLong() != 0 );
+ f->EndChunk();
+ }
+
+ for ( int currFrameController=0; currFrameController < numFrameControllers; currFrameController++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].isCyclic = ( f->GetLong() != 0 );
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].numberOfCycles = f->GetLong();
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].holdFrame = ( f->GetLong() != 0 );
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].minFrame = f->GetFloat();
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].maxFrame = f->GetFloat();
+ statePropData->m_StateData[currState].frameControllerData[currFrameController].relativeSpeed = f->GetFloat();
+ f->EndChunk();
+ }
+
+ for ( unsigned int currEvent=0; currEvent < statePropData->m_StateData[currState].numEvents; currEvent++ )
+ {
+ f->BeginChunk();
+ strcpy( statePropData->m_StateData[currState].eventData[currEvent].eventName , f->GetPString(buf) );
+ statePropData->m_StateData[currState].eventData[currEvent].toState = f->GetLong();
+ statePropData->m_StateData[currState].eventData[currEvent].eventID = f->GetLong();
+ f->EndChunk();
+ }
+
+ for ( unsigned int currCallback=0; currCallback < statePropData->m_StateData[currState].numCallbacks; currCallback++ )
+ {
+ f->BeginChunk();
+ strcpy( statePropData->m_StateData[currState].callbackData[currCallback].callbackName , f->GetPString(buf) );
+ statePropData->m_StateData[currState].callbackData[currCallback].callbackID = f->GetLong();
+ statePropData->m_StateData[currState].callbackData[currCallback].onFrame = f->GetFloat();
+ f->EndChunk();
+ }
+
+ f->EndChunk();
+ }
+
+ return statePropData;
+} \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.hpp
new file mode 100644
index 0000000..f6cf691
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.hpp
@@ -0,0 +1,139 @@
+#ifndef _STATEPROPDATA_HPP_
+#define _STATEPROPDATA_HPP_
+
+
+#include <radmath/radmath.hpp>
+#include <p3d/loadmanager.hpp>
+
+#include "statepropdatatypes.hpp"
+
+//=============================================================================
+// Forward Class/Struct Declarations
+//=============================================================================
+
+class CStateProp;
+class tAnimatedObjectFactory;
+class CStatePropDataLoader;
+
+//=============================================================================
+// Definitions
+//=============================================================================
+#define MAX_STATES 50
+#define MAX_FRAMECONTROLLERS 250
+#define MAX_VISIBILITIES 250
+#define MAX_EVENTS 50
+
+//State data
+struct StateData
+{
+ TransitionData transitionData;
+ VisibilityData visibilityData[MAX_VISIBILITIES];
+ FrameControllerData frameControllerData[MAX_FRAMECONTROLLERS];
+ EventData eventData[MAX_EVENTS];
+ CallbackData callbackData[MAX_EVENTS];
+
+ unsigned int numEvents;
+ unsigned int numCallbacks;
+};
+
+//=============================================================================
+// Class Declarations
+// Prop
+//=============================================================================
+
+class CStatePropData : public tEntity
+{
+
+public:
+
+ friend class CStateProp;
+ friend class CStatePropDataLoader;
+
+ CStatePropData( tAnimatedObjectFactory* factory );
+ CStatePropData();
+ ~CStatePropData();
+
+ // State Data =====================================================================================
+ //Get
+ unsigned int GetNumberOfStates();
+ StateData GetStateData( unsigned int state );
+ //Set
+ void InsertState( unsigned int state );
+ void DeleteState( unsigned int state );
+
+ //Transition Data ==================================================================================
+ //Get
+ TransitionData GetTransitionData( int state );
+ //Set
+ void SetAutoTransition( int state, bool b );
+ void SetAutoTransitionOnFrame( int state, float onFrame );
+ void SetAutoTransitionToState( int state, int toState );
+
+ //Visibility Data ==================================================================================
+ //Get
+ VisibilityData GetVisibilityData( int state , int index);
+ //Set
+ void SetVisible( int state , int index , bool b );
+ void SetAllVisibilities( int state , bool b );
+ void ShowAll(int state);
+ void HideAll(int state);
+
+ //Frame Controller Data =============================================================================
+ //Get
+ FrameControllerData GetFrameControllerData( int state, int fc );
+ //Set
+ void SetCyclic( int state ,int fc, bool isCyclic );
+ void SetRelativeSpeed( int state ,int fc, float speed );
+ void SetFrameRange( int state ,int fc, float min, float max );
+ void SetHoldFrame( int state , int fc , bool holdFrame );
+ void SetNumberOfCycles( int state , int fc , unsigned int numberOfCycles );
+
+ //Event Data ========================================================================================
+ //Get
+ unsigned int GetNumberOfEvents( int state );
+ EventData GetEventData( int state , int eventindex );
+ //Set
+ void AddEvent( const char* event , int eventEnum , int toState , int fromState );
+ void EditEvent( int state, int EventIndex, char* eventName, int eventEnum , int toState );
+ void DeleteEvent( int fromState , int index );
+
+ //Callback Data ======================================================================================
+ //Get
+ unsigned int GetNumberOfCallbacks( int state );
+ CallbackData GetCallbackData( int state , int eventindex );
+ //Set
+ void AddCallback( int state , const char* event , int eventEnum , float frame );
+ void EditCallback( int state, int CBIndex, char* eventname, int eventEnum , float frame );
+ void DeleteCallback( int state , int index );
+
+private:
+
+ //reset the prop data
+ void ResetData();
+
+ //animated object factory
+ char m_FactoryName[64];
+ tAnimatedObjectFactory* m_ObjectFactory;
+
+ //total number of states
+ int m_NumStates;
+ StateData m_StateData[MAX_STATES];
+
+};
+
+
+//=============================================================================
+// Class Declarations
+// PropLoader
+//=============================================================================
+class CStatePropDataLoader : public tSimpleChunkHandler
+{
+public:
+ CStatePropDataLoader();
+ tEntity* LoadObject(tChunkFile* file, tEntityStore* store);
+
+protected:
+ ~CStatePropDataLoader() {};
+};
+
+#endif //_STATEPROPDATA_HPP_
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdatatypes.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdatatypes.hpp
new file mode 100644
index 0000000..4d035af
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdatatypes.hpp
@@ -0,0 +1,45 @@
+#ifndef _STATEPROPDATATYPES_HPP_
+#define _STATEPROPDATATYPES_HPP_
+
+//Transition data
+struct TransitionData
+{
+ unsigned int autoTransition;
+ unsigned int toState;
+ float onFrame;
+};
+
+//Visibility data
+struct VisibilityData
+{
+ unsigned int isVisible;
+};
+
+//Frame controller data
+struct FrameControllerData
+{
+ unsigned int isCyclic;
+ unsigned int numberOfCycles;
+ unsigned int holdFrame;
+ float minFrame;
+ float maxFrame;
+ float relativeSpeed;
+};
+
+//Event data
+struct EventData
+{
+ char eventName[64];
+ unsigned int eventID;
+ unsigned int toState;
+};
+
+//Callback data
+struct CallbackData
+{
+ char callbackName[64];
+ unsigned int callbackID;
+ float onFrame;
+};
+
+#endif //_STATEPROPDATATYPES_HPP_
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.cpp
new file mode 100644
index 0000000..2d31863
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.cpp
@@ -0,0 +1,879 @@
+/*===========================================================================
+Workspace.cpp - Pure3D testbed
+
+
+ Copyright (c) 1995-1999 Radical Entertainment, Inc.
+ All rights reserved.
+===========================================================================*/
+#include <windows.h>
+
+#include <assert.h>
+#include <string.h>
+#include <typeinfo.h>
+#include <ctype.h> //for isdigit
+#include <stdlib.h> //for atoi
+
+#include <p3d/pure3d.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <p3d/anim/poseanimation.hpp>
+#include <p3d/anim/skeleton.hpp>
+#include <p3d/geometry.hpp>
+#include <p3d/anim/polyskin.hpp>
+#include <p3d/utility.hpp>
+#include <p3d/drawable.hpp>
+
+#include <simcommon/simutility.hpp>
+#include <simcommon/simenvironment.hpp> // for SimUnits
+#include <simcommon/simulatedobject.hpp>
+#include <simcollision/collisionmanager.hpp>
+#include <simcollision/collisiondisplay.hpp>
+#include <simcollision/proximitydetection.hpp>
+
+#include <sp/interface.hpp>
+#include "workspace.hpp"
+
+#include "stateprop.hpp"
+#include "statepropdata.hpp"
+
+void RegisterExtraChunks(void)
+{ //do nothing
+}
+
+bool g_DrawCollision = true;
+bool g_IsPaused = false;
+bool g_DebugPhysicsDisplay = false;
+float g_TotalTime_sec = 0.f;
+
+const char c_StatePropExtension[] = "_spdata.p3d";
+
+
+Workspace* g_Workspace = NULL;
+CStateProp* g_CStateProp = NULL;
+
+template <class T> class TemplateIterator : public ViewerIterator
+{
+public:
+ TemplateIterator(T* t)
+ {
+ iterator = t;
+ current = iterator->First();
+ }
+
+ ~TemplateIterator()
+ {
+ delete iterator;
+ }
+
+ tEntity* First(void)
+ {
+ current = iterator->First();
+
+ return current;
+ }
+
+ tEntity* Current(void)
+ {
+ if(!current)
+ current = iterator->First();
+
+ return current;
+ }
+
+ tEntity* Next(bool loop = false)
+ {
+ current = iterator->Next();
+ if(loop && !current)
+ current = iterator->First();
+ return current;
+ }
+
+ tEntity* Prev(void)
+ {
+ current = iterator->Prev();
+ if(!current)
+ current = iterator->Last();
+ return current;
+
+ }
+
+private:
+ T* iterator;
+ tEntity* current;
+};
+
+class DrawIterator : public tInventory::Iterator<tDrawable> {};
+class ObjectFactoryIterator : public tInventory::Iterator<tAnimatedObjectFactory> {};
+class CStatePropDataIterator : public tInventory::Iterator<CStatePropData> {};
+
+
+//Get allocated memory
+unsigned int GetAllocatedMemory()
+{
+ // on windows can't rely on the total physical memory so we must walk over
+ // each heap and accumulate all the memory allocated in it. there is stack
+ // overhead too but that should be minimal.
+ HANDLE heaps[128];
+
+ int numHeaps = GetProcessHeaps(sizeof(heaps)/sizeof(heaps[0]), heaps);
+ if(numHeaps > sizeof(heaps)/sizeof(heaps[0]))
+ {
+ numHeaps = sizeof(heaps)/sizeof(heaps[0]);
+ }
+
+ unsigned int total = 0;
+ int i;
+ for(i=0; i<numHeaps; i++)
+ {
+ PROCESS_HEAP_ENTRY heapEntry;
+
+ heapEntry.lpData = NULL;
+ if(!HeapLock(heaps[i]))
+ {
+ //HC_DEBUGPRINT(("could not lock heap %d", i));
+ continue;
+ }
+ while(HeapWalk(heaps[i], &heapEntry))
+ {
+ if(heapEntry.wFlags & PROCESS_HEAP_UNCOMMITTED_RANGE)
+ {
+ // don't count non-committed pages as some of pure3d seems to
+ // mmap or allocate large ranges that never actually get paged
+ // in
+ //total += heapEntry.cbData;
+ }
+ else
+ {
+ total += heapEntry.cbData;
+ }
+ }
+ HeapUnlock(heaps[i]);
+ }
+
+ return total;
+}
+
+//-------------------------------------------------------------------
+// Workspace class
+// derive from Testbed.
+//
+//-------------------------------------------------------------------
+
+Workspace::Workspace() :
+ m_CStateProp(NULL),
+ m_CollisionManager(NULL),
+ m_CollisionSolver(NULL),
+ m_DrawableFloor(NULL),
+ m_SimStateFloor(NULL)
+{
+ sim::InstallSimLoaders();
+
+ //draw outlines for debug render
+ sim::SetDrawVolumeMethod( sim::DrawVolumeShape );
+
+ Init();
+}
+
+
+Workspace::~Workspace()
+{
+ ResetAll();
+
+ if ( m_CStateProp )
+ m_CStateProp->Release();
+
+ p3d::loadManager->RemoveAllHandlers(); // should be in testbed
+}
+
+void Workspace::Init()
+{
+ // get path to exe
+ GetModuleFileName(NULL, m_Path, sizeof(m_Path) - 1);
+ m_Path[ strlen(m_Path) - 13 ] = '\0';
+
+ m_DrawableIterator = new TemplateIterator<DrawIterator>(new DrawIterator);
+ m_ObjectFactoryIterator = new TemplateIterator<ObjectFactoryIterator>(new ObjectFactoryIterator);
+ m_CStatePropDataIterator = new TemplateIterator<CStatePropDataIterator>(new CStatePropDataIterator);
+
+ // install loader for Prop
+ tP3DFileHandler* p3d = p3d::loadManager->GetP3DHandler();
+ if(p3d)
+ {
+ p3d->AddHandler( new CStatePropDataLoader );
+ }
+
+ if (!sim::SimUnits::UnitSet())
+ {
+ sim::InitializeSimulation( sim::MetersUnits );
+ }
+
+ if (!m_CollisionManager)
+ {
+ float MAX_UPDATEAI_TIME_ms = 1000.0f*1.0f/30.0f; // 30 fps
+ //sim::SimulatedObject::SetMaxTimeStep(MAX_UPDATEAI_TIME_ms/1000.0f);
+ float collisionDistanceCGS = 2.0f; // cm
+ m_CollisionManager = sim::CollisionManager::GetInstance();
+ m_CollisionManager->AddRef();
+ sim::SimEnvironment* simEnvironment = sim::SimEnvironment::GetDefaultSimEnvironment();
+ simEnvironment->SetCollisionDistanceCGS(collisionDistanceCGS);
+ m_CollisionManager->SetCollisionManagerAttributes( sim::CM_DetectAll | sim::CM_SolveAll );
+
+ P3DASSERT(m_CollisionSolver == NULL);
+ m_CollisionSolver = new AICollisionSolverAgent();
+ m_CollisionSolver->AddRef();
+ m_CollisionManager->GetImpulseBasedCollisionSolver()->SetCollisionSolverAgent(m_CollisionSolver);
+ }
+}
+
+void Workspace::LoadFloor( const char* p3dfilename )
+{
+ if ( m_DrawableFloor )
+ m_DrawableFloor->Release();
+
+ if ( m_SimStateFloor )
+ m_SimStateFloor->Release();
+
+ //check that a data file exist
+ FILE* p = fopen( p3dfilename , "r" );
+ if ( p )
+ {
+ p3d::inventory->RemoveAllElements();
+
+ (void) p3d::load(p3dfilename);
+
+ m_DrawableFloor = p3d::find<tDrawable>("floorShape");
+ if ( m_DrawableFloor )
+ m_DrawableFloor->AddRef();
+
+ fclose(p);
+ }
+}
+
+void Workspace::ResetAll(bool emptyInventory)
+{
+ if (emptyInventory)
+ {
+ delete m_DrawableIterator;
+ delete m_ObjectFactoryIterator;
+ delete m_CStatePropDataIterator;
+
+ p3d::inventory->RemoveAllElements();
+ }
+
+ ResetProp();
+
+
+ if ( m_CollisionSolver )
+ {
+ m_CollisionSolver->Release();
+ m_CollisionSolver = NULL;
+ }
+
+ if ( m_CollisionManager )
+ {
+ m_CollisionManager->ResetAll();
+ m_CollisionManager->Release();
+ m_CollisionManager = NULL;
+ }
+
+ this->Init();
+}
+
+void Workspace::Advance(float dt_ms)
+{
+ g_TotalTime_sec += dt_ms / 1000.f;
+ float inDt_Sec = dt_ms / 1000.f;
+
+ if ( !g_IsPaused )
+ {
+ if ( m_CStateProp )
+ {
+ m_CStateProp->Update(dt_ms);
+ }
+ if ( m_CollisionManager )
+ {
+ m_CollisionManager->Update( inDt_Sec , g_TotalTime_sec );
+ }
+ }
+}
+
+void Workspace::Display(tContext* context)
+{
+ if ( m_DrawableFloor )
+ {
+ m_DrawableFloor->Display();
+ }
+
+ if ( m_CStateProp )
+ {
+ m_CStateProp->UpdateFrameControllersForRender();
+ m_CStateProp->Render();
+ }
+
+ if ( g_DrawCollision )
+ {
+ sim::DisplayCollisionObjects(sim::CollisionManager::GetInstance());
+ }
+}
+
+void Workspace::ResetProp()
+{
+ if ( m_CStateProp )
+ {
+ m_CStateProp->Release();
+ }
+
+ m_CStateProp = NULL;
+ g_CStateProp = NULL;
+}
+
+int Workspace::Load( const char* name )
+{
+ ResetAll();
+
+ (void) p3d::load(name);
+
+ //Search for object factories
+ m_ObjectFactoryIterator->First();
+ m_CStatePropDataIterator->First();
+
+ if ( m_ObjectFactoryIterator->Current() && m_CStatePropDataIterator->Current() )
+ {
+ //if we have an objectfactory and a prop we are good (1 file with all chunks)
+ CStatePropData* statePropData = ((CStatePropData*)m_CStatePropDataIterator->Current());
+ m_CStateProp = CStateProp::CreateCStateProp( statePropData , 0 );
+ m_CStateProp->AddRef();
+ }
+ else if( m_ObjectFactoryIterator->Current() )
+ {
+ //if we just have the factory we need the file with the prop data so load it
+ char buf[256];
+ memcpy( buf , name , strlen(name) - strlen(".p3d") );
+ buf[strlen(name) - strlen(".p3d")] = '\0';
+ strcat(buf , c_StatePropExtension );
+
+ //check that a data file exist
+ FILE* p = fopen( buf , "r" );
+ if ( p )
+ {
+ (void) p3d::load(buf);
+
+ m_CStatePropDataIterator->First();
+ if ( m_CStatePropDataIterator->Current() )
+ {
+ //if we have an objectfactory and a prop we are good (1 file with all chunks)
+ CStatePropData* statePropData = ((CStatePropData*)m_CStatePropDataIterator->Current());
+ m_CStateProp = CStateProp::CreateCStateProp( statePropData , 0 );
+ m_CStateProp->AddRef();
+ }
+ fclose(p);
+ }
+ else
+ {
+ //Create a new prop
+ CStatePropData* statePropData = new CStatePropData( (tAnimatedObjectFactory*)m_ObjectFactoryIterator->Current() );
+ if ( statePropData )
+ {
+ m_CStateProp = CStateProp::CreateCStateProp( statePropData , 0 );
+ m_CStateProp->AddRef();
+ }
+ }
+ }
+ else if( m_CStatePropDataIterator->Current() )
+ {
+ //if we just have the prop we need the file with the factory
+ char buf[256];
+ memcpy( buf , name , strlen(name) - strlen(c_StatePropExtension) );
+ buf[strlen(name) - strlen(c_StatePropExtension)] = '\0';
+ strcat(buf , ".p3d");
+
+ //check that a data file exist
+ FILE* p = fopen( buf , "r" );
+ if ( p )
+ {
+ (void) p3d::load(buf);
+
+ m_ObjectFactoryIterator->First();
+ if ( m_ObjectFactoryIterator->Current() )
+ {
+ CStatePropData* statePropData = ((CStatePropData*)m_CStatePropDataIterator->Current());
+ m_CStateProp = CStateProp::CreateCStateProp( statePropData , 0 );
+ m_CStateProp->AddRef();
+ }
+ fclose(p);
+ }
+ else
+ {
+ //no file associated with this prop data...
+ ResetAll();
+ }
+ }
+
+ if ( m_CStateProp )
+ {
+ g_CStateProp = m_CStateProp;
+ }
+ else
+ {
+ g_CStateProp = NULL;
+ }
+
+
+ return 1;
+}
+
+
+//=============================================================================
+// CStateProp - DLL interface
+//=============================================================================
+//Load a pure3D file with art for the background===============================
+int SP_CALLCONV SPLoadBackground( const char* filename )
+{
+ if ( g_Workspace )
+ {
+ g_Workspace->LoadFloor( filename );
+ return 1;
+ }
+ return 0;
+}
+
+//Load pure3D file ============================================================
+int SP_CALLCONV SPLoad( const char* filename )
+{
+ if ( g_Workspace )
+ {
+ g_Workspace->Load( filename );
+ return 1;
+ }
+ return 0;
+}
+
+//Export the SmartPropData ====================================================
+int SP_CALLCONV SPExportStatePropData( const char* filename )
+{
+ if ( g_CStateProp )
+ {
+ char buf[256];
+ memcpy( buf , filename , strlen(filename) - strlen(".p3d") );
+ buf[strlen(filename) - strlen(".p3d")] = '\0';
+ strcat( buf , c_StatePropExtension );
+ g_CStateProp->ExportChunk( buf );
+ return 1;
+ }
+ return 0;
+}
+
+//Display collision ==========================================================
+int SP_CALLCONV SPShowCollision( int show )
+{
+ g_DrawCollision = ( show == 1 );
+ return 1;
+}
+
+//Prop name ===================================================================
+const char* SP_CALLCONV SPGetPropName()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetCStatePropData()->GetName();
+ }
+ return NULL;
+}
+
+//advance ====================================================================
+int SP_CALLCONV SPPause( bool b )
+{
+ g_IsPaused = b;
+ return 1;
+}
+int SP_CALLCONV SPAdvanceOneFrame()
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->Update( 100.f );
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPBackOneFrame()
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->Update( -100.f );
+ return 1;
+ }
+ return 0;
+}
+
+// State Data =================================================================
+unsigned int SP_CALLCONV SPGetNumberOfStates()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetCStatePropData()->GetNumberOfStates();
+ }
+ return 0;
+}
+
+int SP_CALLCONV SPInsertState( unsigned int state )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->InsertState( state );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPDeleteState( unsigned int state )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->DeleteState( state );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+
+int SP_CALLCONV SPGetCurrentState()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetState();
+ }
+ return 0;
+}
+int SP_CALLCONV SPNextState()
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->NextState();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPPrevState()
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->PrevState();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetState( unsigned int state )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->SetState( state );
+ return 1;
+ }
+ return 0;
+}
+
+//Transition Data =============================================================
+bool SP_CALLCONV SPGetTransitionData( int state , TransitionData* transitionData )
+{
+ if ( g_CStateProp )
+ {
+ transitionData->autoTransition = g_CStateProp->GetCStatePropData()->GetTransitionData( state ).autoTransition;
+ transitionData->onFrame = g_CStateProp->GetCStatePropData()->GetTransitionData( state ).onFrame;
+ transitionData->toState = g_CStateProp->GetCStatePropData()->GetTransitionData( state ).toState;
+ return true;
+ }
+ return false;
+}
+int SP_CALLCONV SPSetAutoTransition( int state, bool b )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetAutoTransition( state , b );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetAutoTransitionOnFrame( int state, float onFrame )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetAutoTransitionOnFrame( state , onFrame );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetAutoTransitionToState( int state, int toState )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetAutoTransitionToState( state , toState );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+
+//Visibility Data =============================================================
+bool SP_CALLCONV SPGetVisibilityData( int state , int index , VisibilityData* visibilityData )
+{
+ if ( g_CStateProp )
+ {
+ visibilityData->isVisible = g_CStateProp->GetCStatePropData()->GetVisibilityData( state , index ).isVisible;
+ return true;
+ }
+ return false;
+}
+int SP_CALLCONV SPSetVisible( int state , int index , bool b )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetVisible( state , index , b );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetAllVisibilities( int state , bool b )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetAllVisibilities( state , b );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPShowAll(int state)
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->ShowAll( state );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPHideAll(int state)
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->HideAll( state );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+
+SP_IMPORT int SP_CALLCONV SPGetNumDrawables()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetNumberOfDrawableElements();
+ }
+ return 0;
+}
+
+const char* SP_CALLCONV SPGetDrawableName( int index )
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetDrawableName( index );
+ }
+ return NULL;
+}
+
+//Frame Controller Data =======================================================
+bool SPGetFrameControllerData( int state, int fc , FrameControllerData* fcData )
+{
+ if ( g_CStateProp )
+ {
+ fcData->holdFrame = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).holdFrame;
+ fcData->isCyclic = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).isCyclic;
+ fcData->maxFrame = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).maxFrame;
+ fcData->minFrame = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).minFrame;
+ fcData->numberOfCycles = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).numberOfCycles;
+ fcData->relativeSpeed = g_CStateProp->GetCStatePropData()->GetFrameControllerData( state , fc ).relativeSpeed;
+ return true;
+ }
+ return false;
+}
+int SP_CALLCONV SPSetCyclic( int state ,int fc, bool isCyclic )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetCyclic( state , fc , isCyclic );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetRelativeSpeed( int state ,int fc, float speed )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetRelativeSpeed( state , fc , speed );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetFrameRange( int state ,int fc, float min, float max )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetFrameRange( state , fc , min , max );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetHoldFrame( int state , int fc , bool holdFrame )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetHoldFrame( state , fc , holdFrame );
+ g_CStateProp->UpdateOnDataEdit();
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPSetNumberOfCycles( int state , int fc , unsigned int numberOfCycles )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->SetNumberOfCycles( state , fc , numberOfCycles );
+ return 1;
+ }
+ return 0;
+}
+
+int SP_CALLCONV SPGetNumFrameControllers()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetNumberOfFrameControllers();
+ }
+ return 0;
+}
+float SP_CALLCONV SPGetBaseFrameControllerFrame()
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetBaseFrameControllerFrame();
+ }
+ return 0.f;
+}
+float SP_CALLCONV SPGetFrameControllerFrame( int index )
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetFrameControllerByIndex( index )->GetFrame();
+ }
+ return 0.f;
+}
+const char* SP_CALLCONV SPGetFrameControllerName( int index )
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetFrameControllerByIndex( index )->GetName();
+ }
+ return NULL;
+}
+
+//Event Data ==================================================================
+unsigned int SP_CALLCONV SPGetNumberOfEvents( int state )
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetCStatePropData()->GetNumberOfEvents( state );
+ }
+ return 0;
+}
+bool SP_CALLCONV SPGetEventData( int state , int eventindex , EventData *eventData)
+{
+ if ( g_CStateProp )
+ {
+ EventData ed = g_CStateProp->GetCStatePropData()->GetEventData( state , eventindex );
+ eventData->eventID = ed.eventID;
+ strcpy( eventData->eventName , ed.eventName );
+ eventData->toState = ed.toState;
+ return true;
+ }
+ return false;
+}
+int SP_CALLCONV SPAddEvent( const char* event , int eventEnum , int toState , int fromState )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->AddEvent( event , eventEnum , toState , fromState );
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPEditEvent( int state, int EventIndex, char* eventName, int eventEnum , int toState )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->EditEvent( state , EventIndex , eventName , eventEnum , toState );
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPDeleteEvent( int fromState , int index )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->DeleteEvent( fromState , index );
+ return 1;
+ }
+ return 0;
+}
+
+//Callback Data ===============================================================
+unsigned int SP_CALLCONV SPGetNumberOfCallbacks( int state )
+{
+ if ( g_CStateProp )
+ {
+ return g_CStateProp->GetCStatePropData()->GetNumberOfCallbacks( state );
+ }
+ return 0;
+}
+bool SP_CALLCONV SPGetCallbackData( int state , int index , CallbackData* callbackData )
+{
+ if ( g_CStateProp )
+ {
+ callbackData->callbackID = g_CStateProp->GetCStatePropData()->GetCallbackData( state , index ).callbackID;
+ strcpy( callbackData->callbackName , g_CStateProp->GetCStatePropData()->GetCallbackData( state , index ).callbackName );
+ callbackData->onFrame = g_CStateProp->GetCStatePropData()->GetCallbackData( state , index ).onFrame;
+ return true;
+ }
+ return false;
+}
+int SP_CALLCONV SPAddCallback( int state , const char* event , int eventEnum , float frame )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->AddCallback( state , event , eventEnum , frame );
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPEditCallback( int state, int CBIndex, char* eventname, int eventEnum , float frame )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->EditCallback( state , CBIndex , eventname , eventEnum , frame );
+ return 1;
+ }
+ return 0;
+}
+int SP_CALLCONV SPDeleteCallback( int state , int index )
+{
+ if ( g_CStateProp )
+ {
+ g_CStateProp->GetCStatePropData()->DeleteCallback( state , index );
+ return 1;
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.hpp
new file mode 100644
index 0000000..e476ebf
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/workspace.hpp
@@ -0,0 +1,67 @@
+#ifndef _WORKSPACE_HPP_
+#define _WORKSPACE_HPP_
+
+#include <radmath/radmath.hpp>
+#include <simcollision/collisionmanager.hpp>
+
+#include "aicollisionsolveragent.hpp"
+
+class CStateProp;
+class tDrawable;
+
+//=============================================================================
+// Class Declarations
+// ViewerIterator
+//=============================================================================
+class ViewerIterator
+{
+public:
+ virtual ~ViewerIterator() {}
+ virtual tEntity* Current(void) = 0;
+ virtual tEntity* Next(bool loop = false) = 0;
+ virtual tEntity* Prev(void) = 0;
+ virtual tEntity* First(void) = 0;
+};
+
+
+//=============================================================================
+// Class Declarations
+// Workspace
+//=============================================================================
+class Workspace : public tRefCounted
+{
+public:
+ Workspace();
+ ~Workspace();
+
+ void Init();
+ void ResetAll( bool emptyInventory = true );
+ void Advance(float dt_ms);
+ void Display(tContext* context);
+
+ int Load( const char* name );
+ int Pause(bool b);
+
+ void LoadFloor( const char* p3dfilename );
+
+private:
+
+ void ResetProp();
+ CStateProp* m_CStateProp;
+
+ AICollisionSolverAgent *m_CollisionSolver;
+ sim::CollisionManager* m_CollisionManager;
+
+ ViewerIterator* m_DrawableIterator;
+ ViewerIterator* m_ObjectFactoryIterator;
+ ViewerIterator* m_CStatePropDataIterator;
+
+ tDrawable* m_DrawableFloor;
+ sim::SimState* m_SimStateFloor;
+
+ char m_Path[256];
+};
+
+
+
+#endif
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/interface/base.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/base.hpp
new file mode 100644
index 0000000..dd8fe32
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/base.hpp
@@ -0,0 +1,25 @@
+/*
+ * fv/interface/base.hpp
+ */
+
+
+#ifndef SP_INTERFACE_BASE_HPP
+#define SP_INTERFACE_BASE_HPP
+
+
+#define WIN32_LEAN_AND_MEAN
+#define WIN32_EXTRA_LEAN
+#include <windows.h>
+
+
+#ifdef SMARTPROP_ENGINE
+# define SP_IMPORT __declspec(dllexport)
+#else
+# define SP_IMPORT __declspec(dllimport)
+#endif
+
+
+#define SP_CALLCONV __cdecl
+
+
+#endif // SP_INTERFACE_BASE_HPP
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/interface/context.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/context.hpp
new file mode 100644
index 0000000..72da9a0
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/context.hpp
@@ -0,0 +1,50 @@
+/*
+ * sp/interface/context.hpp
+ */
+
+
+#ifndef SP_INTERFACE_CONTEXT_HPP
+#define SP_INTERFACE_CONTEXT_HPP
+
+#include <sp/interface/base.hpp>
+
+
+extern "C"
+{
+
+ SP_IMPORT int SP_CALLCONV SPContextOpen(HWND hwnd);
+ SP_IMPORT int SP_CALLCONV SPContextClose();
+
+ SP_IMPORT int SP_CALLCONV SPContextViewResize(int w, int h);
+
+ SP_IMPORT int SP_CALLCONV SPContextIsPDDIStatsEnabled();
+ SP_IMPORT int SP_CALLCONV SPContextSetIsPDDIStatsEnabled(int statsEnabled);
+
+ SP_IMPORT int SP_CALLCONV SPContextAdvance();
+ SP_IMPORT int SP_CALLCONV SPContextDisplay();
+
+ SP_IMPORT int SP_CALLCONV SPContextMouseDown(int button, int shift, int x, int y);
+ SP_IMPORT int SP_CALLCONV SPContextMouseMove(int button, int shift, int x, int y);
+ SP_IMPORT int SP_CALLCONV SPContextMouseUp(int button, int shift, int x, int y);
+ SP_IMPORT int SP_CALLCONV SPContextMouseWheel(int scroll);
+
+ SP_IMPORT float SP_CALLCONV SPSimulationGetFPS();
+ SP_IMPORT float SP_CALLCONV SPSimulationGetRate();
+ SP_IMPORT int SP_CALLCONV SPSimulationSetRate(float rate);
+
+ SP_IMPORT unsigned int SP_CALLCONV SPGetMemoryUsage();
+
+ SP_IMPORT int SP_CALLCONV SPContextGetCameraLock();
+ SP_IMPORT int SP_CALLCONV SPContextSetCameraLock(int cameraLock);
+
+ SP_IMPORT int SP_CALLCONV SPInventoryClear();
+ SP_IMPORT int SP_CALLCONV SPInventoryGetEntityCount();
+ SP_IMPORT int SP_CALLCONV SPInventoryGetEntityName(int index, char* name, int nameLen, char* type, int typeLen);
+
+ SP_IMPORT int SP_CALLCONV SPSetBackgroundColour( int r , int g , int b );
+
+
+} // extern "C"
+
+
+#endif // SP_INTERFACE_CONTEXT_HPP
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/interface/platform.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/platform.hpp
new file mode 100644
index 0000000..8a2ba13
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/platform.hpp
@@ -0,0 +1,24 @@
+/*
+ * fv/interface/platform.hpp
+ */
+
+
+#ifndef SP_INTERFACE_PLATFORM_HPP
+#define SP_INTERFACE_PLATFORM_HPP
+
+
+#include <sp/interface/base.hpp>
+
+
+extern "C"
+{
+
+
+SP_IMPORT int SP_CALLCONV SPPlatformOpen(HWND hwnd);
+SP_IMPORT int SP_CALLCONV SPPlatformClose();
+
+
+} // extern "C"
+
+
+#endif // SP_INTERFACE_PLATFORM_HPP
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/interface/workspace.hpp b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/workspace.hpp
new file mode 100644
index 0000000..210ac8a
--- /dev/null
+++ b/tools/statepropbuilder/apps/spbuilder/code/sp/interface/workspace.hpp
@@ -0,0 +1,89 @@
+/*
+ * fv/interface/platform.hpp
+ */
+
+#ifndef SP_INTERFACE_WORKSPACE_HPP
+#define SP_INTERFACE_WORKSPACE_HPP
+
+#include <sp/interface/base.hpp>
+#include <sp/engine/statepropdatatypes.hpp>
+
+extern "C"
+{
+ //Load Background =============================================================
+ SP_IMPORT int SP_CALLCONV SPLoadBackground( const char* filename );
+
+ //Load ========================================================================
+ SP_IMPORT int SP_CALLCONV SPLoad( const char* filename );
+
+ //Export ======================================================================
+ SP_IMPORT int SP_CALLCONV SPExportStatePropData( const char* filename );
+
+ //Draw collision ==============================================================
+ SP_IMPORT int SP_CALLCONV SPShowCollision( int show );
+
+ //Prop name ===================================================================
+ SP_IMPORT const char* SP_CALLCONV SPGetPropName();
+
+ //Advance =====================================================================
+ SP_IMPORT int SP_CALLCONV SPPause( bool b );
+ SP_IMPORT int SP_CALLCONV SPAdvanceOneFrame();
+ SP_IMPORT int SP_CALLCONV SPBackOneFrame();
+
+ // State Data =================================================================
+ SP_IMPORT unsigned int SP_CALLCONV SPGetNumberOfStates();
+ SP_IMPORT int SP_CALLCONV SPInsertState( unsigned int state );
+ SP_IMPORT int SP_CALLCONV SPDeleteState( unsigned int state );
+
+ SP_IMPORT int SP_CALLCONV SPGetCurrentState();
+ SP_IMPORT int SP_CALLCONV SPNextState();
+ SP_IMPORT int SP_CALLCONV SPPrevState();
+ SP_IMPORT int SP_CALLCONV SPSetState( unsigned int state );
+
+ //Transition Data =============================================================
+ SP_IMPORT bool SP_CALLCONV SPGetTransitionData( int state , TransitionData* transitionData );
+ SP_IMPORT int SP_CALLCONV SPSetAutoTransition( int state, bool b );
+ SP_IMPORT int SP_CALLCONV SPSetAutoTransitionOnFrame( int state, float onFrame );
+ SP_IMPORT int SP_CALLCONV SPSetAutoTransitionToState( int state, int toState );
+
+ //Visibility Data =============================================================
+ SP_IMPORT bool SP_CALLCONV SPGetVisibilityData( int state , int index , VisibilityData* visibilityData );
+ SP_IMPORT int SP_CALLCONV SPSetVisible( int state , int index , bool b );
+ SP_IMPORT int SP_CALLCONV SPSetAllVisibilities( int state , bool b );
+ SP_IMPORT int SP_CALLCONV SPShowAll(int state);
+ SP_IMPORT int SP_CALLCONV SPHideAll(int state);
+
+ SP_IMPORT int SP_CALLCONV SPGetNumDrawables();
+ SP_IMPORT const char* SP_CALLCONV SPGetDrawableName( int index );
+
+ //Frame Controller Data =======================================================
+ SP_IMPORT bool SPGetFrameControllerData( int state, int fc , FrameControllerData* fcData );
+ SP_IMPORT int SP_CALLCONV SPSetCyclic( int state ,int fc, bool isCyclic );
+ SP_IMPORT int SP_CALLCONV SPSetRelativeSpeed( int state ,int fc, float speed );
+ SP_IMPORT int SP_CALLCONV SPSetFrameRange( int state ,int fc, float min, float max );
+ SP_IMPORT int SP_CALLCONV SPSetHoldFrame( int state , int fc , bool holdFrame );
+ SP_IMPORT int SP_CALLCONV SPSetNumberOfCycles( int state , int fc , unsigned int numberOfCycles );
+
+ SP_IMPORT int SP_CALLCONV SPGetNumFrameControllers();
+ SP_IMPORT float SP_CALLCONV SPGetBaseFrameControllerFrame();
+ SP_IMPORT float SP_CALLCONV SPGetFrameControllerFrame( int index );
+ SP_IMPORT const char* SP_CALLCONV SPGetFrameControllerName( int index );
+
+ //Event Data ==================================================================
+ SP_IMPORT unsigned int SP_CALLCONV SPGetNumberOfEvents( int state );
+ SP_IMPORT bool SP_CALLCONV SPGetEventData( int state , int eventindex , EventData *eventData);
+ SP_IMPORT int SP_CALLCONV SPAddEvent( const char* event , int eventEnum , int toState , int fromState );
+ SP_IMPORT int SP_CALLCONV SPEditEvent( int state, int EventIndex, char* eventName, int eventEnum , int toState );
+ SP_IMPORT int SP_CALLCONV SPDeleteEvent( int fromState , int index );
+
+ //Callback Data ===============================================================
+ SP_IMPORT unsigned int SP_CALLCONV SPGetNumberOfCallbacks( int state );
+ SP_IMPORT bool SP_CALLCONV SPGetCallbackData( int state , int index , CallbackData* callbackData );
+ SP_IMPORT int SP_CALLCONV SPAddCallback( int state , const char* event , int eventEnum , float frame );
+ SP_IMPORT int SP_CALLCONV SPEditCallback( int state, int CBIndex, char* eventname, int eventEnum , float frame );
+ SP_IMPORT int SP_CALLCONV SPDeleteCallback( int state , int index );
+}
+
+
+#endif // SP_INTERFACE_WORKSPACE_HPP
+
diff --git a/tools/statepropbuilder/art/BombBlloon.p3d b/tools/statepropbuilder/art/BombBlloon.p3d
new file mode 100644
index 0000000..2077297
--- /dev/null
+++ b/tools/statepropbuilder/art/BombBlloon.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/BombBlloon_spdata.p3d b/tools/statepropbuilder/art/BombBlloon_spdata.p3d
new file mode 100644
index 0000000..a62b052
--- /dev/null
+++ b/tools/statepropbuilder/art/BombBlloon_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/Bouncy_Ape.p3d b/tools/statepropbuilder/art/Bouncy_Ape.p3d
new file mode 100644
index 0000000..90a12c0
--- /dev/null
+++ b/tools/statepropbuilder/art/Bouncy_Ape.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/Bouncy_Ape_spdata.p3d b/tools/statepropbuilder/art/Bouncy_Ape_spdata.p3d
new file mode 100644
index 0000000..56d5ab8
--- /dev/null
+++ b/tools/statepropbuilder/art/Bouncy_Ape_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/air_pump_1.p3d b/tools/statepropbuilder/art/air_pump_1.p3d
new file mode 100644
index 0000000..9ae0c3b
--- /dev/null
+++ b/tools/statepropbuilder/art/air_pump_1.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/air_pump_1_collision.p3d b/tools/statepropbuilder/art/air_pump_1_collision.p3d
new file mode 100644
index 0000000..d0469a5
--- /dev/null
+++ b/tools/statepropbuilder/art/air_pump_1_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/air_pump_1_spdata.p3d b/tools/statepropbuilder/art/air_pump_1_spdata.p3d
new file mode 100644
index 0000000..a92e52a
--- /dev/null
+++ b/tools/statepropbuilder/art/air_pump_1_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/ball_rebounder.p3d b/tools/statepropbuilder/art/ball_rebounder.p3d
new file mode 100644
index 0000000..7c8325c
--- /dev/null
+++ b/tools/statepropbuilder/art/ball_rebounder.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/ball_rebounder_collision.p3d b/tools/statepropbuilder/art/ball_rebounder_collision.p3d
new file mode 100644
index 0000000..0552a78
--- /dev/null
+++ b/tools/statepropbuilder/art/ball_rebounder_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/ball_rebounder_spdata.p3d b/tools/statepropbuilder/art/ball_rebounder_spdata.p3d
new file mode 100644
index 0000000..5e59b10
--- /dev/null
+++ b/tools/statepropbuilder/art/ball_rebounder_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/ball_target.p3d b/tools/statepropbuilder/art/ball_target.p3d
new file mode 100644
index 0000000..71b1894
--- /dev/null
+++ b/tools/statepropbuilder/art/ball_target.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/ball_target_spdata.p3d b/tools/statepropbuilder/art/ball_target_spdata.p3d
new file mode 100644
index 0000000..48997fb
--- /dev/null
+++ b/tools/statepropbuilder/art/ball_target_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/barrel.p3d b/tools/statepropbuilder/art/barrel.p3d
new file mode 100644
index 0000000..4206759
--- /dev/null
+++ b/tools/statepropbuilder/art/barrel.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/barrel_collision.p3d b/tools/statepropbuilder/art/barrel_collision.p3d
new file mode 100644
index 0000000..83ed542
--- /dev/null
+++ b/tools/statepropbuilder/art/barrel_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/barrel_spdata.p3d b/tools/statepropbuilder/art/barrel_spdata.p3d
new file mode 100644
index 0000000..1aebe2f
--- /dev/null
+++ b/tools/statepropbuilder/art/barrel_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/big_gulp_of_pop.p3d b/tools/statepropbuilder/art/big_gulp_of_pop.p3d
new file mode 100644
index 0000000..30c82b3
--- /dev/null
+++ b/tools/statepropbuilder/art/big_gulp_of_pop.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/big_gulp_of_pop_spdata.p3d b/tools/statepropbuilder/art/big_gulp_of_pop_spdata.p3d
new file mode 100644
index 0000000..778c19d
--- /dev/null
+++ b/tools/statepropbuilder/art/big_gulp_of_pop_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/biker_chick_temp.p3d b/tools/statepropbuilder/art/biker_chick_temp.p3d
new file mode 100644
index 0000000..02a8679
--- /dev/null
+++ b/tools/statepropbuilder/art/biker_chick_temp.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/biker_chick_temp_spdata.p3d b/tools/statepropbuilder/art/biker_chick_temp_spdata.p3d
new file mode 100644
index 0000000..7be8b7c
--- /dev/null
+++ b/tools/statepropbuilder/art/biker_chick_temp_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/box_of_chips.p3d b/tools/statepropbuilder/art/box_of_chips.p3d
new file mode 100644
index 0000000..fad2970
--- /dev/null
+++ b/tools/statepropbuilder/art/box_of_chips.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/box_of_chips_spdata.p3d b/tools/statepropbuilder/art/box_of_chips_spdata.p3d
new file mode 100644
index 0000000..40b8d00
--- /dev/null
+++ b/tools/statepropbuilder/art/box_of_chips_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/box_wooden.p3d b/tools/statepropbuilder/art/box_wooden.p3d
new file mode 100644
index 0000000..1df915a
--- /dev/null
+++ b/tools/statepropbuilder/art/box_wooden.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/box_wooden_spdata.p3d b/tools/statepropbuilder/art/box_wooden_spdata.p3d
new file mode 100644
index 0000000..fd6fa29
--- /dev/null
+++ b/tools/statepropbuilder/art/box_wooden_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/cage_collision.p3d b/tools/statepropbuilder/art/cage_collision.p3d
new file mode 100644
index 0000000..bd93544
--- /dev/null
+++ b/tools/statepropbuilder/art/cage_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/cameraTrigger.p3d b/tools/statepropbuilder/art/cameraTrigger.p3d
new file mode 100644
index 0000000..01ec9ad
--- /dev/null
+++ b/tools/statepropbuilder/art/cameraTrigger.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/camera_test.p3d b/tools/statepropbuilder/art/camera_test.p3d
new file mode 100644
index 0000000..a4e70ac
--- /dev/null
+++ b/tools/statepropbuilder/art/camera_test.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/camera_test_collision.p3d b/tools/statepropbuilder/art/camera_test_collision.p3d
new file mode 100644
index 0000000..827d415
--- /dev/null
+++ b/tools/statepropbuilder/art/camera_test_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/camera_test_spdata.p3d b/tools/statepropbuilder/art/camera_test_spdata.p3d
new file mode 100644
index 0000000..aaa8c80
--- /dev/null
+++ b/tools/statepropbuilder/art/camera_test_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_A.p3d b/tools/statepropbuilder/art/carney_A.p3d
new file mode 100644
index 0000000..1122f49
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_A.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_A_collisions.p3d b/tools/statepropbuilder/art/carney_A_collisions.p3d
new file mode 100644
index 0000000..813a25a
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_A_collisions.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_A_spdata.p3d b/tools/statepropbuilder/art/carney_A_spdata.p3d
new file mode 100644
index 0000000..6d1ec2f
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_A_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_1.p3d b/tools/statepropbuilder/art/carney_stall_1.p3d
new file mode 100644
index 0000000..ba8af88
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_1.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_1_collision.p3d b/tools/statepropbuilder/art/carney_stall_1_collision.p3d
new file mode 100644
index 0000000..8792c08
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_1_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_1_spdata.p3d b/tools/statepropbuilder/art/carney_stall_1_spdata.p3d
new file mode 100644
index 0000000..b4186f0
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_1_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_2.p3d b/tools/statepropbuilder/art/carney_stall_2.p3d
new file mode 100644
index 0000000..e57b0b2
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_2.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_2_collision.p3d b/tools/statepropbuilder/art/carney_stall_2_collision.p3d
new file mode 100644
index 0000000..3c73667
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_2_collision.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_2_spdata.p3d b/tools/statepropbuilder/art/carney_stall_2_spdata.p3d
new file mode 100644
index 0000000..6b7dfb4
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_2_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/carney_stall_2_spdata_spdata.p3d b/tools/statepropbuilder/art/carney_stall_2_spdata_spdata.p3d
new file mode 100644
index 0000000..136a89d
--- /dev/null
+++ b/tools/statepropbuilder/art/carney_stall_2_spdata_spdata.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/stateprop.p3d b/tools/statepropbuilder/art/stateprop.p3d
new file mode 100644
index 0000000..d81b1ee
--- /dev/null
+++ b/tools/statepropbuilder/art/stateprop.p3d
Binary files differ
diff --git a/tools/statepropbuilder/art/weapon.p3d b/tools/statepropbuilder/art/weapon.p3d
new file mode 100644
index 0000000..8c5c9ce
--- /dev/null
+++ b/tools/statepropbuilder/art/weapon.p3d
Binary files differ
diff --git a/tools/statepropbuilder/build/win32/stateprop.dsp b/tools/statepropbuilder/build/win32/stateprop.dsp
new file mode 100644
index 0000000..b6e2fe2
--- /dev/null
+++ b/tools/statepropbuilder/build/win32/stateprop.dsp
@@ -0,0 +1,108 @@
+# Microsoft Developer Studio Project File - Name="stateprop" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=stateprop - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "stateprop.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "stateprop.mak" CFG="stateprop - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "stateprop - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "stateprop - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "stateprop"
+# PROP Scc_LocalPath "..\..\.."
+CPP=snCl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "stateprop - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../../pure3d" /I "../../../radmath" /I "../../../radcore/inc" /I "../../../radcontent/inc" /I "../../../stateprop/inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "RAD_RELEASE" /D "RAD_PC" /D "RAD_WIN32" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=snLib.exe
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF "$(CFG)" == "stateprop - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GR /ZI /Od /I "../../../pure3d" /I "../../../radmath" /I "../../../radcore/inc" /I "../../../radcontent/inc" /I "../../../stateprop/inc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "RAD_DEBUG" /D "RAD_PC" /D "RAD_WIN32" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=snLib.exe
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF
+
+# Begin Target
+
+# Name "stateprop - Win32 Release"
+# Name "stateprop - Win32 Debug"
+# Begin Group "src"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\src\stateprop.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\inc\stateprop\stateprop.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\statepropdata.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\inc\stateprop\statepropdata.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\inc\stateprop\statepropdatatypes.hpp
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/statepropbuilder/inc/stateprop/stateprop.hpp b/tools/statepropbuilder/inc/stateprop/stateprop.hpp
new file mode 100644
index 0000000..4c0c766
--- /dev/null
+++ b/tools/statepropbuilder/inc/stateprop/stateprop.hpp
@@ -0,0 +1,86 @@
+#ifndef _STATEPROP_HPP_
+#define _STATEPROP_HPP_
+
+#include <radmath/radmath.hpp>
+
+#include <p3d/anim/compositedrawable.hpp>
+
+//=============================================================================
+// Forward Class/Struct Declarations
+//=============================================================================
+
+class tFrameController;
+class tAnimatedObject;
+class CStatePropData;
+class CStateProp;
+
+
+//=============================================================================
+// Class Declarations
+// PropListener
+//=============================================================================
+
+class CStatePropListener
+{
+public:
+ virtual void RecieveEvent( int callback , CStateProp* stateProp ) = 0;
+};
+
+//=============================================================================
+// Definitions
+//=============================================================================
+#define MAX_LISTENERS 10
+
+const int STATEPROP_CHANGE_STATE_EVENT = -1;
+
+//=============================================================================
+// Class Declarations
+// CStateProp
+//=============================================================================
+class CStateProp : public tEntity
+{
+public:
+
+ //Static function to create a new CStateProp instance
+ static CStateProp* CreateStateProp( CStatePropData* statePropData , unsigned int state = 0 );
+
+ CStateProp( tAnimatedObject* animatedObject , CStatePropData* statePropData , unsigned int state = 0 );
+ ~CStateProp();
+
+ //Per frame update
+ void Update( float dt );
+
+ //call before render
+ void UpdateFrameControllersForRender();
+
+ unsigned int GetState();
+ void SetState( unsigned int state );
+ void NextState();
+ void PrevState();
+
+ void OnEvent( unsigned int eventID );
+
+ void AddStatePropListener( CStatePropListener* statePropListener );
+ void RemoveStatePropListener( CStatePropListener* statePropListener );
+
+ tDrawable* GetDrawable();
+
+private:
+
+ //accessor helpers
+ unsigned int GetNumberOfFrameControllers();
+ tFrameController* GetFrameControllerByIndex( unsigned int i );
+ unsigned int GetNumberOfDrawableElements();
+ tCompositeDrawable::DrawableElement* GetDrawableElement( unsigned int i );
+
+ //Private members
+ CStatePropData* m_StatePropData;
+ tAnimatedObject* m_AnimatedObject;
+ tFrameController* m_BaseFrameController;
+ unsigned int m_CurrentState;
+
+ unsigned int m_NumStatePropListeners;
+ CStatePropListener* m_StatePropListener[MAX_LISTENERS];
+};
+
+#endif //_STATEPROP_HPP_ \ No newline at end of file
diff --git a/tools/statepropbuilder/inc/stateprop/statepropdata.hpp b/tools/statepropbuilder/inc/stateprop/statepropdata.hpp
new file mode 100644
index 0000000..b454f34
--- /dev/null
+++ b/tools/statepropbuilder/inc/stateprop/statepropdata.hpp
@@ -0,0 +1,99 @@
+#ifndef _STATEPROPDATA_HPP_
+#define _STATEPROPDATA_HPP_
+
+
+#include <radmath/radmath.hpp>
+#include <p3d/loadmanager.hpp>
+
+#include "stateprop/statepropdatatypes.hpp"
+
+//=============================================================================
+// Forward Class/Struct Declarations
+//=============================================================================
+
+class CStateProp;
+class tAnimatedObjectFactory;
+class CStatePropDataLoader;
+
+//=============================================================================
+// Definitions
+//=============================================================================
+
+//State data
+struct StateData
+{
+ TransitionData transitionData;
+ VisibilityData* visibilityData;
+ FrameControllerData* frameControllerData;
+ EventData* eventData;
+ CallbackData* callbackData;
+
+ unsigned int numEvents;
+ unsigned int numCallbacks;
+};
+
+//=============================================================================
+// Class Declarations
+// Prop
+//=============================================================================
+
+class CStatePropData : public tEntity
+{
+
+public:
+
+ friend class CStatePropDataLoader;
+
+ CStatePropData();
+ ~CStatePropData();
+
+ // State Data =====================================================================================
+ unsigned int GetNumberOfStates();
+ StateData GetStateData( unsigned int state );
+
+ //Transition Data ==================================================================================
+ TransitionData GetTransitionData( int state );
+
+ //Visibility Data ==================================================================================
+ VisibilityData GetVisibilityData( int state , int index);
+
+ //Frame Controller Data =============================================================================
+ FrameControllerData GetFrameControllerData( int state, int fc );
+
+ //Event Data ========================================================================================
+ unsigned int GetNumberOfEvents( int state );
+ EventData GetEventData( int state , int eventindex );
+
+ //Callback Data ======================================================================================
+ unsigned int GetNumberOfCallbacks( int state );
+ CallbackData GetCallbackData( int state , int eventindex );
+
+ tAnimatedObjectFactory* GetAnimatedObjectFactory() { return m_ObjectFactory; }
+
+private:
+
+ //animated object factory
+ char m_FactoryName[64];
+ tAnimatedObjectFactory* m_ObjectFactory;
+
+ //total number of states
+ unsigned int m_NumStates;
+ StateData** m_StateData;
+};
+
+
+//=============================================================================
+// Class Declarations
+// PropLoader
+//=============================================================================
+class CStatePropDataLoader : public tSimpleChunkHandler
+{
+public:
+ CStatePropDataLoader();
+ tEntity* LoadObject(tChunkFile* file, tEntityStore* store);
+
+protected:
+ ~CStatePropDataLoader() {};
+};
+
+#endif //_STATEPROPDATA_HPP_
diff --git a/tools/statepropbuilder/inc/stateprop/statepropdatatypes.hpp b/tools/statepropbuilder/inc/stateprop/statepropdatatypes.hpp
new file mode 100644
index 0000000..4d035af
--- /dev/null
+++ b/tools/statepropbuilder/inc/stateprop/statepropdatatypes.hpp
@@ -0,0 +1,45 @@
+#ifndef _STATEPROPDATATYPES_HPP_
+#define _STATEPROPDATATYPES_HPP_
+
+//Transition data
+struct TransitionData
+{
+ unsigned int autoTransition;
+ unsigned int toState;
+ float onFrame;
+};
+
+//Visibility data
+struct VisibilityData
+{
+ unsigned int isVisible;
+};
+
+//Frame controller data
+struct FrameControllerData
+{
+ unsigned int isCyclic;
+ unsigned int numberOfCycles;
+ unsigned int holdFrame;
+ float minFrame;
+ float maxFrame;
+ float relativeSpeed;
+};
+
+//Event data
+struct EventData
+{
+ char eventName[64];
+ unsigned int eventID;
+ unsigned int toState;
+};
+
+//Callback data
+struct CallbackData
+{
+ char callbackName[64];
+ unsigned int callbackID;
+ float onFrame;
+};
+
+#endif //_STATEPROPDATATYPES_HPP_
diff --git a/tools/statepropbuilder/lib/dummy.txt b/tools/statepropbuilder/lib/dummy.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/statepropbuilder/lib/dummy.txt
diff --git a/tools/statepropbuilder/lib/stateproppd.a b/tools/statepropbuilder/lib/stateproppd.a
new file mode 100644
index 0000000..e95eb24
--- /dev/null
+++ b/tools/statepropbuilder/lib/stateproppd.a
Binary files differ
diff --git a/tools/statepropbuilder/lib/stateproppt.a b/tools/statepropbuilder/lib/stateproppt.a
new file mode 100644
index 0000000..a4e67f5
--- /dev/null
+++ b/tools/statepropbuilder/lib/stateproppt.a
Binary files differ
diff --git a/tools/statepropbuilder/src/stateprop.cpp b/tools/statepropbuilder/src/stateprop.cpp
new file mode 100644
index 0000000..fed8204
--- /dev/null
+++ b/tools/statepropbuilder/src/stateprop.cpp
@@ -0,0 +1,299 @@
+#include <p3d/utility.hpp>
+#include <p3d/anim/multicontroller.hpp>
+#include <p3d/anim/compositedrawable.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <p3d/anim/animate.hpp>
+
+#include "stateprop/stateprop.hpp"
+#include "stateprop/statepropdata.hpp"
+
+CStateProp* CStateProp::CreateStateProp( CStatePropData* statePropData , unsigned int state )
+{
+ tAnimatedObjectFactory* objectFactory = statePropData->GetAnimatedObjectFactory();
+
+ P3DASSERT( objectFactory );
+
+ if ( objectFactory )
+ {
+ tAnimatedObject* animatedObject = objectFactory->CreateObject(NULL);
+ CStateProp* stateProp = new CStateProp( animatedObject , statePropData , state );
+ stateProp->SetName( statePropData->GetName() );
+ return stateProp;
+ }
+
+ return NULL;
+}
+
+CStateProp::CStateProp( tAnimatedObject* animatedObject , CStatePropData* statePropData , unsigned int state ) :
+ m_StatePropData( NULL ),
+ m_AnimatedObject( NULL ),
+ m_BaseFrameController( NULL ),
+ m_CurrentState( state ),
+ m_NumStatePropListeners( 0 )
+{
+ //set state data
+ P3DASSERT( statePropData );
+ m_StatePropData = statePropData;
+ m_StatePropData->AddRef();
+
+ //set animated object
+ P3DASSERT( animatedObject );
+ m_AnimatedObject = animatedObject;
+ m_AnimatedObject->AddRef();
+
+ //base frame controller is run in milliseconds (ie the 1 is the timer)
+ m_BaseFrameController = new tMultiController(0 , 1000.f);
+ m_BaseFrameController->AddRef();
+ m_BaseFrameController->Reset();
+
+ //initialize the state
+ SetState( state );
+}
+
+CStateProp::~CStateProp()
+{
+ if ( m_BaseFrameController )
+ m_BaseFrameController->Release();
+ if ( m_StatePropData )
+ m_StatePropData->Release();
+ if ( m_AnimatedObject )
+ m_AnimatedObject->Release();
+}
+
+void CStateProp::Update( float dt )
+{
+ unsigned int i;
+
+ float lastFrame = m_BaseFrameController->GetFrame();
+ m_BaseFrameController->Advance( dt );
+ float newFrame = m_BaseFrameController->GetFrame();
+
+ //Check out transition
+ TransitionData tansdata = m_StatePropData->GetTransitionData( m_CurrentState );
+ if ( tansdata.autoTransition )
+ {
+ if (tansdata.onFrame >= lastFrame && tansdata.onFrame < newFrame)
+ {
+ SetState( tansdata.toState );
+ }
+ }
+
+ //Check callback events
+ if ( m_NumStatePropListeners > 0 )
+ {
+ for ( i = 0; i < m_StatePropData->GetNumberOfCallbacks( m_CurrentState ); i++ )
+ {
+ CallbackData callbackData = m_StatePropData->GetCallbackData( m_CurrentState , i );
+ if ( callbackData.onFrame >= lastFrame && callbackData.onFrame < newFrame)
+ {
+ unsigned int i;
+ for ( i = 0; i < m_NumStatePropListeners; i++ )
+ {
+ m_StatePropListener[i]->RecieveEvent( callbackData.callbackID , this );
+ }
+ }
+ }
+ }
+
+ //update frame controllers
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( i = 0; i < numFrameControllers; i++ )
+ {
+ FrameControllerData fcData = m_StatePropData->GetFrameControllerData( m_CurrentState , i );
+
+ //if we need to update
+ if ( fcData.minFrame != fcData.maxFrame )
+ {
+ tFrameController* fc = GetFrameControllerByIndex( i );
+
+ //if the min frame is greater than the max frame then reverse the update
+ if ( fcData.minFrame > fcData.maxFrame )
+ {
+ fc->Advance( -dt , false );
+ }
+ else
+ {
+ fc->Advance( dt , false );
+ }
+
+ if ( fcData.isCyclic && fcData.numberOfCycles > 0 )
+ {
+ unsigned int currentNumberOfCycles = fc->LastFrameReached();
+ if ( currentNumberOfCycles >= fcData.numberOfCycles )
+ {
+ fc->SetCycleMode( FORCE_NON_CYCLIC );
+ fc->SetFrame( fcData.maxFrame );
+ }
+ }
+ }
+ }
+}
+
+void CStateProp::UpdateFrameControllersForRender()
+{
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( unsigned int i = 0; i < numFrameControllers; i++ )
+ {
+ GetFrameControllerByIndex( i )->Advance( 0.f , true );
+ }
+}
+
+unsigned int CStateProp::GetState()
+{
+ return m_CurrentState;
+}
+
+void CStateProp::NextState()
+{
+ if ( m_CurrentState + 1 >= m_StatePropData->GetNumberOfStates() )
+ {
+ SetState( 0 );
+ }
+ else
+ {
+ SetState( m_CurrentState + 1 );
+ }
+}
+
+void CStateProp::PrevState()
+{
+ if ( m_CurrentState - 1 < 0 )
+ {
+ SetState( m_StatePropData->GetNumberOfStates() - 1 );
+ }
+ else
+ {
+ SetState( m_CurrentState - 1 );
+ }
+}
+
+void CStateProp::SetState( unsigned int state )
+{
+ if ( state < m_StatePropData->GetNumberOfStates() && state >= 0 )
+ {
+ m_CurrentState = state;
+ }
+
+ m_BaseFrameController->SetFrame(0.f);
+
+ unsigned int i;
+
+ //reset the FC for new state
+ unsigned int numFrameControllers = GetNumberOfFrameControllers();
+ for ( i = 0; i < numFrameControllers; i++ )
+ {
+ FrameControllerData frameControllerData = m_StatePropData->GetFrameControllerData( m_CurrentState , i );
+ tFrameController* fc = GetFrameControllerByIndex(i);
+
+ //if we are holding a frame over from last state dont reset
+ if ( !frameControllerData.holdFrame )
+ {
+ //Reset() MUST come first or it will trounce frame ranges etc...
+ fc->Reset();
+ }
+ fc->SetRelativeSpeed( frameControllerData.relativeSpeed );
+ fc->SetCycleMode( (frameControllerData.isCyclic == 1) ? FORCE_CYCLIC : FORCE_NON_CYCLIC );
+ if ( frameControllerData.minFrame > frameControllerData.maxFrame )
+ {
+ fc->SetFrameRange( frameControllerData.maxFrame , frameControllerData.minFrame );
+ }
+ else
+ {
+ fc->SetFrameRange( frameControllerData.minFrame , frameControllerData.maxFrame );
+ }
+
+ if ( !frameControllerData.holdFrame )
+ {
+ fc->SetFrame( frameControllerData.minFrame );
+ }
+ }
+
+ //Set visibility for new state
+ unsigned int numElements = m_AnimatedObject->GetBaseObject()->GetNumDrawableElement();
+ for ( i = 0; i < numElements; i++ )
+ {
+ tCompositeDrawable::DrawableElement* de = GetDrawableElement(i);
+
+ de->SetLockVisibility(false);
+ VisibilityData visibilityData = m_StatePropData->GetVisibilityData( m_CurrentState , i );
+ bool visible = visibilityData.isVisible == 1;
+ de->SetVisibility( visible );
+
+ //lock visibility if visiblility if false
+ de->SetLockVisibility(!visible);
+ }
+
+ //notify listeners of a state change
+ for ( i = 0; i < m_NumStatePropListeners; i++ )
+ {
+ m_StatePropListener[i]->RecieveEvent( STATEPROP_CHANGE_STATE_EVENT , this );
+ }
+}
+
+void CStateProp::OnEvent( unsigned int eventID )
+{
+ unsigned int i;
+ unsigned int numEvents = m_StatePropData->GetNumberOfEvents( m_CurrentState );
+ for ( i = 0; i < numEvents; i++ )
+ {
+ EventData eventData = m_StatePropData->GetEventData( m_CurrentState , i );
+ if ( eventData.eventID == eventID )
+ {
+ SetState( eventData.toState );
+ }
+ }
+}
+
+
+void CStateProp::AddStatePropListener( CStatePropListener* statePropListener )
+{
+ if ( m_NumStatePropListeners < MAX_LISTENERS )
+ {
+ m_StatePropListener[m_NumStatePropListeners] = statePropListener;
+ m_NumStatePropListeners++;
+ }
+}
+void CStateProp::RemoveStatePropListener( CStatePropListener* statePropListener )
+{
+ unsigned int i = 0;
+ //find this entry
+ for ( i = 0; i < m_NumStatePropListeners; i++ )
+ {
+ if ( m_StatePropListener[i] == statePropListener )
+ {
+ m_NumStatePropListeners--;
+ break;
+ }
+ }
+
+ //copy other entries back over
+ for ( i; i < m_NumStatePropListeners; i++ )
+ {
+ m_StatePropListener[i] = m_StatePropListener[i+1];
+ }
+}
+
+tDrawable* CStateProp::GetDrawable()
+{
+ return m_AnimatedObject->GetBaseObject();
+}
+
+unsigned int CStateProp::GetNumberOfFrameControllers()
+{
+ return m_AnimatedObject->GetCurrentAnimation()->GetNumFrameControllers();
+}
+
+tFrameController* CStateProp::GetFrameControllerByIndex( unsigned int i )
+{
+ return m_AnimatedObject->GetCurrentAnimation()->GetFrameControllerByIndex(i);
+}
+
+unsigned int CStateProp::GetNumberOfDrawableElements()
+{
+ return m_AnimatedObject->GetBaseObject()->GetNumDrawableElement();
+}
+
+tCompositeDrawable::DrawableElement* CStateProp::GetDrawableElement( unsigned int i )
+{
+ return m_AnimatedObject->GetBaseObject()->GetDrawableElement( i );
+}
diff --git a/tools/statepropbuilder/src/statepropdata.cpp b/tools/statepropbuilder/src/statepropdata.cpp
new file mode 100644
index 0000000..d5f93e9
--- /dev/null
+++ b/tools/statepropbuilder/src/statepropdata.cpp
@@ -0,0 +1,249 @@
+#include <string.h>
+#include <p3d/utility.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <constants/chunkids.hpp>
+#include <p3d/chunkfile.hpp>
+
+#include "stateprop/statepropdata.hpp"
+
+//=============================================================================
+// Class Declarations
+// Prop
+//=============================================================================
+CStatePropData::CStatePropData( ) :
+ m_ObjectFactory( NULL ),
+ m_NumStates(0),
+ m_StateData(NULL)
+{
+}
+
+CStatePropData::~CStatePropData()
+{
+ if (m_ObjectFactory)
+ {
+ m_ObjectFactory->Release();
+ }
+
+ unsigned int i = 0;
+ for( i; i < m_NumStates; i++ )
+ {
+ delete m_StateData[i];
+ }
+ delete m_StateData;
+}
+
+//=============================================================================
+//State Data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfStates()
+{
+ return m_NumStates;
+}
+StateData CStatePropData::GetStateData( unsigned int state )
+{
+ return ( * (m_StateData[ state ]) ) ;
+}
+
+//=============================================================================
+//Transition Data
+//=============================================================================
+
+//Get
+TransitionData CStatePropData::GetTransitionData( int state )
+{
+ return m_StateData[state]->transitionData;
+}
+
+//=============================================================================
+//Visibility Data
+//=============================================================================
+
+//Get
+VisibilityData CStatePropData::GetVisibilityData( int state , int index)
+{
+ return ( m_StateData[state]->visibilityData[index] );
+}
+
+//=============================================================================
+//Frame controller data
+//=============================================================================
+
+//Get
+FrameControllerData CStatePropData::GetFrameControllerData( int state, int fc )
+{
+ return m_StateData[state]->frameControllerData[fc];
+}
+
+//=============================================================================
+//Event data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfEvents( int state )
+{
+ return m_StateData[state]->numEvents;
+}
+EventData CStatePropData::GetEventData( int state , int eventindex )
+{
+ return m_StateData[state]->eventData[eventindex];
+}
+
+//=============================================================================
+//Callback Data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfCallbacks( int state )
+{
+ return m_StateData[state]->numCallbacks;
+}
+CallbackData CStatePropData::GetCallbackData( int state , int eventindex )
+{
+ return m_StateData[state]->callbackData[eventindex];
+}
+
+//=============================================================================
+// Class Declarations
+// PropLoader
+//=============================================================================
+CStatePropDataLoader::CStatePropDataLoader() :
+ tSimpleChunkHandler(StateProp::STATEPROP)
+{
+}
+
+//-------------------------------------------------------------------------
+tEntity* CStatePropDataLoader::LoadObject(tChunkFile* f, tEntityStore* store)
+{
+
+ CStatePropData* statePropData = new CStatePropData();
+
+ unsigned int version = f->GetLong();
+
+ //get the name
+ char buf[256];
+ f->GetPString(buf);
+ statePropData->SetName(buf);
+
+
+ //get the object factory
+ f->GetPString(buf);
+ statePropData->m_ObjectFactory = p3d::find<tAnimatedObjectFactory>(store, buf);
+ if ( statePropData->m_ObjectFactory )
+ {
+ statePropData->m_ObjectFactory->AddRef();
+ }
+
+ //get the num states
+ statePropData->m_NumStates = f->GetLong();
+
+ statePropData->m_StateData = new StateData*[statePropData->m_NumStates];
+ memset(statePropData->m_StateData,0,statePropData->m_NumStates*sizeof(StateData*));
+
+ unsigned int currState;
+ unsigned int i;
+ for ( currState = 0; currState < statePropData->m_NumStates; currState++ )
+ {
+ f->BeginChunk();
+
+ //get name
+ f->GetPString(buf);
+
+ bool autoTransition = ( f->GetLong() != 0 );
+ unsigned int toState = f->GetLong();
+ unsigned int numDrawables = f->GetLong();
+ unsigned int numFrameControllers = f->GetLong();
+ unsigned int numEvents = f->GetLong();
+ unsigned int numCallbacks = f->GetLong();
+ float onFrame = f->GetFloat();
+
+ //give me memory dammit
+ int memsize = ( sizeof(StateData) ) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) +
+ ( sizeof(EventData) * numEvents ) +
+ ( sizeof(CallbackData) * numCallbacks );
+
+ unsigned char* memptr = new unsigned char[ memsize ];
+
+ memset( memptr,0, memsize );
+
+ statePropData->m_StateData[currState] = (StateData*)memptr;
+
+ statePropData->m_StateData[currState]->numEvents = numEvents;
+ statePropData->m_StateData[currState]->numCallbacks = numCallbacks;
+
+ //Transition data
+ statePropData->m_StateData[currState]->transitionData.autoTransition = autoTransition;
+ statePropData->m_StateData[currState]->transitionData.onFrame = onFrame;
+ statePropData->m_StateData[currState]->transitionData.toState = toState;
+
+ //Visibility data
+ statePropData->m_StateData[currState]->visibilityData = (VisibilityData*) ( memptr + sizeof(StateData) );
+ for ( i=0; i < numDrawables; i++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ VisibilityData *p = &(statePropData->m_StateData[currState]->visibilityData[i]);
+ p->isVisible = (f->GetLong() != 0);
+ f->EndChunk();
+ }
+
+ //FrameController data
+ statePropData->m_StateData[currState]->frameControllerData = (FrameControllerData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) );
+
+ for ( i=0; i < numFrameControllers; i++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ FrameControllerData* p = &(statePropData->m_StateData[currState]->frameControllerData[i]);
+ p->isCyclic = ( f->GetLong() != 0 );
+ p->numberOfCycles = f->GetLong();
+ p->holdFrame = ( f->GetLong() != 0 );
+ p->minFrame = f->GetFloat();
+ p->maxFrame = f->GetFloat();
+ p->relativeSpeed = f->GetFloat();
+ f->EndChunk();
+ }
+
+ //Event data
+ statePropData->m_StateData[currState]->eventData = (EventData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) );
+
+ for ( i=0; i < numEvents; i++ )
+ {
+ f->BeginChunk();
+ EventData* p = &(statePropData->m_StateData[currState]->eventData[i]);
+ memcpy( p->eventName , f->GetPString(buf) , 64 );
+ p->toState = f->GetLong();
+ p->eventID = f->GetLong();
+ f->EndChunk();
+ }
+
+ //Callback data
+ statePropData->m_StateData[currState]->callbackData = (CallbackData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) +
+ ( sizeof(EventData) * numEvents ) );
+
+ for ( i=0; i < numCallbacks; i++ )
+ {
+ f->BeginChunk();
+ CallbackData* p = &(statePropData->m_StateData[currState]->callbackData[i]);
+ memcpy( p->callbackName , f->GetPString(buf) , 64 );
+ p->callbackID = f->GetLong();
+ p->onFrame = f->GetFloat();
+ f->EndChunk();
+ }
+
+ f->EndChunk();
+ }
+
+ return statePropData;
+}
diff --git a/tools/tools.dsw b/tools/tools.dsw
new file mode 100644
index 0000000..3a5e1a3
--- /dev/null
+++ b/tools/tools.dsw
@@ -0,0 +1,1245 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "AnimCollDSGMaker"=..\game\libs\pure3d\tools\commandline\AnimCollDSGMaker\AnimCollDSGMaker.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ AnimCollDSGMaker
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\animcolldsgmaker
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "AnimDSGMaker"=..\game\libs\pure3d\tools\commandline\AnimDSGMaker\AnimDSGMaker.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ AnimDSGMaker
+ ..\game\libs\pure3d\tools\commandline\animdsgmaker
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "Image2LUT"=.\CreateSetChunk\SetChunk.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ .\createsetchunk
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "InstAnimDynaPhysMaker"=..\game\libs\pure3d\tools\commandline\InstAnimDynaPhysMaker\InstAnimDynaPhysMaker.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ InstAnimDynaPhysMaker
+ ..\game\libs\pure3d\tools\commandline\instanimdynaphysmaker
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "Instancer"=..\game\libs\pure3d\tools\commandline\Instancer\Instancer.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Instancer
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\instancer
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "LensFlareDSGMaker"=..\game\libs\pure3d\tools\commandline\LensFlareDSGMaker\LensFlareDSGMaker.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ LensFlareDSGMaker
+ ..\game\libs\pure3d\tools\commandline\lensflaredsgmaker
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "MayaRules"=.\MayaRules\MayaRules.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ MayaRules
+ ..\..\joel\projects\simpsons2\tools
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "Pure3D"=..\game\libs\pure3d\build\win32\Pure3D.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Pure3D
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "breakablesmaker"=..\game\libs\pure3d\tools\commandline\breakablesmaker\breakablesmaker.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ breakablesmaker
+ ..\game\libs\pure3d\tools\commandline\breakablesmaker
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "chunkGroup"=..\game\libs\pure3d\tools\commandline\chunkGroup\chunkGroup.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ chunkGroup
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\chunkgroup
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "convert2dxtn"=..\game\libs\pure3d\tools\commandline\convert2dxtn\convert2dxtn.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\tools\commandline\convert2dxtn
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "findbreakables"=..\game\libs\pure3d\tools\commandline\findbreakables\findbreakables.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ findbreakables
+ ..\game\libs\pure3d\tools\commandline\findbreakables
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"=..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ "$/DEV/freetype", KAOAAAAA
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\lib\freetype\builds\win32\visualc
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libpng"=..\game\libs\pure3d\build\win32\libpng.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ libpng
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "makechunktool"=..\game\libs\pure3d\tools\commandline\makechunktool\makechunktool.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ makechunktool
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\makechunktool
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "objectsnapper"=.\objectsnapper\build\objectsnapper.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ objectsnapper
+ ..\..\joel\projects\simpsons2\tools\objectsnapper\build
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3d2dsg"=..\game\libs\pure3d\tools\commandline\p3d2dsg\p3d2dsg.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3d2dsg
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3d2dsg
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dcompress"=..\game\libs\pure3d\tools\commandline\p3dcompress\p3dcompress.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\tools\commandline\p3dcompress
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcontent
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3ddiff"="..\game\libs\pure3d\tools\gui-win32\p3ddiff\p3ddiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3ddiff
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\gui-win32\p3ddiff
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dexplorer"="..\game\libs\pure3d\tools\gui-win32\p3dexplorer\p3dexplorer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dexplorer
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\gui-win32\p3dexplorer
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dgc"=..\game\libs\pure3d\tools\commandline\p3dgc\p3dgc.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\tools\commandline\p3dgc
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name Pure3D
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcore
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dgendsg"=..\game\libs\pure3d\tools\commandline\p3dgendsg\p3dgendsg.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dgendsg
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3dgendsg
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dgeo2prims"=..\game\libs\pure3d\tools\commandline\p3dgeo2prims\p3dgeo2prims.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dgeo2prims
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3dgeo2prims
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dimage"=..\game\libs\pure3d\tools\commandline\p3dimage\p3dimage.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\tools\commandline\p3dimage
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3djoin"=..\game\libs\pure3d\tools\commandline\p3djoin\p3djoin.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\tools\commandline\p3djoin
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcontent
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dmutate"=..\game\libs\pure3d\tools\commandline\p3dmutate\p3dmutate.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dmutate
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3dmutate
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dsort"=..\game\libs\pure3d\tools\commandline\p3dsort\p3dsort.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dsort
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3dsort
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dsplit"=..\game\libs\pure3d\tools\commandline\p3dsplit\p3dsplit.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ p3dsplit
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\p3dsplit
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "p3dview"=..\game\libs\pure3d\apps\p3dview\build\win32\p3dview.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\apps\p3dview\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name radcore
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Pure3D
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name pddidx8
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name pddigl
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcontent
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "pddidx8"=..\game\libs\pure3d\build\win32\pddidx8.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game\libs\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "pddigl"=..\game\libs\pure3d\build\win32\pddigl.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ Perforce Project
+ ..\game
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "propwrapper"=..\game\libs\pure3d\tools\commandline\propwrapper\propwrapper.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ propwrapper
+ ..\game\libs\pure3d\tools\commandline\propwrapper
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "radcontent"=..\game\libs\radcontent\build\win32\radcontent.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ radcontent
+ ..\game\libs\radcontent
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "radcore"=..\game\libs\radcore\build\win32\radcore.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ radcore
+ ..\..\joel\projects\simpsons2\game\libs\radcore
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "radmath"=..\game\libs\radmath\build\win32\radmath.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ nbrooke-dual
+ ..\..\joel\projects\simpsons2\game\libs\radmath\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "relatedfiles"=.\relatedfiles\relatedfiles.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ relatedfiles
+ ..\..\joel\projects\simpsons2\tools\relatedfiles
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "roadOptimizer"=..\game\libs\pure3d\tools\commandline\roadOptimizer\roadOptimizer.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ roadOptimizer
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\tools\commandline\roadoptimizer
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "toollib"=..\game\libs\pure3d\toollib\toollib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ toollib
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\toollib
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "toollib_extras"=..\game\libs\pure3d\toollib\toollib_extras.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ toollib_extras
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\toollib
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "trackeditor"=.\trackeditor\build\trackeditor.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ trackeditor
+ ..\..\joel\projects\simpsons2\tools\trackeditor\build
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "worldbuilder"=.\worldbuilder\build\worldbuilder.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ worldbuilder
+ ..\..\joel\projects\simpsons2\tools\worldbuilder\build
+ end source code control
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name freetype
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libpng
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radmath
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name toollib_extras
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Pure3D
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcore
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name radcontent
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "zlib"=..\game\libs\pure3d\build\win32\zlib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+ begin source code control
+ zlib
+ ..\..\joel\projects\simpsons2\game\libs\pure3d\build\win32
+ end source code control
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+ begin source code control
+ tools
+ .
+ end source code control
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/tools.sdf b/tools/tools.sdf
new file mode 100644
index 0000000..32c41b6
--- /dev/null
+++ b/tools/tools.sdf
Binary files differ
diff --git a/tools/tools.sln b/tools/tools.sln
new file mode 100644
index 0000000..047cefd
--- /dev/null
+++ b/tools/tools.sln
@@ -0,0 +1,414 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.21005.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimCollDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimCollDSGMaker\AnimCollDSGMaker.vcxproj", "{2DBC8F99-0223-499F-9AC1-4702EA5DD47B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnimDSGMaker", "..\game\libs\pure3d\tools\commandline\AnimDSGMaker\AnimDSGMaker.vcxproj", "{FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InstAnimDynaPhysMaker", "..\game\libs\pure3d\tools\commandline\InstAnimDynaPhysMaker\InstAnimDynaPhysMaker.vcxproj", "{C8C67032-1BBC-4050-AEAE-2D43AE950C76}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Instancer", "..\game\libs\pure3d\tools\commandline\Instancer\Instancer.vcxproj", "{3C294239-15AF-49E2-A5E8-E5CD2785FC3D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LensFlareDSGMaker", "..\game\libs\pure3d\tools\commandline\LensFlareDSGMaker\LensFlareDSGMaker.vcxproj", "{B93AEF58-B533-4820-A0D0-1F8E91301129}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MayaRules", "MayaRules\MayaRules.vcxproj", "{F456A1E8-974F-4D56-BB57-3D944DF8DCB1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Pure3D", "..\game\libs\pure3d\build\win32\Pure3D.vcxproj", "{67904E19-DE3B-4707-8F96-13AA64DBF58A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "breakablesmaker", "..\game\libs\pure3d\tools\commandline\breakablesmaker\breakablesmaker.vcxproj", "{345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "chunkGroup", "..\game\libs\pure3d\tools\commandline\chunkGroup\chunkGroup.vcxproj", "{E47D996B-68D6-47DE-B640-44B3C0363E6E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convert2dxtn", "..\game\libs\pure3d\tools\commandline\convert2dxtn\convert2dxtn.vcxproj", "{F7404001-6D28-4698-9BF8-5B26426765EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.vcxproj", "{6D333C70-A27D-4E25-AD26-BB9E20558B8F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "..\game\libs\pure3d\build\win32\libpng.vcxproj", "{492CA803-8196-4C47-A3BD-84B7C2D9514D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makechunktool", "..\game\libs\pure3d\tools\commandline\makechunktool\makechunktool.vcxproj", "{01A371FA-BA4E-4DC9-B339-4E9552545991}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objectsnapper", "objectsnapper\build\objectsnapper.vcxproj", "{278283D0-FEC2-4B06-8AED-8DDB745215B4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3d2dsg", "..\game\libs\pure3d\tools\commandline\p3d2dsg\p3d2dsg.vcxproj", "{B1DD8C69-F562-4275-BE4E-7A6EF727ED30}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddel", "..\game\libs\pure3d\tools\commandline\p3ddel\p3ddel.vcxproj", "{A7DFC4D3-FD76-4375-AD16-009BC39A697D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3ddiff", "..\game\libs\pure3d\tools\gui-win32\p3ddiff\p3ddiff.vcxproj", "{84451C74-4E26-4557-9FB8-8C26243DAC55}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dexplorer", "..\game\libs\pure3d\tools\gui-win32\p3dexplorer\p3dexplorer.vcxproj", "{72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgc", "..\game\libs\pure3d\tools\commandline\p3dgc\p3dgc.vcxproj", "{44AB737E-AA4F-47AA-943B-D2ABA9CB424B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgendsg", "..\game\libs\pure3d\tools\commandline\p3dgendsg\p3dgendsg.vcxproj", "{ACF60C5C-93C6-447B-92A2-477AECB0E19C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dgeo2prims", "..\game\libs\pure3d\tools\commandline\p3dgeo2prims\p3dgeo2prims.vcxproj", "{635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dimage", "..\game\libs\pure3d\tools\commandline\p3dimage\p3dimage.vcxproj", "{AFE81408-CC31-4EAF-9597-4931F6C08CED}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dmutate", "..\game\libs\pure3d\tools\commandline\p3dmutate\p3dmutate.vcxproj", "{A3C2F702-CE80-48D6-9217-E73E93F19F88}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsort", "..\game\libs\pure3d\tools\commandline\p3dsort\p3dsort.vcxproj", "{DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dsplit", "..\game\libs\pure3d\tools\commandline\p3dsplit\p3dsplit.vcxproj", "{4C924B45-1710-4A4D-9D40-CC232B14CD44}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcontent", "..\game\libs\radcontent\build\win32\radcontent.vcxproj", "{B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radcore", "..\game\libs\radcore\build\win32\radcore.vcxproj", "{3772A735-0353-433A-A8A2-EB45C84F9139}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radmath", "..\game\libs\radmath\build\win32\radmath.vcxproj", "{906E914F-EB63-4B12-9F07-00A727472080}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relatedfiles", "relatedfiles\relatedfiles.vcxproj", "{EF05D776-F91E-422F-BD64-16B3F5557888}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "roadOptimizer", "..\game\libs\pure3d\tools\commandline\roadOptimizer\roadOptimizer.vcxproj", "{37223926-26AB-4BCE-BBEB-191699C3BEF1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib", "..\game\libs\pure3d\toollib\toollib.vcxproj", "{467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toollib_extras", "..\game\libs\pure3d\toollib\toollib_extras.vcxproj", "{CDB92E4A-1E5D-49A8-8153-34264B3FEF29}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trackeditor", "trackeditor\build\trackeditor.vcxproj", "{8D79E782-9747-4732-A869-CA630AC7D3C0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "worldbuilder", "worldbuilder\build\worldbuilder.vcxproj", "{B5900135-3859-403D-BC2F-FD90B4C2B2E5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\game\libs\pure3d\build\win32\zlib.vcxproj", "{A21A1BC1-C10B-4260-B494-A51A1E79A40E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "p3dcompdrawopt", "..\game\libs\pure3d\tools\commandline\p3dcompdrawopt\p3dcompdrawopt.vcxproj", "{967364EA-F3C7-455E-BBA4-F8B031FB780C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ Tools Debug|Win32 = Tools Debug|Win32
+ Tools Release|Win32 = Tools Release|Win32
+ Tune|Win32 = Tune|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Debug|Win32.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release|Win32.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Release|Win32.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tools Release|Win32.Build.0 = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune|Win32.ActiveCfg = Release|Win32
+ {2DBC8F99-0223-499F-9AC1-4702EA5DD47B}.Tune|Win32.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Debug|Win32.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release|Win32.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Release|Win32.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tools Release|Win32.Build.0 = Release|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune|Win32.ActiveCfg = Debug|Win32
+ {FEB4DF89-8F7E-4AE9-A508-AFE1BFC4F6D5}.Tune|Win32.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Debug|Win32.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release|Win32.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Release|Win32.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tools Release|Win32.Build.0 = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune|Win32.ActiveCfg = Release|Win32
+ {C8C67032-1BBC-4050-AEAE-2D43AE950C76}.Tune|Win32.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Debug|Win32.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release|Win32.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Release|Win32.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tools Release|Win32.Build.0 = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune|Win32.ActiveCfg = Release|Win32
+ {3C294239-15AF-49E2-A5E8-E5CD2785FC3D}.Tune|Win32.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Debug|Win32.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release|Win32.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Release|Win32.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tools Release|Win32.Build.0 = Release|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune|Win32.ActiveCfg = Debug|Win32
+ {B93AEF58-B533-4820-A0D0-1F8E91301129}.Tune|Win32.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Debug|Win32.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release|Win32.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Release|Win32.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tools Release|Win32.Build.0 = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune|Win32.ActiveCfg = Release|Win32
+ {F456A1E8-974F-4D56-BB57-3D944DF8DCB1}.Tune|Win32.Build.0 = Release|Win32
+ {67904E19-DE3B-4707-8F96-13AA64DBF58A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {67904E19-DE3B-4707-8F96-13AA64DBF58A}.Release|Win32.ActiveCfg = Release|Win32
+ {67904E19-DE3B-4707-8F96-13AA64DBF58A}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {67904E19-DE3B-4707-8F96-13AA64DBF58A}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {67904E19-DE3B-4707-8F96-13AA64DBF58A}.Tune|Win32.ActiveCfg = Tune|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Debug|Win32.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release|Win32.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Release|Win32.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tools Release|Win32.Build.0 = Release|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune|Win32.ActiveCfg = Debug|Win32
+ {345A8D57-E8D9-41DF-96DE-AAFDF810BAB8}.Tune|Win32.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Debug|Win32.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release|Win32.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Release|Win32.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tools Release|Win32.Build.0 = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune|Win32.ActiveCfg = Release|Win32
+ {E47D996B-68D6-47DE-B640-44B3C0363E6E}.Tune|Win32.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Debug|Win32.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release|Win32.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Release|Win32.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tools Release|Win32.Build.0 = Release|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune|Win32.ActiveCfg = Debug|Win32
+ {F7404001-6D28-4698-9BF8-5B26426765EA}.Tune|Win32.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Debug|Win32.Build.0 = Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release|Win32.ActiveCfg = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Release|Win32.Build.0 = Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Debug|Win32.Build.0 = Tools Debug|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tools Release|Win32.Build.0 = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune|Win32.ActiveCfg = Tools Release|Win32
+ {6D333C70-A27D-4E25-AD26-BB9E20558B8F}.Tune|Win32.Build.0 = Tools Release|Win32
+ {492CA803-8196-4C47-A3BD-84B7C2D9514D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {492CA803-8196-4C47-A3BD-84B7C2D9514D}.Release|Win32.ActiveCfg = Release|Win32
+ {492CA803-8196-4C47-A3BD-84B7C2D9514D}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {492CA803-8196-4C47-A3BD-84B7C2D9514D}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {492CA803-8196-4C47-A3BD-84B7C2D9514D}.Tune|Win32.ActiveCfg = Tune|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug|Win32.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Debug|Win32.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release|Win32.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Release|Win32.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tools Release|Win32.Build.0 = Release|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune|Win32.ActiveCfg = Debug|Win32
+ {01A371FA-BA4E-4DC9-B339-4E9552545991}.Tune|Win32.Build.0 = Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Debug|Win32.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release|Win32.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Release|Win32.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Debug|Win32.Build.0 = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tools Release|Win32.Build.0 = Tools Release|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune|Win32.ActiveCfg = Tools Debug|Win32
+ {278283D0-FEC2-4B06-8AED-8DDB745215B4}.Tune|Win32.Build.0 = Tools Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Debug|Win32.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release|Win32.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Release|Win32.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tools Release|Win32.Build.0 = Release|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune|Win32.ActiveCfg = Debug|Win32
+ {B1DD8C69-F562-4275-BE4E-7A6EF727ED30}.Tune|Win32.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Debug|Win32.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release|Win32.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Release|Win32.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tools Release|Win32.Build.0 = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune|Win32.ActiveCfg = Release|Win32
+ {A7DFC4D3-FD76-4375-AD16-009BC39A697D}.Tune|Win32.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug|Win32.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Debug|Win32.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release|Win32.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Release|Win32.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tools Release|Win32.Build.0 = Release|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune|Win32.ActiveCfg = Debug|Win32
+ {84451C74-4E26-4557-9FB8-8C26243DAC55}.Tune|Win32.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Debug|Win32.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release|Win32.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Release|Win32.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tools Release|Win32.Build.0 = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune|Win32.ActiveCfg = Release|Win32
+ {72FA5E78-A53E-42DF-9EB2-1A3D6DF475A2}.Tune|Win32.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Debug|Win32.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release|Win32.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Release|Win32.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tools Release|Win32.Build.0 = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune|Win32.ActiveCfg = Release|Win32
+ {44AB737E-AA4F-47AA-943B-D2ABA9CB424B}.Tune|Win32.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Debug|Win32.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release|Win32.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Release|Win32.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tools Release|Win32.Build.0 = Release|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune|Win32.ActiveCfg = Debug|Win32
+ {ACF60C5C-93C6-447B-92A2-477AECB0E19C}.Tune|Win32.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Debug|Win32.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release|Win32.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Release|Win32.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tools Release|Win32.Build.0 = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune|Win32.ActiveCfg = Release|Win32
+ {635AA5F3-F45F-49E9-A94D-1519CAAE1AC9}.Tune|Win32.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Debug|Win32.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release|Win32.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Release|Win32.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tools Release|Win32.Build.0 = Release|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune|Win32.ActiveCfg = Debug|Win32
+ {AFE81408-CC31-4EAF-9597-4931F6C08CED}.Tune|Win32.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Debug|Win32.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release|Win32.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Release|Win32.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tools Release|Win32.Build.0 = Release|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune|Win32.ActiveCfg = Debug|Win32
+ {A3C2F702-CE80-48D6-9217-E73E93F19F88}.Tune|Win32.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Debug|Win32.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release|Win32.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Release|Win32.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tools Release|Win32.Build.0 = Release|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune|Win32.ActiveCfg = Debug|Win32
+ {DA5FDB78-78F0-4404-B7F2-BB28206B8BDC}.Tune|Win32.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Debug|Win32.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release|Win32.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Release|Win32.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tools Release|Win32.Build.0 = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune|Win32.ActiveCfg = Release|Win32
+ {4C924B45-1710-4A4D-9D40-CC232B14CD44}.Tune|Win32.Build.0 = Release|Win32
+ {B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}.Release|Win32.ActiveCfg = Release|Win32
+ {B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {B5C1C3A8-11BC-4D82-A7EB-A85B22DB74EA}.Tune|Win32.ActiveCfg = Tune|Win32
+ {3772A735-0353-433A-A8A2-EB45C84F9139}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3772A735-0353-433A-A8A2-EB45C84F9139}.Release|Win32.ActiveCfg = Release|Win32
+ {3772A735-0353-433A-A8A2-EB45C84F9139}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {3772A735-0353-433A-A8A2-EB45C84F9139}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {3772A735-0353-433A-A8A2-EB45C84F9139}.Tune|Win32.ActiveCfg = Tune|Win32
+ {906E914F-EB63-4B12-9F07-00A727472080}.Debug|Win32.ActiveCfg = Debug|Win32
+ {906E914F-EB63-4B12-9F07-00A727472080}.Release|Win32.ActiveCfg = Release|Win32
+ {906E914F-EB63-4B12-9F07-00A727472080}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {906E914F-EB63-4B12-9F07-00A727472080}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {906E914F-EB63-4B12-9F07-00A727472080}.Tune|Win32.ActiveCfg = Tune|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Debug|Win32.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release|Win32.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Release|Win32.Build.0 = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune|Win32.ActiveCfg = Debug|Win32
+ {EF05D776-F91E-422F-BD64-16B3F5557888}.Tune|Win32.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Debug|Win32.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release|Win32.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Release|Win32.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tools Release|Win32.Build.0 = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune|Win32.ActiveCfg = Release|Win32
+ {37223926-26AB-4BCE-BBEB-191699C3BEF1}.Tune|Win32.Build.0 = Release|Win32
+ {467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}.Debug|Win32.ActiveCfg = Debug|Win32
+ {467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}.Release|Win32.ActiveCfg = Release|Win32
+ {467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {467CB4E6-6A88-48AF-9CF4-3C1B5AD13F29}.Tune|Win32.ActiveCfg = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Debug|Win32.Build.0 = Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release|Win32.ActiveCfg = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Release|Win32.Build.0 = Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Debug|Win32.Build.0 = Tools Debug|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tools Release|Win32.Build.0 = Tools Release|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune|Win32.ActiveCfg = Tune|Win32
+ {CDB92E4A-1E5D-49A8-8153-34264B3FEF29}.Tune|Win32.Build.0 = Tune|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Debug|Win32.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release|Win32.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Release|Win32.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Debug|Win32.Build.0 = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tools Release|Win32.Build.0 = Tools Release|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune|Win32.ActiveCfg = Tools Debug|Win32
+ {8D79E782-9747-4732-A869-CA630AC7D3C0}.Tune|Win32.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Debug|Win32.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release|Win32.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Release|Win32.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Debug|Win32.Build.0 = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tools Release|Win32.Build.0 = Tools Release|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune|Win32.ActiveCfg = Tools Debug|Win32
+ {B5900135-3859-403D-BC2F-FD90B4C2B2E5}.Tune|Win32.Build.0 = Tools Debug|Win32
+ {A21A1BC1-C10B-4260-B494-A51A1E79A40E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A21A1BC1-C10B-4260-B494-A51A1E79A40E}.Release|Win32.ActiveCfg = Release|Win32
+ {A21A1BC1-C10B-4260-B494-A51A1E79A40E}.Tools Debug|Win32.ActiveCfg = Tools Debug|Win32
+ {A21A1BC1-C10B-4260-B494-A51A1E79A40E}.Tools Release|Win32.ActiveCfg = Tools Release|Win32
+ {A21A1BC1-C10B-4260-B494-A51A1E79A40E}.Tune|Win32.ActiveCfg = Tune|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Debug|Win32.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release|Win32.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Release|Win32.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug|Win32.ActiveCfg = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Debug|Win32.Build.0 = Debug|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release|Win32.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tools Release|Win32.Build.0 = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune|Win32.ActiveCfg = Release|Win32
+ {967364EA-F3C7-455E-BBA4-F8B031FB780C}.Tune|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tools/tools.v12.suo b/tools/tools.v12.suo
new file mode 100644
index 0000000..74fd7a7
--- /dev/null
+++ b/tools/tools.v12.suo
Binary files differ
diff --git a/tools/trackeditor/build/Debug/trackeditor.log b/tools/trackeditor/build/Debug/trackeditor.log
new file mode 100644
index 0000000..1635e95
--- /dev/null
+++ b/tools/trackeditor/build/Debug/trackeditor.log
@@ -0,0 +1,8 @@
+Build started 11/7/2015 5:44:30 PM.
+ 1>Project "G:\Code\Simpsons Hit&Run\tools\trackeditor\build\trackeditor.vcxproj" on node 2 (Build target(s)).
+ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(369,5): error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.
+ 1>Done Building Project "G:\Code\Simpsons Hit&Run\tools\trackeditor\build\trackeditor.vcxproj" (Build target(s)) -- FAILED.
+
+Build FAILED.
+
+Time Elapsed 00:00:00.02
diff --git a/tools/trackeditor/build/trackeditor.dsp b/tools/trackeditor/build/trackeditor.dsp
new file mode 100644
index 0000000..1ddb5dc
--- /dev/null
+++ b/tools/trackeditor/build/trackeditor.dsp
@@ -0,0 +1,7141 @@
+# Microsoft Developer Studio Project File - Name="trackeditor" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=trackeditor - Win32 Tools Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "trackeditor.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "trackeditor.mak" CFG="trackeditor - Win32 Tools Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "trackeditor - Win32 Tools Release" (based on "Win32 (x86) Application")
+!MESSAGE "trackeditor - Win32 Tools Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "trackeditor"
+# PROP Scc_LocalPath "."
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "trackeditor___Win32_Tools_Release"
+# PROP BASE Intermediate_Dir "trackeditor___Win32_Tools_Release"
+# PROP BASE Ignore_Export_Lib 1
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\code\\" /I "C:\AW\Maya4.0\include" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /D "NDEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /Fp"Release/PCH.pch" /YX"precompiled/PCH.h" /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /I "..\..\..\game\code\constants" /D "NDEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_RELEASE" /Fp"Release/PCH.pch" /YX"precompiled/pch.h" /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release\trackeditor.mll" /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release\trackeditor.mll" /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy trackeditor.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Release\trackeditor.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\trackeditor.mll copy .\Release\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "trackeditor___Win32_Tools_Debug"
+# PROP BASE Intermediate_Dir "trackeditor___Win32_Tools_Debug"
+# PROP BASE Ignore_Export_Lib 1
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\code\\" /I "C:\AW\Maya4.0\include" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /D "_DEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /FR /YX"PCH.h" /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /I "..\..\..\game\code\constants" /D "_DEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_WIN32" /D "RAD_PC" /D "RAD_DEBUG" /FR /YX"PCH.h" /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\trackeditor.mll" /pdbtype:sept /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\trackeditor.mll" /pdbtype:sept /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy trackeditor.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditord.mll copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "trackeditor - Win32 Tools Release"
+# Name "trackeditor - Win32 Tools Debug"
+# Begin Group "main"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\main\constants.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.cpp
+DEP_CPP_PLUGI=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MApiVersion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnPlugin.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\mayahandles.h"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\commands\export.h"\
+ "..\code\commands\intersectioncommands.h"\
+ "..\code\commands\trackeditorcommands.h"\
+ "..\code\commands\treelinecommand.h"\
+ "..\code\contexts\bvcontext.h"\
+ "..\code\contexts\intersectioncontext.h"\
+ "..\code\contexts\ppcontext.h"\
+ "..\code\contexts\treelinecontext.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\pluginMain.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\fenceline.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\nodes\pedpath.h"\
+ "..\code\nodes\road.h"\
+ "..\code\nodes\tiledisplay.h"\
+ "..\code\nodes\treelineshapenode.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD BASE CPP /YX"precompiled/PCH.h"
+# ADD CPP /YX"precompiled/PCH.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\shapeconstants.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\trackeditor.cpp
+DEP_CPP_TRACK=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\fenceline.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\nodes\pedpath.h"\
+ "..\code\nodes\road.h"\
+ "..\code\nodes\tiledisplay.h"\
+ "..\code\nodes\treelineshapenode.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\trackeditor.h
+# End Source File
+# End Group
+# Begin Group "commands"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\commands\export.cpp
+DEP_CPP_EXPOR=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\..\globalcode\utility\MUI.h"\
+ "..\code\commands\export.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\fenceline.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\nodes\pedpath.h"\
+ "..\code\nodes\road.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\export.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\intersectioncommands.cpp
+DEP_CPP_INTER=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\commands\intersectioncommands.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\nodes\road.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\intersectioncommands.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\trackeditorcommands.cpp
+DEP_CPP_TRACKE=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\commands\trackeditorcommands.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\trackeditorcommands.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\treelinecommand.cpp
+DEP_CPP_TREEL=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\code\commands\treelinecommand.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\treelineshapenode.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\treelinecommand.h
+# End Source File
+# End Group
+# Begin Group "nodes"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\nodes\fenceline.cpp
+DEP_CPP_FENCE=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\fenceline.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\fenceline.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\intersection.cpp
+DEP_CPP_INTERS=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\GLExt.h"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\..\globalcode\utility\nodehelper.h"\
+ "..\..\globalcode\utility\transformmatrix.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\precompiled\PCH.h"\
+
+NODEP_CPP_INTERS=\
+ "..\..\globalcode\utility\main\toolhack.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\intersection.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\NU.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\pedpath.cpp
+DEP_CPP_PEDPA=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\pedpath.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\pedpath.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\road.cpp
+DEP_CPP_ROAD_=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\..\globalcode\utility\transformmatrix.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\road.h"\
+ "..\code\precompiled\PCH.h"\
+
+NODEP_CPP_ROAD_=\
+ "..\..\globalcode\utility\main\toolhack.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\road.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\tiledisplay.cpp
+DEP_CPP_TILED=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\GLExt.h"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\tiledisplay.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\tiledisplay.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\treelineshapenode.cpp
+DEP_CPP_TREELI=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\..\globalcode\utility\MUI.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\shapeconstants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\treelineshapenode.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\treelineshapenode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\walllocator.cpp
+DEP_CPP_WALLL=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\GLExt.h"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\..\globalcode\utility\nodehelper.h"\
+ "..\code\main\constants.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\walllocator.h
+# End Source File
+# End Group
+# Begin Group "contexts"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\contexts\bvcontext.cpp
+DEP_CPP_BVCON=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\contexts\bvcontext.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\fenceline.h"\
+ "..\code\nodes\NU.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\bvcontext.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\intersectioncontext.cpp
+DEP_CPP_INTERSE=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\contexts\intersectioncontext.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\intersection.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\intersectioncontext.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\ppcontext.cpp
+DEP_CPP_PPCON=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\contexts\ppcontext.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\NU.h"\
+ "..\code\nodes\pedpath.h"\
+ "..\code\nodes\walllocator.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\ppcontext.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\treelinecontext.cpp
+DEP_CPP_TREELIN=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\contexts\treelinecontext.h"\
+ "..\code\main\constants.h"\
+ "..\code\main\trackeditor.h"\
+ "..\code\nodes\treelineshapenode.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\treelinecontext.h
+# End Source File
+# End Group
+# Begin Group "utility"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\GLExt.cpp
+DEP_CPP_GLEXT=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\GLExt.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\GLExt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.cpp
+DEP_CPP_MAYAH=\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\globalcode\utility\mayahandles.h"\
+ "..\..\globalcode\utility\stdafx.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.cpp
+DEP_CPP_MEXT_=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt.h"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.cpp
+DEP_CPP_MEXT_T=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\MExt_template.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.cpp
+DEP_CPP_MUI_C=\
+ "..\..\globalcode\utility\mayahandles.h"\
+ "..\..\globalcode\utility\MUI.h"\
+ "..\..\globalcode\utility\stdafx.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\overlaymarquee.cpp
+DEP_CPP_OVERL=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\overlaymarquee.h"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\overlaymarquee.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\stdafx.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\transformmatrix.cpp
+DEP_CPP_TRANS=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\..\globalcode\utility\transformmatrix.h"\
+ "..\code\precompiled\PCH.h"\
+
+NODEP_CPP_TRANS=\
+ "..\..\globalcode\utility\main\toolhack.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\transformmatrix.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.c
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\winutil.c
+DEP_CPP_WINUT=\
+ "..\..\globalcode\utility\winutil.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD CPP /YX"precompiled\pch.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\winutil.h
+# End Source File
+# End Group
+# Begin Group "mel scripts"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\scripts\te_BVContext.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_BVContext.mel
+InputName=te_BVContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_BVContext.mel
+InputName=te_BVContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_cleanup.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_cleanup.mel
+InputName=te_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_cleanup.mel
+InputName=te_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_editorwindow.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_editorwindow.mel
+InputName=te_editorwindow
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_editorwindow.mel
+InputName=te_editorwindow
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_globals.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_globals.mel
+InputName=te_globals
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_globals.mel
+InputName=te_globals
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_IntersectionContext.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_IntersectionContext.mel
+InputName=te_IntersectionContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_IntersectionContext.mel
+InputName=te_IntersectionContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_main.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_main.mel
+InputName=te_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_main.mel
+InputName=te_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_PPContext.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_PPContext.mel
+InputName=te_PPContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_PPContext.mel
+InputName=te_PPContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_setup.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_setup.mel
+InputName=te_setup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\te_setup.mel
+InputName=te_setup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\te_treelineContext.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build
+InputPath=..\code\scripts\te_treelineContext.mel
+InputName=te_treelineContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build
+InputPath=..\code\scripts\te_treelineContext.mel
+InputName=te_treelineContext
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "precompiled header"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.cpp
+DEP_CPP_PCH_C=\
+ "..\..\..\game\code\constants\srrchunks.h"\
+ "..\..\..\game\libs\pure3d\constants\atenum.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunkids.hpp"\
+ "..\..\..\game\libs\pure3d\constants\chunks.h"\
+ "..\..\..\game\libs\pure3d\constants\psenum.hpp"\
+ "..\..\..\game\libs\pure3d\pddi\pddienum.hpp"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\M3dView.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAngle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAnimControl.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArgList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataBuilder.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MArrayDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeIndex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpec.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MAttributeSpecArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MBoundingBox.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MColorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MCursor.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDagPath.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataBlock.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDataHandle.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDGModifier.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDistance.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDoubleArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequest.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MDrawRequestQueue.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEulerRotation.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MEvent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFloatVectorArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFn.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAnimCurve.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnBase.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnCompoundAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDagNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDependencyNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnDoubleArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnEnumAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIkJoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnIntArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMatrixData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMesh.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnMessageAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnNumericData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnSingleIndexedComponent.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnStringArrayData.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTransform.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MFnTypedAttribute.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MGlobal.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MIntArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDag.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItDependencyNodes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItMeshVertex.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MItSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMaterial.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MNodeMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObject.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MObjectArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlug.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPlugArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPoint.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPointArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContext.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxContextCommand.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxGeometryIterator.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxLocatorNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxNode.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShape.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MPxSurfaceShapeUI.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MQuaternion.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectInfo.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionList.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSelectionMask.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStatus.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MString.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MStringArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MSyntax.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTime.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTimeArray.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTransformationMatrix.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypeId.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MTypes.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MUiMessage.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVector.h"\
+ "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\maya\MVectorArray.h"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimatedObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimationChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimCollDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAnimDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlAttributeTableChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBBoxChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBreakableObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlBSphereChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlChannelChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCollisionObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlCompositeDrawableChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlDynaPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlExtraMatrixChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFenceDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFencelineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFollowCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlFrameControllerChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlImageChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaEntityDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstancesChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstaStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlInstParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlIntersectionChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMeshChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlMultiControllerChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlObjectAttributeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlParticleSystemChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPedpathChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysicsObjectChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPhysWrapperChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlPrimGroupChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlRoadSegmentDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlScenegraphChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSkinChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlSpriteChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlStaticPhysDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlTreeDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWalkerCamDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWallChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBLocatorChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBRailCamChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBSplineChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWBTriggerVolumeChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\chunks16\inc\tlWorldSphereDSGChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\dospath.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\getopt.h"\
+ "..\..\..\game\libs\pure3d\toollib\inc\glob.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\hash.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\lzr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAdjEdgeList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimatedObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObject.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBillboardObjectAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlBox.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCameraAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChannel.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlChunk16.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlColour.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlCompositeDrawable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlDataChunk.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEdge.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEntity.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlentitytable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlEventAnimation.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpression.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlExpressionOffsets.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFile.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFileByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFont.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFourCC.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlFrameController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlGameAttr.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHashList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHeightField.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlHistory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImage.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlImageQuantizer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIndexedVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlinventory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlIterator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLight.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLightAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLoadManager.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlLocator.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMatrix.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMemByteStream.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlMultiController.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOffsetList.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlOpticEffect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlParticleSystem.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPhotonMap.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoint.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPose.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPoseAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroup.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPrimGroupMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlPS2PrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlQuat.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlRay.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSafeEntityCaster.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraph.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlScenegraphTransformAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSimpleShader.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkeleton.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkin.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSkinVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSphere.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlSprite.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlString.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlStringTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTable.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextDataParser.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTexture.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTextureAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangle.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriangleIntersectFactory.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMesh.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTriMeshIntersect.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlTypes.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlUV.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlversion.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertex.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVertexAnimKey.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlVisAnim.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\tlXBOXPrimBuffer.hpp"\
+ "..\..\..\game\libs\pure3d\toollib\inc\toollib.hpp"\
+ "..\..\..\game\libs\radmath\radmath\buildconfig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\geometry.hpp"\
+ "..\..\..\game\libs\radmath\radmath\matrix.hpp"\
+ "..\..\..\game\libs\radmath\radmath\platform\ps2\vu0microcode.hpp"\
+ "..\..\..\game\libs\radmath\radmath\quaternion.hpp"\
+ "..\..\..\game\libs\radmath\radmath\radmath.hpp"\
+ "..\..\..\game\libs\radmath\radmath\random.hpp"\
+ "..\..\..\game\libs\radmath\radmath\spline.hpp"\
+ "..\..\..\game\libs\radmath\radmath\trig.hpp"\
+ "..\..\..\game\libs\radmath\radmath\util.hpp"\
+ "..\..\..\game\libs\radmath\radmath\vector.hpp"\
+ "..\code\precompiled\PCH.h"\
+
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# ADD BASE CPP /Yc"PCH.h"
+# ADD CPP /Yc"PCH.h"
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# ADD BASE CPP /Yc"PCH.h"
+# ADD CPP /Yc"PCH.h"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.h
+# End Source File
+# End Group
+# Begin Group "AETemplates"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel
+InputName=AEIntersectionLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel
+InputName=AEIntersectionLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AERoadNodeTemplate.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AERoadNodeTemplate.mel
+InputName=AERoadNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AERoadNodeTemplate.mel
+InputName=AERoadNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AETELocatorSuppress.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETELocatorSuppress.mel
+InputName=AETELocatorSuppress
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETELocatorSuppress.mel
+InputName=AETELocatorSuppress
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AETEShowRoadSegButton.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETEShowRoadSegButton.mel
+InputName=AETEShowRoadSegButton
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETEShowRoadSegButton.mel
+InputName=AETEShowRoadSegButton
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AETreelineShapeNodeTemplate.mel
+
+!IF "$(CFG)" == "trackeditor - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETreelineShapeNodeTemplate.mel
+InputName=AETreelineShapeNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "trackeditor - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETreelineShapeNodeTemplate.mel
+InputName=AETreelineShapeNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/tools/trackeditor/build/trackeditor.vcproj b/tools/trackeditor/build/trackeditor.vcproj
new file mode 100644
index 0000000..e516ec7
--- /dev/null
+++ b/tools/trackeditor/build/trackeditor.vcproj
@@ -0,0 +1,906 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="trackeditor"
+ SccProjectName="Perforce Project"
+ SccAuxPath=""
+ SccLocalPath="."
+ SccProvider="MSSCCI:Perforce SCM"
+ Keyword="MFCProj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Tools Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\include\,..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath,..\..\..\game\code\constants"
+ PreprocessorDefinitions="NDEBUG;WIN32;_WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_RELEASE"
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="precompiled/pch.h"
+ PrecompiledHeaderFile="Release/PCH.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalOptions="/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin
+"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib WS2_32.LIB"
+ OutputFile="Release\trackeditor.mll"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ IgnoreDefaultLibraryNames="LIBC.lib;LIBCMT.lib;LIBCPMT.lib"
+ ProgramDatabaseFile=".\Release/trackeditor.pdb"
+ SubSystem="1"
+ ImportLibrary=".\Release/trackeditor.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/trackeditor.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy trackeditor.mll to Distribution and Maya dir."
+ CommandLine="copy .\Release\trackeditor.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\trackeditor.mll
+copy .\Release\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;NDEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Tools Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath,..\..\..\game\libs\pure3d\sdks\Maya4_0\include\,..\..\..\game\code\constants"
+ PreprocessorDefinitions="_DEBUG;WIN32;_WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_DEBUG"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="PCH.h"
+ PrecompiledHeaderFile=".\Debug/trackeditor.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib"
+ OutputFile="Debug\trackeditor.mll"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/trackeditor.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Debug/trackeditor.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/trackeditor.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy trackeditor.mll to Distribution and Maya dir."
+ CommandLine="copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditord.mll
+copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;_DEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="main"
+ Filter="">
+ <File
+ RelativePath="..\code\main\constants.h">
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.cpp">
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.h">
+ </File>
+ <File
+ RelativePath="..\code\main\shapeconstants.h">
+ </File>
+ <File
+ RelativePath="..\code\main\trackeditor.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\main\trackeditor.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="commands"
+ Filter="">
+ <File
+ RelativePath="..\code\commands\export.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\commands\export.h">
+ </File>
+ <File
+ RelativePath="..\code\commands\intersectioncommands.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\commands\intersectioncommands.h">
+ </File>
+ <File
+ RelativePath="..\code\commands\trackeditorcommands.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\commands\trackeditorcommands.h">
+ </File>
+ <File
+ RelativePath="..\code\commands\treelinecommand.cpp">
+ </File>
+ <File
+ RelativePath="..\code\commands\treelinecommand.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="nodes"
+ Filter="">
+ <File
+ RelativePath="..\code\nodes\NU.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\fenceline.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\nodes\fenceline.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\intersection.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\nodes\intersection.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\pedpath.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\pedpath.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\road.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\nodes\road.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\tiledisplay.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\nodes\tiledisplay.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\treelineshapenode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\treelineshapenode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\walllocator.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\nodes\walllocator.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="contexts"
+ Filter="">
+ <File
+ RelativePath="..\code\contexts\bvcontext.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\contexts\bvcontext.h">
+ </File>
+ <File
+ RelativePath="..\code\contexts\intersectioncontext.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\contexts\intersectioncontext.h">
+ </File>
+ <File
+ RelativePath="..\code\contexts\ppcontext.cpp">
+ </File>
+ <File
+ RelativePath="..\code\contexts\ppcontext.h">
+ </File>
+ <File
+ RelativePath="..\code\contexts\treelinecontext.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\contexts\treelinecontext.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="utility"
+ Filter="">
+ <File
+ RelativePath="..\..\globalcode\utility\GLExt.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\GLExt.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\overlaymarquee.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\overlaymarquee.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\stdafx.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\transformmatrix.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\transformmatrix.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.c">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\winutil.c">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ PrecompiledHeaderThrough="precompiled\pch.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\winutil.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="mel scripts"
+ Filter="">
+ <File
+ RelativePath="..\code\scripts\te_BVContext.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_IntersectionContext.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_PPContext.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_cleanup.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_editorwindow.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_globals.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_main.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_setup.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\te_treelineContext.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="precompiled header"
+ Filter="">
+ <File
+ RelativePath="..\code\precompiled\PCH.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\precompiled\PCH.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="AETemplates"
+ Filter="">
+ <File
+ RelativePath="..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AERoadNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AETELocatorSuppress.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AETEShowRoadSegButton.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AETreelineShapeNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/trackeditor/build/trackeditor.vcxproj b/tools/trackeditor/build/trackeditor.vcxproj
new file mode 100644
index 0000000..84b6151
--- /dev/null
+++ b/tools/trackeditor/build/trackeditor.vcxproj
@@ -0,0 +1,438 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Tools Debug|Win32">
+ <Configuration>Tools Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Tools Release|Win32">
+ <Configuration>Tools Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath />
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>MFCProj</Keyword>
+ <ProjectGuid>{8D79E782-9747-4732-A869-CA630AC7D3C0}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <OutDir>.\Release\</OutDir>
+ <IntDir>.\Release\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <OutDir>.\Debug\</OutDir>
+ <IntDir>.\Debug\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;..\..\..\game\code\constants;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>NDEBUG;WIN32;_WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_RELEASE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader />
+ <PrecompiledHeaderFile>precompiled/pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>Release/PCH.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin
+ %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaUI.lib;OpenMayaAnim.lib;WS2_32.LIB;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Release\trackeditor.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>LIBC.lib;LIBCMT.lib;LIBCPMT.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>.\Release/trackeditor.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <ImportLibrary>.\Release/trackeditor.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/trackeditor.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy trackeditor.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Release\trackeditor.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\trackeditor.mll
+copy .\Release\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;..\..\..\game\code\constants;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_DEBUG;WIN32;_WIN32;_WINDOWS;NT_PLUGIN;RAD_WIN32;RAD_PC;RAD_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader />
+ <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>.\Debug/trackeditor.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+ <ObjectFileName>.\Debug/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaUI.lib;OpenMayaAnim.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Debug\trackeditor.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Debug/trackeditor.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>.\Debug/trackeditor.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/trackeditor.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy trackeditor.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditord.mll
+copy .\Debug\trackeditor.mll C:\AW\Maya4.0\bin\plug-ins\trackeditor.mll
+</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\constants.h" />
+ <ClInclude Include="..\code\main\pluginMain.h" />
+ <ClInclude Include="..\code\main\shapeconstants.h" />
+ <ClInclude Include="..\code\main\trackeditor.h" />
+ <ClInclude Include="..\code\commands\export.h" />
+ <ClInclude Include="..\code\commands\intersectioncommands.h" />
+ <ClInclude Include="..\code\commands\trackeditorcommands.h" />
+ <ClInclude Include="..\code\commands\treelinecommand.h" />
+ <ClInclude Include="..\code\nodes\NU.h" />
+ <ClInclude Include="..\code\nodes\fenceline.h" />
+ <ClInclude Include="..\code\nodes\intersection.h" />
+ <ClInclude Include="..\code\nodes\pedpath.h" />
+ <ClInclude Include="..\code\nodes\road.h" />
+ <ClInclude Include="..\code\nodes\tiledisplay.h" />
+ <ClInclude Include="..\code\nodes\treelineshapenode.h" />
+ <ClInclude Include="..\code\nodes\walllocator.h" />
+ <ClInclude Include="..\code\contexts\bvcontext.h" />
+ <ClInclude Include="..\code\contexts\intersectioncontext.h" />
+ <ClInclude Include="..\code\contexts\ppcontext.h" />
+ <ClInclude Include="..\code\contexts\treelinecontext.h" />
+ <ClInclude Include="..\..\globalcode\utility\GLExt.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h" />
+ <ClInclude Include="..\..\globalcode\utility\MUI.h" />
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h" />
+ <ClInclude Include="..\..\globalcode\utility\overlaymarquee.h" />
+ <ClInclude Include="..\..\globalcode\utility\stdafx.h" />
+ <ClInclude Include="..\..\globalcode\utility\transformmatrix.h" />
+ <ClInclude Include="..\..\globalcode\utility\util.h" />
+ <ClInclude Include="..\..\globalcode\utility\winutil.h" />
+ <ClInclude Include="..\code\precompiled\PCH.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\main\trackeditor.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\export.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\intersectioncommands.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\trackeditorcommands.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\treelinecommand.cpp" />
+ <ClCompile Include="..\code\nodes\fenceline.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\intersection.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\pedpath.cpp" />
+ <ClCompile Include="..\code\nodes\road.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\tiledisplay.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\treelineshapenode.cpp" />
+ <ClCompile Include="..\code\nodes\walllocator.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\bvcontext.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\intersectioncontext.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\ppcontext.cpp" />
+ <ClCompile Include="..\code\contexts\treelinecontext.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\GLExt.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\overlaymarquee.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\transformmatrix.cpp">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\util.c">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\winutil.c">
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">precompiled\pch.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\te_BVContext.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_IntersectionContext.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_PPContext.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_cleanup.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_editorwindow.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_globals.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_main.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_setup.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_treelineContext.mel">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AERoadNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETELocatorSuppress.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETEShowRoadSegButton.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETreelineShapeNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.vcxproj">
+ <Project>{6d333c70-a27d-4e25-ad26-bb9e20558b8f}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\game\libs\pure3d\toollib\toollib_extras.vcxproj">
+ <Project>{cdb92e4a-1e5d-49a8-8153-34264b3fef29}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/tools/trackeditor/build/trackeditor.vcxproj.filters b/tools/trackeditor/build/trackeditor.vcxproj.filters
new file mode 100644
index 0000000..822d311
--- /dev/null
+++ b/tools/trackeditor/build/trackeditor.vcxproj.filters
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="main">
+ <UniqueIdentifier>{7aa3607e-360c-466f-82ae-abf6f985953c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="commands">
+ <UniqueIdentifier>{d3d48be8-1aeb-450f-a824-b321cc40f4f2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="nodes">
+ <UniqueIdentifier>{b4375917-2908-4939-b7c2-be6eeac47c5f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="contexts">
+ <UniqueIdentifier>{d4bed8bc-73b8-4016-903d-7e43fb5b6474}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="utility">
+ <UniqueIdentifier>{f9a9c2c9-d17e-4ef9-b109-1f516775a8e3}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="mel scripts">
+ <UniqueIdentifier>{a5619506-109a-41b8-a033-fe6a1100443e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="precompiled header">
+ <UniqueIdentifier>{c08cb6ab-ec6f-44fa-854e-7567fdae9bdc}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="AETemplates">
+ <UniqueIdentifier>{3efb7bc8-741f-4cbd-939e-c757b812ed2d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\constants.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\pluginMain.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\shapeconstants.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\trackeditor.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\export.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\intersectioncommands.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\trackeditorcommands.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\treelinecommand.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\NU.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\fenceline.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\intersection.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\pedpath.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\road.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\tiledisplay.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\treelineshapenode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\walllocator.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\bvcontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\intersectioncontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\ppcontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\treelinecontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\GLExt.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MUI.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\overlaymarquee.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\stdafx.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\transformmatrix.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\util.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\winutil.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\precompiled\PCH.h">
+ <Filter>precompiled header</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp">
+ <Filter>main</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\main\trackeditor.cpp">
+ <Filter>main</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\export.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\intersectioncommands.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\trackeditorcommands.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\treelinecommand.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\fenceline.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\intersection.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\pedpath.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\road.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\tiledisplay.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\treelineshapenode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\walllocator.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\bvcontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\intersectioncontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\ppcontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\treelinecontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\GLExt.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\overlaymarquee.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\transformmatrix.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\util.c">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\winutil.c">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <Filter>precompiled header</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\te_BVContext.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_IntersectionContext.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_PPContext.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_cleanup.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_editorwindow.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_globals.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_main.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_setup.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\te_treelineContext.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEIntersectionLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AERoadNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETELocatorSuppress.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETEShowRoadSegButton.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETreelineShapeNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tools/trackeditor/code/AETemplates/AEIntersectionLocatorNodeTemplate.mel b/tools/trackeditor/code/AETemplates/AEIntersectionLocatorNodeTemplate.mel
new file mode 100644
index 0000000..740b05f
--- /dev/null
+++ b/tools/trackeditor/code/AETemplates/AEIntersectionLocatorNodeTemplate.mel
@@ -0,0 +1,20 @@
+global proc AEIntersectionLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Intersection Attributes" -collapse 0;
+
+ editorTemplate -addControl "IntersectionType";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "localPosition";
+}
+ \ No newline at end of file
diff --git a/tools/trackeditor/code/AETemplates/AERoadNodeTemplate.mel b/tools/trackeditor/code/AETemplates/AERoadNodeTemplate.mel
new file mode 100644
index 0000000..27c4431
--- /dev/null
+++ b/tools/trackeditor/code/AETemplates/AERoadNodeTemplate.mel
@@ -0,0 +1,29 @@
+global proc AERoadNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Road Attributes" -collapse 0;
+
+ editorTemplate -addControl "IntersectionStart";
+ editorTemplate -addControl "IntersectionEnd";
+ editorTemplate -addControl "density";
+ editorTemplate -addControl "speed";
+ editorTemplate -addControl "difficulty";
+ editorTemplate -addControl "shortCut";
+
+ editorTemplate -callCustom "AETEShowRoadSegNew"
+ "AETEShowRoadSegReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "localPosition";
+}
+ \ No newline at end of file
diff --git a/tools/trackeditor/code/AETemplates/AETELocatorSuppress.mel b/tools/trackeditor/code/AETemplates/AETELocatorSuppress.mel
new file mode 100644
index 0000000..13a6d00
--- /dev/null
+++ b/tools/trackeditor/code/AETemplates/AETELocatorSuppress.mel
@@ -0,0 +1,37 @@
+global proc AETELocatorSuppress( string $nodeName )
+{
+ editorTemplate -suppress "inputTranslate";
+ editorTemplate -suppress "input";
+ editorTemplate -suppress "caching";
+ editorTemplate -suppress "nodeState";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "template";
+ editorTemplate -suppress "ghosting";
+ editorTemplate -suppress "instObjGroups";
+ editorTemplate -suppress "compInstObjGroups";
+ editorTemplate -suppress "castsShadows";
+ editorTemplate -suppress "receiveShadows";
+ editorTemplate -suppress "depthJitter";
+ editorTemplate -suppress "motionBlur";
+ editorTemplate -suppress "renderInfo";
+ editorTemplate -suppress "primaryVisibility";
+ editorTemplate -suppress "visibleInReflections";
+ editorTemplate -suppress "visibleInRefractions";
+ editorTemplate -suppress "geometryAntialiasingOverride";
+ editorTemplate -suppress "antialiasingLevel";
+ editorTemplate -suppress "shadingSamplesOverride";
+ editorTemplate -suppress "shadingSamples";
+ editorTemplate -suppress "maxShadingSamples";
+ editorTemplate -suppress "volumeSamplesOverride";
+ editorTemplate -suppress "volumeSamples";
+ editorTemplate -suppress "maxVisibilitySamplesOverride";
+ editorTemplate -suppress "maxVisibilitySamples";
+ editorTemplate -suppress "boundingBoxScale";
+ editorTemplate -suppress "drawOverride";
+ editorTemplate -suppress "useObjectColor";
+ editorTemplate -suppress "objectColor";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "lodVisibility";
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/AETemplates/AETEShowRoadSegButton.mel b/tools/trackeditor/code/AETemplates/AETEShowRoadSegButton.mel
new file mode 100644
index 0000000..3ffbeb5
--- /dev/null
+++ b/tools/trackeditor/code/AETemplates/AETEShowRoadSegButton.mel
@@ -0,0 +1,29 @@
+global proc AETEShowRoadSegNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "te_MCB_ShowRoadFromSelected()";
+
+ button -label "Show Road Segments" -command $command TEShowRoadSegsButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+
+global proc AETEShowRoadSegReplace( string $nodeName )
+{
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "te_MCB_ShowRoadFromSelected";
+
+ button -e -command $command TEShowRoadSegsButton;
+
+ select $names[0];
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/AETemplates/AETreelineShapeNodeTemplate.mel b/tools/trackeditor/code/AETemplates/AETreelineShapeNodeTemplate.mel
new file mode 100644
index 0000000..766ed13
--- /dev/null
+++ b/tools/trackeditor/code/AETemplates/AETreelineShapeNodeTemplate.mel
@@ -0,0 +1,41 @@
+global proc AETreelineShapeNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Treeline Attributes" -collapse false;
+
+ editorTemplate -addControl "material";
+
+ editorTemplate -addControl "uscale";
+
+ editorTemplate -addControl "height";
+
+ editorTemplate -suppress "colour";
+
+ editorTemplate -suppress "alpha";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AETELocatorSuppress( $nodeName );
+
+ editorTemplate -suppress "controlPoints";
+ editorTemplate -suppress "weights";
+ editorTemplate -suppress "uvSet";
+ editorTemplate -suppress "tweak";
+ editorTemplate -suppress "relativeTweak";
+ editorTemplate -suppress "currentUVSet";
+ editorTemplate -suppress "doubleSided";
+ editorTemplate -suppress "opposite";
+ editorTemplate -suppress "smoothShading";
+ editorTemplate -suppress "featureDisplacement";
+ editorTemplate -suppress "initialSampleRate";
+ editorTemplate -suppress "textureThreshold";
+ editorTemplate -suppress "normalThreshold";
+ editorTemplate -suppress "extraSampleRate";
+}
+ \ No newline at end of file
diff --git a/tools/trackeditor/code/commands/export.cpp b/tools/trackeditor/code/commands/export.cpp
new file mode 100644
index 0000000..77b7328
--- /dev/null
+++ b/tools/trackeditor/code/commands/export.cpp
@@ -0,0 +1,193 @@
+#include "precompiled/PCH.h"
+
+#include "export.h"
+#include "main/constants.h"
+#include "nodes/walllocator.h"
+#include "nodes/fenceline.h"
+#include "nodes/intersection.h"
+#include "nodes/road.h"
+#include "nodes/pedpath.h"
+#include "utility/mui.h"
+#include "utility/mext.h"
+
+#include <toollib.hpp>
+
+const char* ExportCommand::stringId = "TE_Export";
+bool ExportCommand::sRegisteredChunks = false;
+
+
+ExportCommand::ExportCommand() {};
+ExportCommand::~ExportCommand() {};
+
+//==============================================================================
+// ExportCommand::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* ExportCommand::creator()
+{
+ return new ExportCommand();
+}
+
+//==============================================================================
+// ExportCommand::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus ExportCommand::doIt( const MArgList& args )
+{
+ if ( !sRegisteredChunks )
+ {
+ tlDataChunk::RegisterDefaultChunks();
+ sRegisteredChunks = true;
+ }
+
+ //Go through all the chunks looking for the types we want and exporting them.
+ //Alternatively, we could go thtough all the chunks and attempt to access the
+ //IExportable interface and then export if the interface exists...
+
+ //Args are all, or selected.
+
+ const unsigned char FILE_NAME_SIZE = 255;
+ char filePath[FILE_NAME_SIZE];
+ filePath[0] = '\0';
+
+ if ( MUI::FileDialog( filePath,
+ FILE_NAME_SIZE,
+ "Track Editor Export",
+ "Pure3D(*.p3d)|*.p3d|All Files(*.*)|*.*||",
+ "p3d",
+ MUI::SAVE ) )
+ {
+ //TODO: add selected.
+ MItDag dagIt( MItDag::kBreadthFirst, MFn::kLocator );
+
+ tlDataChunk* outChunk = new tlDataChunk;
+
+ //Put in a history chunk.
+ tlHistory history;
+
+// char hist[256];
+// sprintf(hist, "Track Editor version: 2.0, toollib version: %s", tlversion);
+//
+// history.AddLine( hist );
+
+// outChunk->AppendSubChunk( history.Chunk(), 0 );
+
+ bool deleteLast = false;
+ MFnDependencyNode fnNode;
+ MObject lastObj;
+ MTypeId id;
+
+ while ( !dagIt.isDone() )
+ {
+ fnNode.setObject( dagIt.item() );
+ id = fnNode.typeId();
+
+ if ( id == FenceLineNode::id )
+ {
+ //Export a wall locator;
+ tlDataChunk* newChunk = FenceLineNode::Export( dagIt.item(), history );
+
+ if ( newChunk )
+ {
+ //Append this to the output file.
+ outChunk->AppendSubChunk( newChunk );
+ }
+ else
+ {
+ //Time to go away.
+ deleteLast = true;
+ }
+ }
+ else if ( id == IntersectionLocatorNode::id )
+ {
+ tlDataChunk* newChunk = IntersectionLocatorNode::Export( dagIt.item(), history );
+
+ if ( newChunk )
+ {
+ //Append this to the output file.
+ outChunk->AppendSubChunk( newChunk );
+ }
+ else
+ {
+ //Time to go away.
+ deleteLast = true;
+ }
+ }
+ else if ( id == RoadNode::id )
+ {
+ tlDataChunk* newChunk = RoadNode::Export( dagIt.item(), history, outChunk );
+
+ if ( newChunk )
+ {
+ //Append this to the output file.
+ outChunk->AppendSubChunk( newChunk );
+ }
+ else
+ {
+ //Time to go away.
+ deleteLast = true;
+ }
+ }
+ else if ( id == PedPathNode::id )
+ {
+ tlDataChunk* newChunk = PedPathNode::Export( dagIt.item(), history );
+
+ if ( newChunk )
+ {
+ //Append this to the output file.
+ outChunk->AppendSubChunk( newChunk );
+ }
+ else
+ {
+ //Time to go away.
+ deleteLast = true;
+ }
+ }
+
+ if ( deleteLast )
+ {
+ lastObj = dagIt.item();
+ }
+
+ dagIt.next();
+
+ if ( deleteLast )
+ {
+ MExt::DisplayWarning( "Deleting useless node: %s", fnNode.name().asChar() );
+ MExt::DeleteNode( lastObj, true );
+ deleteLast = false;
+ }
+ }
+
+ tlFile output(new tlFileByteStream(filePath, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+
+ MGlobal::displayError("Unable to write file!");
+
+ delete outChunk;
+ return MS::kFailure;
+ }
+
+ //Sort it out..
+ outChunk->SortSubChunks();
+ outChunk->Write(&output);
+
+ delete outChunk;
+ }
+
+ return MS::kSuccess;
+}
diff --git a/tools/trackeditor/code/commands/export.h b/tools/trackeditor/code/commands/export.h
new file mode 100644
index 0000000..f3c031c
--- /dev/null
+++ b/tools/trackeditor/code/commands/export.h
@@ -0,0 +1,26 @@
+#include "precompiled/PCH.h"
+
+#ifndef EXPORT_COMMAND_H
+#define EXPORT_COMMAND_H
+
+class ExportCommand : MPxCommand
+{
+public:
+ enum ExportArg
+ {
+ SELECTED,
+ ALL
+ };
+
+ ExportCommand();
+ ~ExportCommand();
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+
+private:
+ static bool sRegisteredChunks;
+};
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/commands/intersectioncommands.cpp b/tools/trackeditor/code/commands/intersectioncommands.cpp
new file mode 100644
index 0000000..4733762
--- /dev/null
+++ b/tools/trackeditor/code/commands/intersectioncommands.cpp
@@ -0,0 +1,449 @@
+#include "precompiled/PCH.h"
+
+#include "intersectioncommands.h"
+#include "utility/mext.h"
+#include "nodes/road.h"
+#include "main/trackeditor.h"
+#include "nodes/intersection.h"
+
+
+const char* CreateRoadCmd::stringId = "TE_CreateRoad";
+const char* AddIntersectionToRoadCmd::stringId = "TE_AddIntersectionToRoad";
+
+
+//==============================================================================
+// CreateRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* CreateRoadCmd::creator()
+{
+ return new CreateRoadCmd();
+}
+
+//==============================================================================
+// CreateRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus CreateRoadCmd::doIt( const MArgList& args )
+{
+ //Take all the selected road segments and create a road from them.
+ //If there is a segment that has not been roadified, highlight that one and return an error message.
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+ MItSelectionList itSelect( selectList, MFn::kMesh );
+
+ if ( selectList.length() <= 0 || itSelect.isDone() )
+ {
+ MExt::DisplayWarning( "Nothing to do, please select road segments!" );
+ return MStatus::kSuccess;
+ }
+
+ MObjectArray segArray;
+ MObject obj;
+ MFnMesh fnMesh;
+ MPlug whichRoadPlug;
+ MStatus status;
+
+ while ( !itSelect.isDone() )
+ {
+ //Gather all the road segments and add them to the new road.
+ itSelect.getDependNode( obj );
+
+ fnMesh.setObject( obj );
+
+ whichRoadPlug = fnMesh.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status == MStatus::kSuccess )
+ {
+ //This is one of them.
+ segArray.append( obj );
+ }
+
+ itSelect.next();
+ }
+
+ if ( segArray.length() <= 0 )
+ {
+ //There were no appropriate segs in the selection.
+ MExt::DisplayWarning( "Nothing to do, please select road segments!" );
+ return MStatus::kSuccess;
+ }
+
+ MObject newRoad;
+ MObject newRoadT;
+
+ MExt::CreateNode( newRoad, newRoadT, MString( RoadNode::stringId ) );
+
+ assert( !newRoad.isNull() );
+
+ unsigned int i;
+ for ( i = 0; i < segArray.length(); ++i )
+ {
+ //Test to see if this road seg is already connected.
+ if ( MExt::IsConnected( segArray[ i ], "teWhichRoad" ) )
+ {
+ MExt::DisconnectAll( segArray[ i ], "teWhichRoad" );
+ }
+
+ MExt::Connect( segArray[ i ], "teWhichRoad", newRoad, RoadNode::ROAD_SEG_NAME_LONG );
+ }
+
+ TrackEditor::AddChild( newRoad );
+
+ return MStatus::kSuccess;
+}
+
+
+//==============================================================================
+// AddIntersectionToRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* AddIntersectionToRoadCmd::creator()
+{
+ return new AddIntersectionToRoadCmd();
+}
+
+//==============================================================================
+// AddIntersectionToRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus AddIntersectionToRoadCmd::doIt( const MArgList& args )
+{
+ MStatus status;
+
+ //Arg 0 is the name of the intersection (the road is selected)
+ //Arg 1 is whether it is a start or end point on the road.
+
+ assert( args.length() == 2 );
+
+ MObjectArray roadArray;
+
+ if ( GetRoadsFromSelectionList( roadArray ) )
+ {
+ MString intersectionName;
+ args.get( 0, intersectionName );
+
+ if ( intersectionName == MString( "" ) )
+ {
+ MExt::DisplayWarning( "Must have an intersection selected in the editor." );
+ return MStatus::kSuccess;
+ }
+
+ bool isEnd;
+ args.get( 1, isEnd );
+
+ MDagPath dagPath;
+ if ( !MExt::FindDagNodeByName( &dagPath, intersectionName ) )
+ {
+ MExt::DisplayWarning( "The Intersection: %s does not exist!", intersectionName.asChar() );
+ return MStatus::kSuccess;
+ }
+
+ MFnDagNode fnIntersectionDagNode( dagPath );
+
+ unsigned int i;
+ for ( i = 0; i < roadArray.length(); ++i )
+ {
+ if ( isEnd )
+ {
+ MExt::DisconnectAll( roadArray[i], RoadNode::INTERSECTION_END_LONG );
+ MExt::Connect( roadArray[i], RoadNode::INTERSECTION_END_LONG, fnIntersectionDagNode.object(), IntersectionLocatorNode::ROAD_LONG );
+ }
+ else
+ {
+ MExt::DisconnectAll( roadArray[i], RoadNode::INTERSECTION_START_LONG );
+ MExt::Connect( roadArray[i], RoadNode::INTERSECTION_START_LONG, fnIntersectionDagNode.object(), IntersectionLocatorNode::ROAD_LONG );
+ }
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+const char* ShowRoadCmd::stringId = "TE_ShowRoad";
+
+//==============================================================================
+// ShowRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* ShowRoadCmd::creator()
+{
+ return new ShowRoadCmd();
+}
+
+//==============================================================================
+// ShowRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus ShowRoadCmd::doIt( const MArgList& args )
+{
+
+ MObject road;
+
+ if ( GetRoadFromSelectionList( road ) )
+ {
+ MString cmd;
+
+ MFnDependencyNode fnNode( road );
+ MPlug roadPlug = fnNode.findPlug( MString( RoadNode::ROAD_SEG_NAME_LONG ) );
+ assert( roadPlug.isArray() );
+
+ MGlobal::clearSelectionList();
+
+ MPlugArray source, dest;
+ MExt::ResolveConnections( &source, &dest, roadPlug, AS_DEST );
+
+ assert( source.length() );
+
+ unsigned int i;
+ for ( i = 0; i < source.length(); ++i )
+ {
+ fnNode.setObject( source[i].node() );
+ cmd = MString( "select -add " ) + fnNode.name();
+
+ MGlobal::executeCommand( cmd );
+ }
+
+ fnNode.setObject( road );
+ cmd = MString("select -add ") + fnNode.name();
+ MGlobal::executeCommand( cmd );
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+const char* DestroyRoadCmd::stringId = "TE_DestroyRoad";
+
+//==============================================================================
+// DestroyRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* DestroyRoadCmd::creator()
+{
+ return new DestroyRoadCmd();
+}
+
+//==============================================================================
+// DestroyRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus DestroyRoadCmd::doIt( const MArgList& args )
+{
+
+ MObject road;
+
+ if ( GetRoadFromSelectionList( road ) )
+ {
+ MExt::DeleteNode( road, true );
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+
+//==============================================================================
+// GetRoadFromSelectionList
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& road )
+//
+// Return: bool
+//
+//==============================================================================
+bool GetRoadFromSelectionList( MObject& road )
+{
+ MStatus status;
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+
+ if ( selectList.length() <= 0 )
+ {
+ MExt::DisplayWarning( "A road segment must be selected!" );
+ return false;
+ }
+ else
+ {
+ MObject segment;
+ selectList.getDependNode( 0, segment );
+ MFnDagNode fnNode( segment );
+
+ if ( fnNode.typeName() == MString( RoadNode::stringId ) )
+ {
+ //this is a road segment
+ road = fnNode.object();
+ }
+ else
+ {
+ //Test to make sure the selected item is a road segment.
+ MFn::Type type = fnNode.type();
+
+ if ( fnNode.typeName() == MString( "transform" ) )
+ {
+ //We want the child of this, not the transform.
+ fnNode.setObject( fnNode.child( 0 ) );
+ }
+
+ MPlug whichRoadPlug = fnNode.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status )
+ {
+ //Get the intersection connected to this road and select all the road segs
+ //attached to it.
+ if ( whichRoadPlug.isConnected() )
+ {
+ //Get the road Locator;
+ MPlugArray plugs;
+ whichRoadPlug.connectedTo( plugs, false, true );
+
+ assert( plugs.length() > 0 );
+
+ //Get to road attached to the segment.
+ road = plugs[ 0 ].node();
+ }
+ else
+ {
+ MExt::DisplayWarning( "This road segment is not part of a road!" );
+ return false;
+ }
+ }
+ else
+ {
+ MExt::DisplayWarning( "A road segment must be selected!" );
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+//==============================================================================
+// GetRoadsFromSelectionList
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& road )
+//
+// Return: bool
+//
+//==============================================================================
+bool GetRoadsFromSelectionList( MObjectArray& roadArray )
+{
+ MStatus status;
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+
+ if ( selectList.length() <= 0 )
+ {
+ MExt::DisplayWarning( "At least one road segment must be selected!" );
+ return false;
+ }
+ else
+ {
+ unsigned int i;
+ for ( i = 0; i < selectList.length(); ++i )
+ {
+ MObject node;
+ selectList.getDependNode( i, node );
+ MFnDagNode fnNode( node );
+
+ if ( fnNode.typeName() == MString( RoadNode::stringId ) )
+ {
+ //this is a road node
+ roadArray.append( fnNode.object() );
+ }
+ else
+ {
+ //Test to make sure the selected item is a road segment.
+ MFn::Type type = fnNode.type();
+
+ if ( fnNode.typeName() == MString( "transform" ) )
+ {
+ //We want the child of this, not the transform.
+ fnNode.setObject( fnNode.child( 0 ) );
+ }
+
+ MPlug whichRoadPlug = fnNode.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status )
+ {
+ //Get the intersection connected to this road and select all the road segs
+ //attached to it.
+ if ( whichRoadPlug.isConnected() )
+ {
+ //Get the road Locator;
+ MPlugArray plugs;
+ whichRoadPlug.connectedTo( plugs, false, true );
+
+ assert( plugs.length() > 0 );
+
+ //Get to road attached to the segment.
+ roadArray.append( plugs[ 0 ].node() );
+ }
+ else
+ {
+ MExt::DisplayWarning( "This road segment: %s is not part of a road!", fnNode.name().asChar() );
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/commands/intersectioncommands.h b/tools/trackeditor/code/commands/intersectioncommands.h
new file mode 100644
index 0000000..f2a261b
--- /dev/null
+++ b/tools/trackeditor/code/commands/intersectioncommands.h
@@ -0,0 +1,60 @@
+#include "precompiled/PCH.h"
+
+#ifndef INTERSECTION_COMMANDS
+#define INTERSECTION_COMMANDS
+
+class CreateRoadCmd : public MPxCommand
+{
+public:
+ CreateRoadCmd() {};
+ ~CreateRoadCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class AddIntersectionToRoadCmd : public MPxCommand
+{
+public:
+ AddIntersectionToRoadCmd() {};
+ ~AddIntersectionToRoadCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class ShowRoadCmd : public MPxCommand
+{
+public:
+ ShowRoadCmd() {};
+ ~ShowRoadCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class DestroyRoadCmd : public MPxCommand
+{
+public:
+ DestroyRoadCmd() {};
+ ~DestroyRoadCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+
+
+//Global tool like thing.
+bool GetRoadFromSelectionList( MObject& road );
+bool GetRoadsFromSelectionList( MObjectArray& road );
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/commands/trackeditorcommands.cpp b/tools/trackeditor/code/commands/trackeditorcommands.cpp
new file mode 100644
index 0000000..29aeb76
--- /dev/null
+++ b/tools/trackeditor/code/commands/trackeditorcommands.cpp
@@ -0,0 +1,222 @@
+#include "precompiled/PCH.h"
+
+#include "trackeditorcommands.h"
+#include "main/trackeditor.h"
+#include "utility/mext.h"
+#include "main/constants.h"
+
+//TEStateChange
+const char* TEStateChangeCommand::stringId = "TE_StateChange";
+
+//==============================================================================
+// TEStateChangeCommand::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* TEStateChangeCommand::creator()
+{
+ return new TEStateChangeCommand();
+}
+
+//==============================================================================
+// TEStateChangeCommand::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus TEStateChangeCommand::doIt( const MArgList& args )
+{
+ assert( args.length() == 1 );
+
+ int arg;
+ args.get( 0, arg );
+
+ TrackEditor::SetEditMode( (TrackEditor::EditMode) arg );
+
+ return MStatus::kSuccess;
+}
+
+//TEGetSelectedVertexPosition
+
+const char* TEGetSelectedVertexPosition::stringId = "TE_GetSelectedVertexPosition";
+
+//==============================================================================
+// TEGetSelectedVertexPosition::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* TEGetSelectedVertexPosition::creator()
+{
+ return new TEGetSelectedVertexPosition();
+}
+
+//==============================================================================
+// TEGetSelectedVertexPosition::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus TEGetSelectedVertexPosition::doIt( const MArgList& args )
+{
+ MStatus status;
+ MDoubleArray returnVal( 3, 0 );
+
+ assert( args.length() == 1 ); //Only one arg.
+
+ MString argString;
+ args.get( 0, argString );
+
+ MSelectionList activeList;
+ MGlobal::getActiveSelectionList(activeList);
+
+ MItSelectionList iter( activeList, MFn::kMeshVertComponent, &status);
+
+ //We're only going to deal with the first selected item. Don't select more
+ //Than one please.
+
+ if ( !iter.isDone() )
+ {
+ MDagPath item;
+ MObject component;
+ iter.getDagPath( item, component );
+ // do something with it
+
+ MStatus isMeshIT;
+ MItMeshVertex mITVert( item , component, &isMeshIT );
+
+ if(isMeshIT == MS::kSuccess)
+ {
+ MPoint vertPos;
+ double x, y, z;
+
+ if ( argString == MString( "local" ) )
+ {
+ vertPos = mITVert.position( MSpace::kObject, &status );
+ x = vertPos[0];
+ y = vertPos[1];
+ z = vertPos[2];
+ }
+ else //"world"
+ {
+ vertPos = mITVert.position( MSpace::kWorld, &status );
+ x = vertPos[0];
+ y = vertPos[1];
+ z = vertPos[2];
+ }
+
+ returnVal[0] = x / TEConstants::Scale;
+ returnVal[1] = y / TEConstants::Scale;
+ returnVal[2] = z / TEConstants::Scale;
+
+ }
+
+ iter.next(); //This is to test if there are more verts than needed.
+ }
+ else
+ {
+ MExt::DisplayWarning("No vertices selected!");
+ }
+
+ if ( !iter.isDone() )
+ {
+ MExt::DisplayWarning("Too many vertices selected!");
+ }
+
+
+ MPxCommand::setResult( returnVal );
+
+ return MStatus::kSuccess;
+}
+
+
+//TEGetSelectedVertexIndex
+
+const char* TEGetSelectedVertexIndex::stringId = "TE_GetSelectedVertexIndex";
+
+//==============================================================================
+// TEGetSelectedVertexIndex::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* TEGetSelectedVertexIndex::creator()
+{
+ return new TEGetSelectedVertexIndex();
+}
+
+//==============================================================================
+// TEGetSelectedVertexIndex::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus TEGetSelectedVertexIndex::doIt( const MArgList& args )
+{
+ int returnVal = -1;
+
+ MStatus status;
+ MSelectionList activeList;
+ MGlobal::getActiveSelectionList(activeList);
+
+ MItSelectionList iter( activeList, MFn::kMeshVertComponent, &status);
+
+ //We're only going to deal with the first selected item. Don't select more
+ //Than one please.
+
+ if ( !iter.isDone() )
+ {
+ MDagPath item;
+ MObject component;
+ iter.getDagPath( item, component );
+ // do something with it
+
+ MStatus isMeshIT;
+ MItMeshVertex mITVert( item , component, &isMeshIT );
+
+ if(isMeshIT == MS::kSuccess)
+ {
+ returnVal = mITVert.index();
+ }
+
+ iter.next(); //This is to test if there are more verts than needed.
+ }
+ else
+ {
+ MExt::DisplayWarning("No vertices selected!");
+ }
+
+ if ( !iter.isDone() )
+ {
+ MExt::DisplayWarning("Too many vertices selected!");
+ }
+
+ MPxCommand::setResult( returnVal );
+
+ return MStatus::kSuccess;
+}
diff --git a/tools/trackeditor/code/commands/trackeditorcommands.h b/tools/trackeditor/code/commands/trackeditorcommands.h
new file mode 100644
index 0000000..990ffd7
--- /dev/null
+++ b/tools/trackeditor/code/commands/trackeditorcommands.h
@@ -0,0 +1,42 @@
+#include "precompiled/PCH.h"
+
+#ifndef TE_COMMANDS_H
+#define TE_COMMANDS_H
+
+class TEStateChangeCommand : public MPxCommand
+{
+public:
+ TEStateChangeCommand() {};
+ ~TEStateChangeCommand() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class TEGetSelectedVertexPosition : public MPxCommand
+{
+public:
+ TEGetSelectedVertexPosition() {};
+ ~TEGetSelectedVertexPosition() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class TEGetSelectedVertexIndex : public MPxCommand
+{
+public:
+ TEGetSelectedVertexIndex() {};
+ ~TEGetSelectedVertexIndex() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/commands/treelinecommand.cpp b/tools/trackeditor/code/commands/treelinecommand.cpp
new file mode 100644
index 0000000..25f22de
--- /dev/null
+++ b/tools/trackeditor/code/commands/treelinecommand.cpp
@@ -0,0 +1,323 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: SnapSelectedTreelines.cpp
+//
+// Description: Implement SnapSelectedTreelines
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+
+
+//========================================
+// Project Includes
+//========================================
+#include "commands/TreeLineCommand.h"
+#include "main/trackeditor.h"
+#include "nodes/treelineshapenode.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+const char* SnapSelectedTreelines::stringId = "TE_SnapSelectedTreelines";
+const char* ConvertTreelineToGeometry::stringId = "TE_ConvertTreelineToGeometry";
+const char* SetDeleteTreeline::stringId = "TE_SetDeleteTreeline";
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// SnapSelectedTreelines::SnapSelectedTreelines
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SnapSelectedTreelines::SnapSelectedTreelines()
+{
+}
+
+//==============================================================================
+// SnapSelectedTreelines::~SnapSelectedTreelines
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SnapSelectedTreelines::~SnapSelectedTreelines()
+{
+}
+
+//=============================================================================
+// SnapSelectedTreelines::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus SnapSelectedTreelines::doIt( const MArgList& args )
+{
+ //For each treeline in the selection list, call
+
+ MSelectionList selectionList;
+ MGlobal::getActiveSelectionList( selectionList );
+
+ MItSelectionList itSel( selectionList );
+
+ while ( !itSel.isDone() )
+ {
+ MObject obj;
+ itSel.getDependNode( obj );
+
+ Recurse( obj );
+
+ itSel.next();
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// SnapSelectedTreelines::Recurse
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& obj )
+//
+// Return: void
+//
+//=============================================================================
+void SnapSelectedTreelines::Recurse( MObject& obj )
+{
+ MStatus status;
+
+ MFnTransform FnTransform( obj, &status );
+
+ if ( status )
+ {
+ //This is a transform...
+
+ MFnDagNode fnDagNode( obj );
+
+ unsigned int i;
+ for ( i = 0; i < fnDagNode.childCount(); ++i )
+ {
+ Recurse( fnDagNode.child( i ) );
+ }
+ }
+ else
+ {
+ MFnDependencyNode fnDepNode( obj );
+
+ if ( fnDepNode.typeId() == TETreeLine::TreelineShapeNode::id )
+ {
+ TETreeLine::TreelineShapeNode::SnapTreeline( obj );
+ }
+
+ }
+}
+
+//*****************************************************************************
+//
+// ConvertTreelineToGeometry
+//
+//*****************************************************************************
+
+//=============================================================================
+// ConvertTreelineToGeometry::ConvertTreelineToGeometry
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: ConvertTreelineToGeometry
+//
+//=============================================================================
+ConvertTreelineToGeometry::ConvertTreelineToGeometry()
+{
+}
+
+//=============================================================================
+// ConvertTreelineToGeometry::~ConvertTreelineToGeometry
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: ConvertTreelineToGeometry
+//
+//=============================================================================
+ConvertTreelineToGeometry::~ConvertTreelineToGeometry()
+{
+}
+
+//=============================================================================
+// ConvertTreelineToGeometry::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus ConvertTreelineToGeometry::doIt( const MArgList& args )
+{
+ //For each treeline in the world, call
+
+ MSelectionList selectionList;
+ selectionList.clear();
+
+ MItDag itDag( MItDag::kDepthFirst );
+
+ while ( !itDag.isDone() )
+ {
+ MDagPath dagPath;
+ itDag.getPath( dagPath );
+
+ selectionList.add( dagPath );
+
+ itDag.next();
+ }
+
+ if ( selectionList.length() > 0 )
+ {
+
+ MItSelectionList itSel( selectionList );
+
+ while ( !itSel.isDone() )
+ {
+ MObject obj;
+ itSel.getDependNode( obj );
+
+ Recurse( obj );
+
+ itSel.next();
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// ConvertTreelineToGeometry::Recurse
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& obj )
+//
+// Return: void
+//
+//=============================================================================
+void ConvertTreelineToGeometry::Recurse( MObject& obj )
+{
+ MStatus status;
+
+/*
+ MFnTransform FnTransform( obj, &status );
+
+ if ( status )
+ {
+ //This is a transform...
+
+ MFnDagNode fnDagNode( obj );
+
+ unsigned int i;
+ for ( i = 0; i < fnDagNode.childCount(); ++i )
+ {
+ Recurse( fnDagNode.child( i ) );
+ }
+ }
+ else
+ {
+*/
+ MFnDependencyNode fnDepNode( obj );
+
+ if ( fnDepNode.typeId() == TETreeLine::TreelineShapeNode::id )
+ {
+ TETreeLine::TreelineShapeNode::ConvertToGeometry( obj );
+ }
+
+// }
+}
+
+//*****************************************************************************
+//
+// SetDeleteTreeline
+//
+//*****************************************************************************
+
+//=============================================================================
+// SetDeleteTreeline::SetDeleteTreeline
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: SetDeleteTreeline
+//
+//=============================================================================
+SetDeleteTreeline::SetDeleteTreeline()
+{
+}
+
+//=============================================================================
+// SetDeleteTreeline::~SetDeleteTreeline
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: SetDeleteTreeline
+//
+//=============================================================================
+SetDeleteTreeline::~SetDeleteTreeline()
+{
+}
+
+//=============================================================================
+// SetDeleteTreeline::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus SetDeleteTreeline::doIt( const MArgList& args )
+{
+ assert( args.length() == 1 );
+
+ bool del;
+ args.get( 0, del );
+
+ TrackEditor::SetDeleteTreelines( del );
+
+ return MStatus::kSuccess;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/trackeditor/code/commands/treelinecommand.h b/tools/trackeditor/code/commands/treelinecommand.h
new file mode 100644
index 0000000..1e556b6
--- /dev/null
+++ b/tools/trackeditor/code/commands/treelinecommand.h
@@ -0,0 +1,136 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: tetreelinecommand.h
+//
+// Description: Blahblahblah
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef TETREELINECOMMAND_H
+#define TETREELINECOMMAND_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class SnapSelectedTreelines : public MPxCommand
+{
+public:
+ SnapSelectedTreelines();
+ virtual ~SnapSelectedTreelines();
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+
+private:
+
+ void Recurse( MObject& obj );
+
+ //Prevent wasteful constructor creation.
+ SnapSelectedTreelines( const SnapSelectedTreelines& tetreelinecommand );
+ SnapSelectedTreelines& operator=( const SnapSelectedTreelines& tetreelinecommand );
+};
+
+class ConvertTreelineToGeometry : public MPxCommand
+{
+public:
+ ConvertTreelineToGeometry();
+ ~ConvertTreelineToGeometry();
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+
+private:
+ void Recurse( MObject& obj );
+
+ //Prevent wasteful constructor creation.
+ ConvertTreelineToGeometry( const ConvertTreelineToGeometry& tetreelinecommand );
+ ConvertTreelineToGeometry& operator=( const ConvertTreelineToGeometry& tetreelinecommand );
+};
+
+class SetDeleteTreeline : public MPxCommand
+{
+public:
+ SetDeleteTreeline();
+ ~SetDeleteTreeline();
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+
+private:
+
+ //Prevent wasteful constructor creation.
+ SetDeleteTreeline( const SetDeleteTreeline& tetreelinecommand );
+ SetDeleteTreeline& operator=( const SetDeleteTreeline& tetreelinecommand );
+};
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// SnapSelectedTreelines::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline void* SnapSelectedTreelines::creator()
+{
+ return new SnapSelectedTreelines();
+}
+
+//=============================================================================
+// ConvertTreelineToGeometry::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline void* ConvertTreelineToGeometry::creator()
+{
+ return new ConvertTreelineToGeometry();
+}
+
+//=============================================================================
+// SetDeleteTreeline::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline void* SetDeleteTreeline::creator()
+{
+ return new SetDeleteTreeline();
+}
+#endif //TETREELINECOMMAND_H
diff --git a/tools/trackeditor/code/constants/version.hpp b/tools/trackeditor/code/constants/version.hpp
new file mode 100644
index 0000000..bf88478
--- /dev/null
+++ b/tools/trackeditor/code/constants/version.hpp
@@ -0,0 +1,16 @@
+/*===========================================================================
+
+ File:: version.hpp
+
+ Copyright (c) %YEAR% Radical Entertainment, Inc. All rights reserved.
+
+===========================================================================*/
+
+#ifndef _VERSION_HPP
+#define _VERSION_HPP
+
+extern char* version;
+extern char* versioninfo[];
+
+#endif
+
diff --git a/tools/trackeditor/code/contexts/bvcontext.cpp b/tools/trackeditor/code/contexts/bvcontext.cpp
new file mode 100644
index 0000000..1a4e0a0
--- /dev/null
+++ b/tools/trackeditor/code/contexts/bvcontext.cpp
@@ -0,0 +1,721 @@
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+#include "bvcontext.h"
+#include "utility/Mext.h"
+#include "nodes/walllocator.h"
+#include "nodes/fenceline.h"
+#include "nodes/nu.h"
+#include "main/trackeditor.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+const char* BVContext::stringId = "BVContext";
+int BVContext::sLeftSide = WallLocatorNode::LEFT;
+const MString BVContext::DEFAULT_GROUP_NAME = "FenceLine";
+MObject BVContext::sCurrentGroup;
+
+
+const char* BVSplitCmd::stringId = "BVSplitSelected";
+
+//==============================================================================
+// BVContextCmd::BVContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: BVContextCmd
+//
+//==============================================================================
+BVContextCmd::BVContextCmd()
+{
+}
+
+//==============================================================================
+// BVContextCmd::~BVContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: BVContextCmd
+//
+//==============================================================================
+BVContextCmd::~BVContextCmd()
+{
+}
+
+//-----------------------------------------------------------------------------
+// c r e a t o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* BVContextCmd::creator()
+{
+ return new BVContextCmd();
+}
+
+//-----------------------------------------------------------------------------
+// m a k e O b j
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPxContext* BVContextCmd::makeObj()
+{
+ return new BVContext();
+}
+
+//==============================================================================
+// BVContext::BVContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: BVContext
+//
+//==============================================================================
+BVContext::BVContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 )
+{
+ SetHelpString();
+
+ setTitleString( "Bounding Volume Path Tool" );
+}
+
+//==============================================================================
+// BVContext::~BVContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: BVContext
+//
+//==============================================================================
+BVContext::~BVContext()
+{
+}
+
+//==============================================================================
+// BVContext::abortAction
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void BVContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//-----------------------------------------------------------------------------
+// c o m p l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void BVContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//-----------------------------------------------------------------------------
+// d e l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void BVContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//-----------------------------------------------------------------------------
+// d o D r a g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus BVContext::doDrag( MEvent& event )
+{
+
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( MOUSEDRAG );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o E n t e r R e g i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus BVContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o H o l d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus BVContext::doHold( MEvent& event )
+{
+ MStatus status = MS::kSuccess;
+ return status;
+}
+
+//-----------------------------------------------------------------------------
+// d o P r e s s
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus BVContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o R e l e a s e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus BVContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+ else if ( event.mouseButton() == MEvent::kMiddleMouse )
+ {
+ //Toggle the leftness...
+ sLeftSide = sLeftSide == WallLocatorNode::LEFT ? WallLocatorNode::RIGHT : WallLocatorNode::LEFT;
+
+ SetHelpString();
+ }
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O f f C l e a n u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void BVContext::toolOffCleanup()
+{
+ CloseLoop();
+ mPoints.clear();
+ sCurrentGroup = MObject::kNullObj;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O n S e t u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void BVContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+
+ mPoints.clear();
+ sCurrentGroup = MObject::kNullObj;
+}
+
+//-----------------------------------------------------------------------------
+//
+// P R I V A T E M E M B E R S
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// p r o c e s s S t a t e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void BVContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ }
+ break;
+
+ case BUTTONUP:
+ {
+ MObject newNode;
+ MObject nodeTransform;
+
+ MExt::CreateNode( newNode, nodeTransform, MString( WallLocatorNode::stringId ) );
+
+ NODE_UTIL::DisableAttributes( newNode );
+
+ MExt::Attr::Set( sLeftSide,
+ newNode,
+ WallLocatorNode::LEFTRIGHT_NAME_LONG );
+
+ //Set the position
+
+ MPoint vp( mXCurrent, mYCurrent, 0 );
+ MPoint wp;
+ MExt::ViewToWorldAtY( &wp, vp, 0 );
+ MExt::SetWorldPosition( wp, newNode );
+
+ AddPoint( newNode );
+ }
+ break;
+ case DELETED:
+ {
+ DeleteLast();
+ }
+ break;
+ case COMPLETED:
+ {
+ //Complete the loop and start a new one.
+ CloseLoop();
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//==============================================================================
+// BVContext::AddPoint
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject obj )
+//
+// Return: void
+//
+//==============================================================================
+void BVContext::AddPoint( MObject obj )
+{
+ MStatus status;
+ unsigned int size = mPoints.length();
+
+ if ( size )
+ {
+ MObject lastNode;
+
+ lastNode = mPoints[ size - 1 ];
+
+ if ( lastNode.isNull() )
+ {
+ //Someone has been deleting nodes.
+ MExt::DisplayError( "Someone has deleted something..." );
+ return;
+ }
+
+ MExt::Connect( lastNode, WallLocatorNode::NEXTNODE_NAME_LONG, obj, WallLocatorNode::PREVNODE_NAME_LONG );
+ }
+ else
+ {
+ //Starting a new group
+ MObject flT;
+ MString name( DEFAULT_GROUP_NAME );
+
+ MExt::CreateNode( sCurrentGroup, flT, MString( FenceLineNode::stringId ), &name );
+
+ //Parent this group to the main TrackEditor Node if it exists.
+ TrackEditor::AddChild( sCurrentGroup );
+ }
+
+ mPoints.append( obj );
+
+ //Add the point (wall) to the current fence
+ FenceLineNode::AddWall( sCurrentGroup, obj );
+}
+
+//==============================================================================
+// BVContext::DeleteLast
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void BVContext::DeleteLast()
+{
+ unsigned int size = mPoints.length();
+
+ if ( size )
+ {
+ MStatus status;
+
+ MObject obj = mPoints[ size - 1 ];
+ mPoints.remove( size - 1 );
+
+ MExt::DeleteNode( obj, true );
+ }
+
+ if ( mPoints.length() == 0 && !sCurrentGroup.isNull() )
+ {
+ //we deleted the last one.
+ //Remove the group object.
+ MExt::DeleteNode( sCurrentGroup, true );
+ }
+}
+
+//==============================================================================
+// BVContext::CloseLoop
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void BVContext::CloseLoop()
+{
+ unsigned int size = mPoints.length();
+
+ if ( size == 1 )
+ {
+ MExt::DisplayWarning( "There was only one point in the BV loop. It will be deleted." );
+
+ DeleteLast();
+ }
+ else if ( size == 2 )
+ {
+ MExt::DisplayWarning( "There were only two points in the BV loop. They will be deleted." );
+
+ DeleteLast();
+ DeleteLast();
+ }
+ else if ( size > 2 )
+ {
+ MObject lastNode, firstNode;
+ MStatus status;
+
+ lastNode = mPoints[ size - 1 ];
+ firstNode = mPoints[ 0 ];
+
+ MExt::Connect( lastNode, WallLocatorNode::NEXTNODE_NAME_LONG, firstNode, WallLocatorNode::PREVNODE_NAME_LONG );
+
+ //Clear the points list to start a new loop.
+ mPoints.clear();
+ sCurrentGroup;
+ }
+}
+
+//==============================================================================
+// BVContext::SetHelpString
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void BVContext::SetHelpString()
+{
+ mHelp = "Click to place nodes in the path.";
+
+ if ( sLeftSide )
+ {
+ mHelp += "LEFT-SIDED";
+ }
+ else
+ {
+ mHelp += "RIGHT-SIDED";
+ }
+
+ setHelpString( mHelp );
+
+}
+
+//SPLIT COMMAND
+//==============================================================================
+// BVSplitCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* BVSplitCmd::creator()
+{
+ return new BVSplitCmd();
+}
+
+//==============================================================================
+// BVSplitCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList &args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus BVSplitCmd::doIt( const MArgList &args )
+{
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.isEmpty() )
+ {
+ //Nothing to do.
+ return MS::kSuccess;
+ }
+
+ //Get the number of objects in the list.
+ unsigned int numObjs = selectionList.length();
+
+ MObject obj;
+ MFnDependencyNode fnNode;
+ MObjectArray objArray;
+
+ unsigned int i;
+ for ( i = 0; i < numObjs; ++i )
+ {
+ selectionList.getDependNode( i, obj );
+ fnNode.setObject( obj );
+
+ if ( fnNode.typeId() == WallLocatorNode::id )
+ {
+ //This is a wall locator, add it to the array.
+ objArray.append( obj );
+ }
+ else
+ {
+ //This could be a transform, let's test the child node.
+ MFnDagNode dagNode( obj );
+ if( dagNode.childCount() )
+ {
+ //Get the first child
+ MObject child = dagNode.child( 0 );
+
+ fnNode.setObject( child );
+ if ( fnNode.typeId() == WallLocatorNode::id )
+ {
+ //This is a wall locator, add it to the array.
+ objArray.append( child );
+ }
+ }
+ }
+ }
+
+ if ( objArray.length() <= 1 )
+ {
+ //Nothing to do.
+ return MS::kSuccess;
+ }
+
+ //For each object in the objArray that is connected to another, create a node in-between...
+ MStatus status;
+ MObject obj1, obj2;
+ MFnDependencyNode fnNode1, fnNode2;
+ MPlug nextPlug, prevPlug;
+
+ unsigned int j;
+ for ( i = 0; i < objArray.length() - 1; ++i )
+ {
+ for ( j = i + 1; j < objArray.length(); ++j )
+ {
+ //Check if i and j are connected.
+ obj1 = objArray[i];
+ obj2 = objArray[j];
+
+ fnNode1.setObject( obj1 );
+ fnNode2.setObject( obj2 );
+
+ //Compare obj1.next to obj2.prev
+ nextPlug = fnNode1.findPlug( WallLocatorNode::NEXTNODE_NAME_LONG, &status );
+ assert( status );
+ prevPlug = fnNode2.findPlug( WallLocatorNode::PREVNODE_NAME_LONG, &status );
+ assert( status );
+
+ if ( MExt::IsConnected( nextPlug, prevPlug ) )
+ {
+ //Split and connect these two objects.
+ Split( obj1, obj2 );
+ }
+ else
+ {
+ //Compare obj2.next to obj1.prev
+ nextPlug = fnNode2.findPlug( WallLocatorNode::NEXTNODE_NAME_LONG, &status );
+ assert( status );
+ prevPlug = fnNode1.findPlug( WallLocatorNode::PREVNODE_NAME_LONG, &status );
+ assert( status );
+
+ if ( MExt::IsConnected( nextPlug, prevPlug ) )
+ {
+ //Split and connect these two objects.
+ Split( obj2, obj1 );
+ }
+ }
+ }
+ }
+
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// BVSplitCmd::Split
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& node1, MObject& node2 )
+//
+// Return: void
+//
+//==============================================================================
+void BVSplitCmd::Split( MObject& node1, MObject& node2 )
+{
+ //Take node1 and node2, create a newNode between them and connect
+ /// node1.next -> newNode.prev and newNode.next -> node2.prev
+
+ //Disconnect the nodes.
+ MExt::DisconnectAll( node1, WallLocatorNode::NEXTNODE_NAME_LONG );
+
+ MObject newNode;
+ MObject nodeTransform;
+
+ MExt::CreateNode( newNode, nodeTransform, MString( WallLocatorNode::stringId ) );
+
+ NODE_UTIL::DisableAttributes( newNode );
+
+ //This will split based on one of the others.
+ int isLeft;
+ MExt::Attr::Get( &isLeft, node1, WallLocatorNode::LEFTRIGHT_NAME_LONG );
+
+ MExt::Attr::Set( !isLeft == WallLocatorNode::LEFT ? WallLocatorNode::RIGHT : WallLocatorNode::LEFT,
+ newNode,
+ WallLocatorNode::LEFTRIGHT_NAME_LONG );
+
+ MPoint newWP = MExt::GetWorldPositionBetween( node1, node2 );
+ //Lock the y to 0;
+ newWP[1] = 0;
+
+ MExt::SetWorldPosition( newWP, newNode );
+
+ //Connect the nodes in their new order.
+ MExt::Connect( node1, WallLocatorNode::NEXTNODE_NAME_LONG, newNode, WallLocatorNode::PREVNODE_NAME_LONG );
+ MExt::Connect( newNode, WallLocatorNode::NEXTNODE_NAME_LONG, node2, WallLocatorNode::PREVNODE_NAME_LONG );
+
+ //Make sure the node is parented properly...
+
+ MFnDagNode fnDagNode( node1 );
+ MObject parentT = fnDagNode.parent( 0 );
+
+ fnDagNode.setObject( parentT );
+ MObject groupT = fnDagNode.parent( 0 );
+
+ FenceLineNode::AddWall( groupT, newNode );
+}
+
diff --git a/tools/trackeditor/code/contexts/bvcontext.h b/tools/trackeditor/code/contexts/bvcontext.h
new file mode 100644
index 0000000..e444cd5
--- /dev/null
+++ b/tools/trackeditor/code/contexts/bvcontext.h
@@ -0,0 +1,98 @@
+#include "precompiled/PCH.h"
+
+#ifndef BVCONTEXT
+#define BVCONTEXT
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// B o u n d i n g v o l u m e C o n t e x t
+//
+//-----------------------------------------------------------------------------
+class BVContext : public MPxContext
+{
+ public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+
+ BVContext();
+ virtual ~BVContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& );
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& );
+ virtual MStatus doDrag( MEvent& );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+ static int sLeftSide;
+ static const MString DEFAULT_GROUP_NAME;
+ static MObject sCurrentGroup;
+
+ private:
+ void ProcessState( Stimulus stimulus );
+ void AddPoint( MObject obj );
+ void DeleteLast();
+ void CloseLoop();
+ void SetHelpString();
+
+ MObjectArray mPoints;
+ MString mHelp;
+
+ short mXCurrent, mYCurrent;
+};
+
+//-----------------------------------------------------------------------------
+//
+// B o u n d i n g v o l u m e C o n t e x t C m d
+//
+//-----------------------------------------------------------------------------
+class BVContextCmd : public MPxContextCommand
+{
+ public:
+ BVContextCmd();
+ virtual ~BVContextCmd();
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+class BVSplitCmd : public MPxCommand
+{
+public:
+ MStatus doIt( const MArgList& args );
+ static void* creator();
+
+ static const char* stringId;
+
+private:
+ void Split( MObject& node1, MObject& node2 );
+};
+
+#endif
diff --git a/tools/trackeditor/code/contexts/intersectioncontext.cpp b/tools/trackeditor/code/contexts/intersectioncontext.cpp
new file mode 100644
index 0000000..561d5bf
--- /dev/null
+++ b/tools/trackeditor/code/contexts/intersectioncontext.cpp
@@ -0,0 +1,478 @@
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <math.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+#include "intersectioncontext.h"
+#include "nodes/intersection.h"
+#include "utility/mext.h"
+#include "main/trackeditor.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+const short OFFSET = 10;
+const double SCALE_FACTOR = 0.002;
+
+const char* IntersectionContext::stringId = "IntersectionContext";
+
+//==============================================================================
+// IntersectionContextCmd::IntersectionContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: IntersectionContextCmd
+//
+//==============================================================================
+IntersectionContextCmd::IntersectionContextCmd()
+{
+}
+
+//==============================================================================
+// IntersectionContextCmd::~IntersectionContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: IntersectionContextCmd
+//
+//==============================================================================
+IntersectionContextCmd::~IntersectionContextCmd()
+{
+}
+
+//-----------------------------------------------------------------------------
+// c r e a t o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* IntersectionContextCmd::creator()
+{
+ return new IntersectionContextCmd();
+}
+
+//-----------------------------------------------------------------------------
+// m a k e O b j
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPxContext* IntersectionContextCmd::makeObj()
+{
+ return new IntersectionContext();
+}
+
+//==============================================================================
+// IntersectionContext::IntersectionContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: IntersectionContext
+//
+//==============================================================================
+IntersectionContext::IntersectionContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 ),
+ mIntersection( MObject::kNullObj ),
+ mIntersectionTransform( MObject::kNullObj )
+{
+ SetHelpString();
+
+ setTitleString( "Intersection Overlay Tool" );
+}
+
+//==============================================================================
+// IntersectionContext::~IntersectionContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: IntersectionContext
+//
+//==============================================================================
+IntersectionContext::~IntersectionContext()
+{
+}
+
+//==============================================================================
+// IntersectionContext::abortAction
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void IntersectionContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//-----------------------------------------------------------------------------
+// c o m p l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void IntersectionContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//-----------------------------------------------------------------------------
+// d e l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void IntersectionContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//-----------------------------------------------------------------------------
+// d o D r a g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus IntersectionContext::doDrag( MEvent& event )
+{
+
+ event.getPosition( mXDrag, mYDrag );
+ ProcessState( MOUSEDRAG );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o E n t e r R e g i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus IntersectionContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o H o l d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus IntersectionContext::doHold( MEvent& event )
+{
+ MStatus status = MS::kSuccess;
+ return status;
+}
+
+//-----------------------------------------------------------------------------
+// d o P r e s s
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus IntersectionContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o R e l e a s e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus IntersectionContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O f f C l e a n u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void IntersectionContext::toolOffCleanup()
+{
+ if ( mIntersectionTransform != MObject::kNullObj )
+ {
+ mIntersection = MObject::kNullObj;
+ mIntersectionTransform = MObject::kNullObj;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O n S e t u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void IntersectionContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+}
+
+//-----------------------------------------------------------------------------
+//
+// P R I V A T E M E M B E R S
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// p r o c e s s S t a t e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void IntersectionContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ InitIntersection();
+ }
+ break;
+ case MOUSEDRAG:
+ {
+ //Scale the intersection according to drag dist.
+ short diffX = mXCurrent - mXDrag;
+ short diffY = mYCurrent - mYDrag;
+
+ double dist = 25.0 + sqrt( ( diffX*diffX + diffY*diffY ) ) * SCALE_FACTOR;
+
+ double scaleFactor[3] = { dist, dist, dist };
+
+ MFnTransform fnTransform( mIntersectionTransform );
+
+ fnTransform.setScale( scaleFactor );
+ }
+ break;
+ case BUTTONUP:
+ case COMPLETED:
+ {
+ }
+ break;
+ case ABORTED:
+ {
+ if ( mIntersectionTransform != MObject::kNullObj )
+ {
+ mIntersection = MObject::kNullObj;
+ mIntersectionTransform = MObject::kNullObj;
+ }
+ }
+ break;
+ case DELETED:
+ {
+ if ( mIntersectionTransform != MObject::kNullObj )
+ {
+ MGlobal::deleteNode( mIntersection );
+ MGlobal::deleteNode( mIntersectionTransform );
+ mIntersection = MObject::kNullObj;
+ mIntersectionTransform = MObject::kNullObj;
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//==============================================================================
+// IntersectionContext::SetHelpString
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void IntersectionContext::SetHelpString()
+{
+ mHelp = "Click and drag to create intersection.";
+
+ setHelpString( mHelp );
+}
+
+//==============================================================================
+// IntersectionContext::InitIntersection
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void IntersectionContext::InitIntersection()
+{
+ //Get the mesh below the clicked point and find it's y height.
+ short xStart, xEnd, yStart, yEnd;
+
+ xStart = 0;
+ xEnd = M3dView::active3dView().portWidth();
+ yStart = M3dView::active3dView().portHeight();
+ yEnd = 0;
+
+ MGlobal::selectFromScreen( xStart,
+ yStart,
+ xEnd,
+ yEnd,
+ MGlobal::kReplaceList );
+
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.length() > 0 )
+ {
+ //Go through each selected object and see if the ray intersects it.
+ MItSelectionList selectIt( selectionList, MFn::kMesh );
+
+ MPoint nearClick, farClick;
+ M3dView activeView = M3dView::active3dView();
+ activeView.viewToWorld( mXCurrent, mYCurrent, nearClick, farClick );
+ MVector rayDir( MVector( farClick ) - MVector( nearClick ) );
+ MPointArray intersectPoints;
+ MDagPath objDag;
+
+ while ( !selectIt.isDone() )
+ {
+ selectIt.getDagPath( objDag );
+
+ MFnMesh mesh( objDag );
+
+ mesh.intersect( nearClick, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ if ( intersectPoints.length() > 0 )
+ {
+ MObject transform;
+ MExt::CreateNode( mIntersection,
+ mIntersectionTransform,
+ MString( IntersectionLocatorNode::stringId ) );
+
+ assert( !mIntersection.isNull() );
+
+ MExt::SetWorldPosition( intersectPoints[0], mIntersection );
+
+ MFnTransform fnTransform( mIntersectionTransform );
+
+ const double scale[3] = { 25.0, 25.0, 25.0 };
+ fnTransform.setScale( scale );
+
+
+ TrackEditor::AddChild( mIntersection );
+
+ break;
+ }
+
+ selectIt.next();
+ }
+ }
+
+ MGlobal::clearSelectionList();
+}
diff --git a/tools/trackeditor/code/contexts/intersectioncontext.h b/tools/trackeditor/code/contexts/intersectioncontext.h
new file mode 100644
index 0000000..b54edd9
--- /dev/null
+++ b/tools/trackeditor/code/contexts/intersectioncontext.h
@@ -0,0 +1,82 @@
+#include "precompiled/PCH.h"
+
+#ifndef INTERSECTION_CONTEXT
+#define INTERSECTION_CONTEXT
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// I n t e r s e c t i o n C o n t e x t
+//
+//-----------------------------------------------------------------------------
+class IntersectionContext : public MPxContext
+{
+ public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+
+ IntersectionContext();
+ virtual ~IntersectionContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& );
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& );
+ virtual MStatus doDrag( MEvent& );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+ private:
+ void ProcessState( Stimulus stimulus );
+ void SetHelpString();
+ void InitIntersection();
+
+ MString mHelp;
+
+ short mXCurrent, mYCurrent;
+ short mXDrag, mYDrag;
+ MObject mIntersection;
+ MObject mIntersectionTransform;
+};
+
+//-----------------------------------------------------------------------------
+//
+// I n t e r s e c t i o n C o n t e x t C m d
+//
+//-----------------------------------------------------------------------------
+class IntersectionContextCmd : public MPxContextCommand
+{
+ public:
+ IntersectionContextCmd();
+ virtual ~IntersectionContextCmd();
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+#endif
diff --git a/tools/trackeditor/code/contexts/ppcontext.cpp b/tools/trackeditor/code/contexts/ppcontext.cpp
new file mode 100644
index 0000000..0a2a84b
--- /dev/null
+++ b/tools/trackeditor/code/contexts/ppcontext.cpp
@@ -0,0 +1,717 @@
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+#include "ppcontext.h"
+#include "utility/Mext.h"
+#include "nodes/pedpath.h"
+#include "nodes/nu.h"
+#include "nodes/walllocator.h"
+#include "main/trackeditor.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+const char* PPContext::stringId = "PPContext";
+const MString PPContext::DEFAULT_GROUP_NAME = "PedPath";
+MObject PPContext::sCurrentGroup;
+
+
+const char* PPSplitCmd::stringId = "PPSplitSelected";
+
+//==============================================================================
+// PPContextCmd::PPContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PPContextCmd
+//
+//==============================================================================
+PPContextCmd::PPContextCmd()
+{
+}
+
+//==============================================================================
+// PPContextCmd::~PPContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PPContextCmd
+//
+//==============================================================================
+PPContextCmd::~PPContextCmd()
+{
+}
+
+//-----------------------------------------------------------------------------
+// c r e a t o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* PPContextCmd::creator()
+{
+ return new PPContextCmd();
+}
+
+//-----------------------------------------------------------------------------
+// m a k e O b j
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPxContext* PPContextCmd::makeObj()
+{
+ return new PPContext();
+}
+
+//==============================================================================
+// PPContext::PPContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PPContext
+//
+//==============================================================================
+PPContext::PPContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 )
+{
+ SetHelpString();
+
+ setTitleString( "Pedestrian Path Tool" );
+}
+
+//==============================================================================
+// PPContext::~PPContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PPContext
+//
+//==============================================================================
+PPContext::~PPContext()
+{
+}
+
+//==============================================================================
+// PPContext::abortAction
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void PPContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//-----------------------------------------------------------------------------
+// c o m p l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void PPContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//-----------------------------------------------------------------------------
+// d e l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void PPContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//-----------------------------------------------------------------------------
+// d o D r a g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus PPContext::doDrag( MEvent& event )
+{
+
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( MOUSEDRAG );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o E n t e r R e g i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus PPContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o H o l d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus PPContext::doHold( MEvent& event )
+{
+ MStatus status = MS::kSuccess;
+ return status;
+}
+
+//-----------------------------------------------------------------------------
+// d o P r e s s
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus PPContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o R e l e a s e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus PPContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O f f C l e a n u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void PPContext::toolOffCleanup()
+{
+ CloseLoop();
+ mPoints.clear();
+ sCurrentGroup = MObject::kNullObj;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O n S e t u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void PPContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+
+ mPoints.clear();
+ sCurrentGroup = MObject::kNullObj;
+}
+
+//-----------------------------------------------------------------------------
+//
+// P R I V A T E M E M B E R S
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// p r o c e s s S t a t e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void PPContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ }
+ break;
+
+ case BUTTONUP:
+ {
+ MObject newNode;
+ MObject nodeTransform;
+
+ MExt::CreateNode( newNode, nodeTransform, MString( WallLocatorNode::stringId ) );
+
+// NODE_UTIL::DisableAttributes( newNode, false );
+ MFnDagNode fnDagNode( newNode );
+
+ MObject parent = fnDagNode.parent( 0 );
+ MFnDependencyNode fnParent( parent );
+ MPlug spPlug = fnParent.findPlug( MString( "scale" ) );
+ spPlug.setLocked( true );
+
+ MPlug rpPlug = fnParent.findPlug( MString( "rotate" ) );
+ rpPlug.setLocked( true );
+
+
+ MExt::Attr::Set( WallLocatorNode::NONE,
+ newNode,
+ WallLocatorNode::LEFTRIGHT_NAME_LONG );
+
+ //Set the position
+ MPoint intersectPoint;
+ if ( !MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) )
+ {
+ //Put it at 0.
+ MPoint vp( mXCurrent, mYCurrent, 0 );
+ MExt::ViewToWorldAtY( &intersectPoint, vp, 0 ); //This is to y = 0
+ }
+
+// intersectPoint = intersectPoint / TEConstants::Scale;
+
+ MExt::SetWorldPosition( intersectPoint, newNode );
+
+ AddPoint( newNode );
+ }
+ break;
+ case DELETED:
+ {
+ DeleteLast();
+ }
+ break;
+ case COMPLETED:
+ {
+ //Complete the loop and start a new one.
+ CloseLoop();
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//==============================================================================
+// PPContext::AddPoint
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject obj )
+//
+// Return: void
+//
+//==============================================================================
+void PPContext::AddPoint( MObject obj )
+{
+ MStatus status;
+ unsigned int size = mPoints.length();
+
+ if ( size )
+ {
+ MObject lastNode;
+
+ lastNode = mPoints[ size - 1 ];
+
+ if ( lastNode.isNull() )
+ {
+ //Someone has been deleting nodes.
+ MExt::DisplayError( "Someone has deleted something..." );
+ return;
+ }
+
+ MExt::Connect( lastNode, WallLocatorNode::NEXTNODE_NAME_LONG, obj, WallLocatorNode::PREVNODE_NAME_LONG );
+ }
+ else
+ {
+ //Starting a new group
+ MObject flT;
+ MString name( DEFAULT_GROUP_NAME );
+
+ MExt::CreateNode( sCurrentGroup, flT, MString( PedPathNode::stringId ), &name );
+
+ //Parent this group to the main TrackEditor Node if it exists.
+ TrackEditor::AddChild( sCurrentGroup );
+ }
+
+ mPoints.append( obj );
+
+ //Add the point (wall) to the current fence
+ PedPathNode::AddWall( sCurrentGroup, obj );
+}
+
+//==============================================================================
+// PPContext::DeleteLast
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void PPContext::DeleteLast()
+{
+ unsigned int size = mPoints.length();
+
+ if ( size )
+ {
+ MStatus status;
+
+ MObject obj = mPoints[ size - 1 ];
+ mPoints.remove( size - 1 );
+
+ MExt::DeleteNode( obj, true );
+ }
+
+ if ( mPoints.length() == 0 && !sCurrentGroup.isNull() )
+ {
+ //we deleted the last one.
+ //Remove the group object.
+ MExt::DeleteNode( sCurrentGroup, true );
+ }
+}
+
+//==============================================================================
+// PPContext::CloseLoop
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void PPContext::CloseLoop()
+{
+ unsigned int size = mPoints.length();
+
+ if ( size == 1 )
+ {
+ MExt::DisplayWarning( "There was only one point in the PP loop. It will be deleted." );
+
+ DeleteLast();
+ }
+ else if ( size == 2 )
+ {
+ MExt::DisplayWarning( "There were only two points in the PP loop. They will be deleted." );
+
+ DeleteLast();
+ DeleteLast();
+ }
+ else if ( size > 2 )
+ {
+ MObject lastNode, firstNode;
+ MStatus status;
+
+ lastNode = mPoints[ size - 1 ];
+ firstNode = mPoints[ 0 ];
+
+ MExt::Connect( lastNode, WallLocatorNode::NEXTNODE_NAME_LONG, firstNode, WallLocatorNode::PREVNODE_NAME_LONG );
+
+ //Clear the points list to start a new loop.
+ mPoints.clear();
+ sCurrentGroup;
+ }
+}
+
+//==============================================================================
+// PPContext::SetHelpString
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void PPContext::SetHelpString()
+{
+ mHelp = "Click to place nodes in the path.";
+
+ setHelpString( mHelp );
+
+}
+
+//SPLIT COMMAND
+//==============================================================================
+// PPSplitCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* PPSplitCmd::creator()
+{
+ return new PPSplitCmd();
+}
+
+//==============================================================================
+// PPSplitCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList &args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus PPSplitCmd::doIt( const MArgList &args )
+{
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.isEmpty() )
+ {
+ //Nothing to do.
+ return MS::kSuccess;
+ }
+
+ //Get the number of objects in the list.
+ unsigned int numObjs = selectionList.length();
+
+ MObject obj;
+ MFnDependencyNode fnNode;
+ MObjectArray objArray;
+
+ unsigned int i;
+ for ( i = 0; i < numObjs; ++i )
+ {
+ selectionList.getDependNode( i, obj );
+ fnNode.setObject( obj );
+
+ if ( fnNode.typeId() == WallLocatorNode::id )
+ {
+ //This is a wall locator, add it to the array.
+ objArray.append( obj );
+ }
+ else
+ {
+ //This could be a transform, let's test the child node.
+ MFnDagNode dagNode( obj );
+ if( dagNode.childCount() )
+ {
+ //Get the first child
+ MObject child = dagNode.child( 0 );
+
+ fnNode.setObject( child );
+ if ( fnNode.typeId() == WallLocatorNode::id )
+ {
+ //This is a wall locator, add it to the array.
+ objArray.append( child );
+ }
+ }
+ }
+ }
+
+ if ( objArray.length() <= 1 )
+ {
+ //Nothing to do.
+ return MS::kSuccess;
+ }
+
+ //For each object in the objArray that is connected to another, create a node in-between...
+ MStatus status;
+ MObject obj1, obj2;
+ MFnDependencyNode fnNode1, fnNode2;
+ MPlug nextPlug, prevPlug;
+
+ unsigned int j;
+ for ( i = 0; i < objArray.length() - 1; ++i )
+ {
+ for ( j = i + 1; j < objArray.length(); ++j )
+ {
+ //Check if i and j are connected.
+ obj1 = objArray[i];
+ obj2 = objArray[j];
+
+ fnNode1.setObject( obj1 );
+ fnNode2.setObject( obj2 );
+
+ //Compare obj1.next to obj2.prev
+ nextPlug = fnNode1.findPlug( WallLocatorNode::NEXTNODE_NAME_LONG, &status );
+ assert( status );
+ prevPlug = fnNode2.findPlug( WallLocatorNode::PREVNODE_NAME_LONG, &status );
+ assert( status );
+
+ if ( MExt::IsConnected( nextPlug, prevPlug ) )
+ {
+ //Split and connect these two objects.
+ Split( obj1, obj2 );
+ }
+ else
+ {
+ //Compare obj2.next to obj1.prev
+ nextPlug = fnNode2.findPlug( WallLocatorNode::NEXTNODE_NAME_LONG, &status );
+ assert( status );
+ prevPlug = fnNode1.findPlug( WallLocatorNode::PREVNODE_NAME_LONG, &status );
+ assert( status );
+
+ if ( MExt::IsConnected( nextPlug, prevPlug ) )
+ {
+ //Split and connect these two objects.
+ Split( obj2, obj1 );
+ }
+ }
+ }
+ }
+
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// PPSplitCmd::Split
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& node1, MObject& node2 )
+//
+// Return: void
+//
+//==============================================================================
+void PPSplitCmd::Split( MObject& node1, MObject& node2 )
+{
+ //Take node1 and node2, create a newNode between them and connect
+ /// node1.next -> newNode.prev and newNode.next -> node2.prev
+
+ //Disconnect the nodes.
+ MExt::DisconnectAll( node1, WallLocatorNode::NEXTNODE_NAME_LONG );
+
+ MObject newNode;
+ MObject nodeTransform;
+
+ MExt::CreateNode( newNode, nodeTransform, MString( WallLocatorNode::stringId ) );
+
+ ///NODE_UTIL::DisableAttributes( newNode );
+
+ //This will split based on one of the others.
+ MExt::Attr::Set( WallLocatorNode::NONE,
+ newNode,
+ WallLocatorNode::LEFTRIGHT_NAME_LONG );
+
+ MPoint newWP = MExt::GetWorldPositionBetween( node1, node2 );
+ //Lock the y to 0;
+ newWP[1] = 0;
+
+ MExt::SetWorldPosition( newWP, newNode );
+
+ //Connect the nodes in their new order.
+ MExt::Connect( node1, WallLocatorNode::NEXTNODE_NAME_LONG, newNode, WallLocatorNode::PREVNODE_NAME_LONG );
+ MExt::Connect( newNode, WallLocatorNode::NEXTNODE_NAME_LONG, node2, WallLocatorNode::PREVNODE_NAME_LONG );
+
+ //Make sure the node is parented properly...
+
+ MFnDagNode fnDagNode( node1 );
+ MObject parentT = fnDagNode.parent( 0 );
+
+ fnDagNode.setObject( parentT );
+ MObject groupT = fnDagNode.parent( 0 );
+
+ PedPathNode::AddWall( groupT, newNode );
+}
+
diff --git a/tools/trackeditor/code/contexts/ppcontext.h b/tools/trackeditor/code/contexts/ppcontext.h
new file mode 100644
index 0000000..04e212d
--- /dev/null
+++ b/tools/trackeditor/code/contexts/ppcontext.h
@@ -0,0 +1,97 @@
+#include "precompiled/PCH.h"
+
+#ifndef PPCONTEXT
+#define PPCONTEXT
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// B o u n d i n g v o l u m e C o n t e x t
+//
+//-----------------------------------------------------------------------------
+class PPContext : public MPxContext
+{
+ public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+
+ PPContext();
+ virtual ~PPContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& );
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& );
+ virtual MStatus doDrag( MEvent& );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+ static const MString DEFAULT_GROUP_NAME;
+ static MObject sCurrentGroup;
+
+ private:
+ void ProcessState( Stimulus stimulus );
+ void AddPoint( MObject obj );
+ void DeleteLast();
+ void CloseLoop();
+ void SetHelpString();
+
+ MObjectArray mPoints;
+ MString mHelp;
+
+ short mXCurrent, mYCurrent;
+};
+
+//-----------------------------------------------------------------------------
+//
+// B o u n d i n g v o l u m e C o n t e x t C m d
+//
+//-----------------------------------------------------------------------------
+class PPContextCmd : public MPxContextCommand
+{
+ public:
+ PPContextCmd();
+ virtual ~PPContextCmd();
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+class PPSplitCmd : public MPxCommand
+{
+public:
+ MStatus doIt( const MArgList& args );
+ static void* creator();
+
+ static const char* stringId;
+
+private:
+ void Split( MObject& node1, MObject& node2 );
+};
+
+#endif
diff --git a/tools/trackeditor/code/contexts/treelinecontext.cpp b/tools/trackeditor/code/contexts/treelinecontext.cpp
new file mode 100644
index 0000000..5c5ba56
--- /dev/null
+++ b/tools/trackeditor/code/contexts/treelinecontext.cpp
@@ -0,0 +1,402 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: TreeLineContext.cpp
+//
+// Description: Implement TreeLineContext
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Project Includes
+//========================================
+#include "contexts/TreeLineContext.h"
+#include "utility/mext.h"
+#include "main/constants.h"
+#include "main/trackeditor.h"
+#include "nodes/treelineshapenode.h"
+
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+const char* TreeLineContext::stringId = "TreeLineContext";
+MObject TreeLineContext::mCurrentTreeLine;
+bool TreeLineContext::mWorking = false;
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// TreeLineContext::TreeLineContext
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+TreeLineContext::TreeLineContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 )
+{
+ SetHelpString();
+
+ setTitleString( "Ye Tree Line Tool" );
+
+}
+
+//==============================================================================
+// TreeLineContext::~TreeLineContext
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+TreeLineContext::~TreeLineContext()
+{
+}
+
+//=============================================================================
+// TreeLineContext::toolOnSetup
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& )
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+
+ mPoints.clear();
+ mWorking = false;
+ mCurrentTreeLine = MObject::kNullObj;
+}
+
+//=============================================================================
+// TreeLineContext::toolOffCleanup
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::toolOffCleanup()
+{
+ mPoints.clear();
+ mCurrentTreeLine = MObject::kNullObj;
+}
+
+//=============================================================================
+// TreeLineContext::doPress
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& event )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TreeLineContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TreeLineContext::doDrag
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& event )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TreeLineContext::doDrag( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( MOUSEDRAG );
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TreeLineContext::doRelease
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& event )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TreeLineContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TreeLineContext::doHold
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& event )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TreeLineContext::doHold( MEvent& event )
+{
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TreeLineContext::doEnterRegion
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MEvent& event )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TreeLineContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TreeLineContext::deleteAction
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//=============================================================================
+// TreeLineContext::completeAction
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//=============================================================================
+// TreeLineContext::abortAction
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// TreeLineContext::ProcessState
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( Stimulus stimulus )
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ }
+ break;
+
+ case BUTTONUP:
+ {
+ if ( !mWorking )
+ {
+ //Let's create our working Treeline!
+ MObject transform;
+ MString name( TETreeLine::TreelineShapeNode::stringId );
+ MExt::CreateNode( &mCurrentTreeLine,
+ &transform,
+ MString( TETreeLine::TreelineShapeNode::stringId ),
+ &name );
+ mWorking = true;
+
+ MFnTransform fnTransform( transform );
+ fnTransform.findPlug( MString("translate") ).setLocked( true );
+ fnTransform.findPlug( MString("rotate") ).setLocked( true );
+ fnTransform.findPlug( MString("scale") ).setLocked( true );
+
+ TrackEditor::AddChild( mCurrentTreeLine );
+ }
+
+ //Set the position
+ MPoint intersectPoint;
+ if ( !MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) )
+ {
+ //Put it at 0.
+ MPoint vp( mXCurrent, mYCurrent, 0 );
+ MExt::ViewToWorldAtY( &intersectPoint, vp, 0 ); //This is to y = 0
+ }
+
+ intersectPoint = intersectPoint / TEConstants::Scale;
+
+ MStatus status;
+ MFnDependencyNode fnDepNode( mCurrentTreeLine );
+
+ MPlug verticesPlug = fnDepNode.findPlug( TETreeLine::TreelineShapeNode::mControlPoints, &status );
+ assert( status );
+
+ unsigned int elementCount = verticesPlug.numElements();
+ MPlug vertex = verticesPlug.elementByLogicalIndex( elementCount, &status );
+ assert( status );
+
+ MPlug x = vertex.child( TETreeLine::TreelineShapeNode::mControlValueX, &status );
+ assert( status );
+
+ x.setValue( intersectPoint.x * TEConstants::Scale );
+
+ MPlug y = vertex.child( TETreeLine::TreelineShapeNode::mControlValueY, &status );
+ assert( status );
+ y.setValue( intersectPoint.y * TEConstants::Scale );
+
+ MPlug z = vertex.child( TETreeLine::TreelineShapeNode::mControlValueZ, &status );
+ assert( status );
+ z.setValue( intersectPoint.z * TEConstants::Scale );
+
+ MGlobal::select( mCurrentTreeLine, MGlobal::kReplaceList );
+ }
+ break;
+ case DELETED:
+ {
+ DeleteLast();
+ }
+ break;
+ case ABORTED:
+ case COMPLETED:
+ {
+ //Start new treeline
+ mWorking = false;
+ mCurrentTreeLine = MObject::kNullObj;
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//=============================================================================
+// TreeLineContext::AddPoint
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MPoint& point )
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::AddPoint( MPoint& point )
+{
+ mPoints.append( point );
+}
+
+//=============================================================================
+// TreeLineContext::DeleteLast
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::DeleteLast()
+{
+ unsigned int size = mPoints.length();
+
+ if ( size )
+ {
+ MStatus status;
+
+ mPoints.remove( size - 1 );
+ }
+}
+
+//=============================================================================
+// TreeLineContext::SetHelpString
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TreeLineContext::SetHelpString()
+{
+ mHelp = "Click to place vertices in the line.";
+
+ setHelpString( mHelp );
+}
diff --git a/tools/trackeditor/code/contexts/treelinecontext.h b/tools/trackeditor/code/contexts/treelinecontext.h
new file mode 100644
index 0000000..a9833b7
--- /dev/null
+++ b/tools/trackeditor/code/contexts/treelinecontext.h
@@ -0,0 +1,139 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: treelinecontext.h
+//
+// Description: Blahblahblah
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+#include "precompiled/PCH.h"
+
+#ifndef TREELINECONTEXT_H
+#define TREELINECONTEXT_H
+
+//========================================
+// Nested Includes
+//========================================
+
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class TreeLineContext : public MPxContext
+{
+public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+ TreeLineContext();
+ virtual ~TreeLineContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& event);
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& event);
+ virtual MStatus doDrag( MEvent& event );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+private:
+ void ProcessState( Stimulus stimulus );
+ void AddPoint( MPoint& point );
+ void DeleteLast();
+ void SetHelpString();
+
+ MPointArray mPoints;
+ MString mHelp;
+
+ static MObject mCurrentTreeLine;
+ static bool mWorking;
+
+ short mXCurrent, mYCurrent;
+
+private:
+
+ //Prevent wasteful constructor creation.
+ TreeLineContext( const TreeLineContext& treelinecontext );
+ TreeLineContext& operator=( const TreeLineContext& treelinecontext );
+};
+
+//******************************************************************************
+//
+// TreeLineContextCmd
+//
+//******************************************************************************
+
+class TreeLineContextCmd : public MPxContextCommand
+{
+ public:
+ TreeLineContextCmd() {};
+ virtual ~TreeLineContextCmd() {};
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// TreeLineContextCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline void* TreeLineContextCmd::creator()
+{
+ return new TreeLineContextCmd();
+}
+
+//=============================================================================
+// TreeLineContextCmd::makeObj
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MPxContext
+//
+//=============================================================================
+inline MPxContext* TreeLineContextCmd::makeObj()
+{
+ return new TreeLineContext();
+}
+
+
+#endif //TREELINECONTEXT_H
+
diff --git a/tools/trackeditor/code/main/constants.h b/tools/trackeditor/code/main/constants.h
new file mode 100644
index 0000000..b9bcc25
--- /dev/null
+++ b/tools/trackeditor/code/main/constants.h
@@ -0,0 +1,21 @@
+#ifndef TE_CONSTANTS
+#define TE_CONSTANTS
+
+namespace TEConstants
+{
+ const unsigned int TypeIDPrefix = 0x00040200;
+ const float Scale = 100.0f;
+
+ namespace NodeIDs
+ {
+ const unsigned int WallLocator = 0xc0;
+ const unsigned int FenceLine = 0xc1;
+ const unsigned int TileDisplay = 0xc2;
+ const unsigned int Intersection = 0xc3;
+ const unsigned int Road = 0xc4;
+ const unsigned int TreeLine = 0xc5;
+ const unsigned int PedPath = 0xc6;
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/main/pluginMain.cpp b/tools/trackeditor/code/main/pluginMain.cpp
new file mode 100644
index 0000000..190ea4d
--- /dev/null
+++ b/tools/trackeditor/code/main/pluginMain.cpp
@@ -0,0 +1,164 @@
+//
+// Copyright (C) 2002 Radical Entertainment
+//
+// File: pluginMain.cpp
+//
+// Author: Maya SDK Wizard
+//
+#include "precompiled/PCH.h"
+
+#include <maya/MFnPlugin.h>
+
+//This is a warning provided by the STL... It seems that toollib gets whacky when there
+//is other templates made... Sigh...
+#pragma warning(disable:4786)
+
+#include "pluginmain.h"
+#include "trackeditor.h"
+
+#include "utility/mayahandles.h"
+#include "utility/mext.h"
+
+//Nodes
+#include "nodes/walllocator.h"
+#include "nodes/fenceline.h"
+#include "nodes/tiledisplay.h"
+#include "nodes/intersection.h"
+#include "nodes/road.h"
+#include "nodes/treelineshapenode.h"
+#include "nodes/pedpath.h"
+
+//Contexts
+#include "contexts/bvcontext.h"
+#include "contexts/intersectioncontext.h"
+#include "contexts/treelinecontext.h"
+#include "contexts/ppcontext.h"
+
+//Commands
+#include "commands/export.h"
+#include "commands/trackeditorcommands.h"
+#include "commands/intersectioncommands.h"
+#include "commands/treelinecommand.h"
+
+
+TrackEditor* gTE = 0;
+
+MStatus initializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is loaded into Maya. It
+// registers all of the services that this plug-in provides with
+// Maya.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+
+
+ MayaHandles::SetHInstance( (void*)(MhInstPlugin) );
+
+ MFnPlugin plugin( obj, "Radical Entertainment", "4.0.1", "Any");
+
+ // Add plug-in feature registration here
+ //
+
+ //Register Nodes
+ REGISTER_LOCATOR( plugin, WallLocatorNode );
+ REGISTER_LOCATOR( plugin, FenceLineNode );
+ REGISTER_LOCATOR( plugin, TileDisplayNode );
+ REGISTER_LOCATOR( plugin, IntersectionLocatorNode );
+ REGISTER_LOCATOR( plugin, RoadNode );
+ REGISTER_LOCATOR( plugin, PedPathNode );
+
+ REGISTER_SHAPE( plugin, TETreeLine::TreelineShapeNode );
+
+ //Register Contexts
+ REGISTER_CONTEXT( plugin, BVContext );
+ REGISTER_CONTEXT( plugin, IntersectionContext );
+ REGISTER_CONTEXT( plugin, TreeLineContext );
+ REGISTER_CONTEXT( plugin, PPContext );
+
+ //Register Commands
+ REGISTER_COMMAND( plugin, PPSplitCmd );
+ REGISTER_COMMAND( plugin, BVSplitCmd );
+ REGISTER_COMMAND( plugin, ExportCommand );
+ REGISTER_COMMAND( plugin, TEStateChangeCommand );
+ REGISTER_COMMAND( plugin, TEGetSelectedVertexPosition );
+ REGISTER_COMMAND( plugin, TEGetSelectedVertexIndex );
+ REGISTER_COMMAND( plugin, CreateRoadCmd );
+ REGISTER_COMMAND( plugin, AddIntersectionToRoadCmd );
+ REGISTER_COMMAND( plugin, ShowRoadCmd );
+ REGISTER_COMMAND( plugin, DestroyRoadCmd );
+ REGISTER_COMMAND( plugin, SnapSelectedTreelines );
+ REGISTER_COMMAND( plugin, ConvertTreelineToGeometry );
+ REGISTER_COMMAND( plugin, SetDeleteTreeline );
+
+
+ //Create the TrackEditor.
+ gTE = new TrackEditor();
+
+ //Run any startup scripts.
+ MGlobal::sourceFile( MString( "te_main.mel" ) );
+
+ return status;
+}
+
+MStatus uninitializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is unloaded from Maya. It
+// deregisters all of the services that it was providing.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+ MFnPlugin plugin( obj );
+
+ // Add plug-in feature deregistration here
+ //
+
+ //Run any cleanup scripts.
+ MGlobal::sourceFile( MString( "te_cleanup.mel" ) );
+
+ if ( gTE )
+ {
+ delete gTE;
+ }
+
+ //Unregister Commands
+ DEREGISTER_COMMAND( plugin, SetDeleteTreeline );
+ DEREGISTER_COMMAND( plugin, ConvertTreelineToGeometry );
+ DEREGISTER_COMMAND( plugin, SnapSelectedTreelines );
+ DEREGISTER_COMMAND( plugin, DestroyRoadCmd );
+ DEREGISTER_COMMAND( plugin, ShowRoadCmd );
+ DEREGISTER_COMMAND( plugin, AddIntersectionToRoadCmd );
+ DEREGISTER_COMMAND( plugin, CreateRoadCmd );
+ DEREGISTER_COMMAND( plugin, TEGetSelectedVertexIndex );
+ DEREGISTER_COMMAND( plugin, TEGetSelectedVertexPosition );
+ DEREGISTER_COMMAND( plugin, TEStateChangeCommand );
+ DEREGISTER_COMMAND( plugin, ExportCommand );
+ DEREGISTER_COMMAND( plugin, BVSplitCmd );
+
+ //Unregister Contexts
+ DEREGISTER_CONTEXT( plugin, PPContext );
+ DEREGISTER_CONTEXT( plugin, TreeLineContext );
+ DEREGISTER_CONTEXT( plugin, IntersectionContext );
+ DEREGISTER_CONTEXT( plugin, BVContext );
+ DEREGISTER_CONTEXT( plugin, PPContext );
+
+ //Unregister Nodes
+ DEREGISTER_NODE( plugin, PedPathNode );
+ DEREGISTER_NODE( plugin, TETreeLine::TreelineShapeNode );
+ DEREGISTER_NODE( plugin, RoadNode );
+ DEREGISTER_NODE( plugin, IntersectionLocatorNode );
+ DEREGISTER_NODE( plugin, TileDisplayNode );
+ DEREGISTER_NODE( plugin, FenceLineNode );
+ DEREGISTER_NODE( plugin, WallLocatorNode );
+
+ return status;
+}
+
diff --git a/tools/trackeditor/code/main/pluginMain.h b/tools/trackeditor/code/main/pluginMain.h
new file mode 100644
index 0000000..7ed6ee6
--- /dev/null
+++ b/tools/trackeditor/code/main/pluginMain.h
@@ -0,0 +1,47 @@
+#include "precompiled/PCH.h"
+
+//----------------------------------------
+// MACROS
+//----------------------------------------
+
+#define REGISTER_COMMAND( p, c ) if ( ! ( ( p ).registerCommand( c##::stringId, \
+ c##::creator ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_CONTEXT( p, c ) if ( ! ( ( p ).registerContextCommand( c##::stringId, \
+ c##Cmd::creator ) \
+ ) \
+ ) return MS::kFailure
+
+
+#define REGISTER_LOCATOR( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize, \
+ MPxNode::kLocatorNode ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_NODE( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_SHAPE( p, n ) if ( ! ( ( p ).registerShape( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize, \
+ n##UI::creator ) \
+ ) \
+ ) return MS::kFailure
+
+#define DEREGISTER_COMMAND( p, c ) ( p ).deregisterCommand( c##::stringId )
+
+#define DEREGISTER_CONTEXT( p, c ) ( p ).deregisterContextCommand( c##::stringId )
+
+
+#define DEREGISTER_NODE( p, n ) ( p ).deregisterNode( n##::id )
+
diff --git a/tools/trackeditor/code/main/shapeconstants.h b/tools/trackeditor/code/main/shapeconstants.h
new file mode 100644
index 0000000..c6c777d
--- /dev/null
+++ b/tools/trackeditor/code/main/shapeconstants.h
@@ -0,0 +1,34 @@
+#ifndef SHAPE_CONSTANTS_H
+#define SHAPE_CONSTANTS_H
+
+#define LEAD_COLOR 1 // green
+#define ACTIVE_COLOR 1 // white
+#define ACTIVE_AFFECTED_COLOR 1 // purple
+#define DORMANT_COLOR 1 // blue
+#define HILITE_COLOR 1 // pale blue
+
+#define P3D_BILLBOARD_QUAD_ID 0x040260
+#define P3D_BILLBOARD_QUAD_GROUP_ID 0x040261
+#define MAYA_LAMBERT_ID 1380729165
+#define MAYA_PHONG_ID 1380993103
+#define MAYA_LAYERED_SHADER_ID 1280922195
+
+namespace TETreeLine
+{
+
+const float MIN_DISPLAY_SIZE=0.001f;
+
+enum {
+ WIREFRAME,
+ WIREFRAME_SHADED,
+ SMOOTH_SHADED,
+ FLAT_SHADED,
+ VERTICES,
+ LAST_TOKEN
+};
+
+}; //namespace TETreeLine
+
+
+#endif //SHAPE_CONSTANTS_H
+
diff --git a/tools/trackeditor/code/main/trackeditor.cpp b/tools/trackeditor/code/main/trackeditor.cpp
new file mode 100644
index 0000000..0b0ccc2
--- /dev/null
+++ b/tools/trackeditor/code/main/trackeditor.cpp
@@ -0,0 +1,350 @@
+#include "precompiled/PCH.h"
+
+#include "trackeditor.h"
+#include "utility/mext.h"
+
+#include "nodes/tiledisplay.h"
+#include "nodes/fenceline.h"
+#include "nodes/intersection.h"
+#include "nodes/walllocator.h"
+#include "nodes/road.h"
+#include "nodes/treelineshapenode.h"
+#include "nodes/pedpath.h"
+
+const char* TrackEditor::Name = "TrackEditorNode";
+TrackEditor::EditMode TrackEditor::sEditMode = TrackEditor::OFF;
+unsigned int TrackEditor::sNodeAddedbackID = 0;
+unsigned int TrackEditor::sWindowClosedCallbackID = 0;
+bool TrackEditor::sDeleteTreelines = true;
+
+
+//==============================================================================
+// TrackEditor::TrackEditor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TrackEditor
+//
+//==============================================================================
+TrackEditor::TrackEditor()
+{
+// sNodeAddedbackID = MDGMessage::addNodeAddedCallback ( NodeAddedCB,
+// MString( "surfaceShape" ) );
+};
+
+//==============================================================================
+// TrackEditor::~TrackEditor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TrackEditor
+//
+//==============================================================================
+TrackEditor::~TrackEditor()
+{
+ if ( sNodeAddedbackID )
+ {
+ MDGMessage::removeCallback( sNodeAddedbackID );
+ }
+
+ if ( sWindowClosedCallbackID )
+ {
+ MUiMessage::removeCallback( sWindowClosedCallbackID );
+ }
+
+ RemoveTileDisplayNode();
+};
+
+//==============================================================================
+// TrackEditor::Exists
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//==============================================================================
+bool TrackEditor::Exists()
+{
+ MDagPath pathToTrackEditor;
+ return MExt::FindDagNodeByName( &pathToTrackEditor, MString( TrackEditor::Name ) );
+}
+
+//==============================================================================
+// TrackEditor::AddChild
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& obj )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus TrackEditor::AddChild( MObject& obj )
+{
+ //Make sure this exists.
+ CreateTrackEditorNode();
+
+ MDagPath pathToTrackEditor;
+
+ bool good = false;
+
+ if ( MExt::FindDagNodeByName( &pathToTrackEditor, MString( TrackEditor::Name ) ) )
+ {
+ good = true;
+ }
+ else
+ {
+ MGlobal::sourceFile( MString( "te_setup.mel" ) );
+
+ if ( MExt::FindDagNodeByName( &pathToTrackEditor, MString( TrackEditor::Name ) ) )
+ {
+ good = true;
+ }
+ }
+
+ if ( good )
+ {
+ MFnDagNode fnDagNodeTE;
+
+ //Which type?
+ MFnDagNode fnDagNodeObj( obj );
+
+ if ( fnDagNodeObj.typeId() == FenceLineNode::id )
+ {
+ //This is a fenceline, parent to the "Fences" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString("Fences"), pathToTrackEditor.node() ) )
+ {
+ fnDagNodeTE.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted Terrain Edit nodes!!" );
+ }
+ }
+ if ( fnDagNodeObj.typeId() == PedPathNode::id )
+ {
+ //This is a ped path, parent to the "PedPaths" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString("PedPaths"), pathToTrackEditor.node() ) )
+ {
+ fnDagNodeTE.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted Terrain Edit nodes!!" );
+ }
+ }
+ else if ( fnDagNodeObj.typeId() == IntersectionLocatorNode::id )
+ {
+ //This is a fenceline, parent to the "Intersections" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString("Intersections"), pathToTrackEditor.node() ) )
+ {
+ fnDagNodeTE.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted Terrain Edit nodes!!" );
+ }
+ }
+ else if ( fnDagNodeObj.typeId() == RoadNode::id )
+ {
+ //This is a fenceline, parent to the "Roads" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString("Roads"), pathToTrackEditor.node() ) )
+ {
+ fnDagNodeTE.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted Terrain Edit nodes!!" );
+ }
+ }
+ else if ( fnDagNodeObj.typeId() == TETreeLine::TreelineShapeNode::id )
+ {
+ //This is a tree line, add to the "Treelines" node
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString("Treelines"), pathToTrackEditor.node() ) )
+ {
+ fnDagNodeTE.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted Terrain Edit nodes!!" );
+ }
+ }
+ else
+ {
+ fnDagNodeTE.setObject( pathToTrackEditor.node() );
+ }
+
+ MObject objT = fnDagNodeObj.parent( 0 );
+
+ return fnDagNodeTE.addChild( objT );
+ }
+
+ return MS::kFailure;
+}
+
+//Edit mode stuff.
+//==============================================================================
+// TrackEditor::GetEditMode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TrackEditor
+//
+//==============================================================================
+TrackEditor::EditMode TrackEditor::GetEditMode()
+{
+ //Test the track editor radio buttons for their state.
+
+ return sEditMode;
+};
+
+//==============================================================================
+// TrackEditor::SetEditMode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( TrackEditor::EditMode mode )
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::SetEditMode( TrackEditor::EditMode mode )
+{
+ //Setup whatever needs setting up for the given mode.
+ switch( mode )
+ {
+ case OFF:
+ {
+ RemoveTileDisplayNode();
+
+ MGlobal::executeCommand( MString("teCloseEditorWindow()") );
+ }
+ break;
+ case EDIT:
+ {
+ //Make sure this exists;
+ CreateTileDisplayNode();
+
+ MGlobal::executeCommand( MString("teOpenEditorWindow()") );
+
+ //We should register a callback for when the window is closed.
+ sWindowClosedCallbackID = MUiMessage::addUiDeletedCallback( MString( "TE_TileEditor" ), WindowClosedCB );
+ }
+ break;
+ case DISPLAY:
+ {
+ //Make sure this exists;
+ CreateTileDisplayNode();
+
+ MGlobal::executeCommand( MString("teCloseEditorWindow()") );
+ }
+ break;
+ default:
+ {
+ break;
+ }
+ }
+
+ sEditMode = mode;
+}
+
+//==============================================================================
+// TrackEditor::NodeAddedCB
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& node, void* data )
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::NodeAddedCB( MObject& node, void* data )
+{
+// assert( false );
+}
+
+//==============================================================================
+// TrackEditor::WindowClosedCB
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( void* data )
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::WindowClosedCB( void* data )
+{
+ SetEditMode( OFF );
+
+ MUiMessage::removeCallback( sWindowClosedCallbackID );
+}
+
+//==============================================================================
+// TrackEditor::CreateTrackEditorNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::CreateTrackEditorNode()
+{
+ MGlobal::executeCommand( "te_Create_TrackEditorNode()" );
+}
+
+//==============================================================================
+// TrackEditor::CreateTileDisplayNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::CreateTileDisplayNode()
+{
+ if ( !MExt::FindDagNodeByName( NULL, MString( TileDisplayNode::stringId ) ) )
+ {
+ MExt::CreateNode( 0, 0, MString( TileDisplayNode::stringId ) );
+ }
+}
+
+//==============================================================================
+// TrackEditor::RemoveTileDisplayNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TrackEditor::RemoveTileDisplayNode()
+{
+ MDagPath dagPath;
+
+ if ( MExt::FindDagNodeByName( &dagPath, MString( TileDisplayNode::stringId ) ) )
+ {
+ MFnDagNode fnDagNode( dagPath );
+
+ MExt::DeleteNode( fnDagNode.object(), true );
+ }
+}
+
diff --git a/tools/trackeditor/code/main/trackeditor.h b/tools/trackeditor/code/main/trackeditor.h
new file mode 100644
index 0000000..d48cba1
--- /dev/null
+++ b/tools/trackeditor/code/main/trackeditor.h
@@ -0,0 +1,85 @@
+#include "precompiled/PCH.h"
+
+#ifndef TRACK_EDITOR
+#define TRACK_EDITOR
+
+//This node exists as the top node of all the other TrackEditor types.
+//See te_setup.mel for more details of how this is a node.
+//There should only ever be one of these in the Hypergraph.
+
+//This is the place where options will be stored also.
+
+class TrackEditor
+{
+public:
+ TrackEditor();
+ ~TrackEditor();
+
+ static const char* Name;
+
+ static bool Exists();
+ static MStatus AddChild( MObject& obj );
+
+ //These are the Track Editing functions and state.
+ enum EditMode
+ {
+ OFF,
+ EDIT,
+ DISPLAY
+ };
+
+ static EditMode GetEditMode();
+
+ static void SetDeleteTreelines( bool del );
+ static bool GetDeleteTreelines();
+
+protected:
+
+ friend class TEStateChangeCommand;
+ static EditMode sEditMode;
+ static void SetEditMode( EditMode mode );
+
+ static bool sDeleteTreelines;
+
+private:
+ static unsigned int sNodeAddedbackID;
+ static unsigned int sWindowClosedCallbackID;
+
+ static void NodeAddedCB( MObject& node, void* data );
+ static void WindowClosedCB( void* data );
+ static void CreateTrackEditorNode();
+ static void CreateTileDisplayNode();
+ static void RemoveTileDisplayNode();
+};
+
+//=============================================================================
+// TrackEditor::SetDeleteTreelines
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( bool del )
+//
+// Return: void
+//
+//=============================================================================
+inline void TrackEditor::SetDeleteTreelines( bool del )
+{
+ sDeleteTreelines = del;
+}
+
+//=============================================================================
+// TrackEditor::GetDeleteTreelines
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+inline bool TrackEditor::GetDeleteTreelines()
+{
+ return sDeleteTreelines;
+}
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/NU.h b/tools/trackeditor/code/nodes/NU.h
new file mode 100644
index 0000000..d43db8f
--- /dev/null
+++ b/tools/trackeditor/code/nodes/NU.h
@@ -0,0 +1,34 @@
+#include "precompiled/PCH.h"
+
+#ifndef NODE_UTIL_H
+#define NODE_UTIL_H
+
+namespace NODE_UTIL
+{
+ inline void DisableAttributes( MObject& node, bool justY = true )
+ {
+ MFnDagNode fnDagNode( node );
+
+ MObject parent = fnDagNode.parent( 0 );
+ MFnDependencyNode fnParent( parent );
+
+ if ( justY )
+ {
+ MPlug ptyPlug = fnParent.findPlug( MString( "translateY" ) );
+ ptyPlug.setLocked( true );
+ }
+ else
+ {
+ MPlug ptPlug = fnParent.findPlug( MString( "translate" ) );
+ ptPlug.setLocked( true );
+ }
+
+ MPlug spPlug = fnParent.findPlug( MString( "scale" ) );
+ spPlug.setLocked( true );
+
+ MPlug rpPlug = fnParent.findPlug( MString( "rotate" ) );
+ rpPlug.setLocked( true );
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/fenceline.cpp b/tools/trackeditor/code/nodes/fenceline.cpp
new file mode 100644
index 0000000..87c8966
--- /dev/null
+++ b/tools/trackeditor/code/nodes/fenceline.cpp
@@ -0,0 +1,201 @@
+#include "fenceline.h"
+#include "walllocator.h"
+#include "utility/mext.h"
+
+#include <toollib.hpp>
+
+MTypeId FenceLineNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::FenceLine );
+const char* FenceLineNode::stringId = "FenceLine";
+
+//==============================================================================
+// FenceLineNode::FenceLineNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: FenceLineNode
+//
+//==============================================================================
+FenceLineNode::FenceLineNode() {}
+
+//==============================================================================
+// FenceLineNode::~FenceLineNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: FenceLineNode
+//
+//==============================================================================
+FenceLineNode::~FenceLineNode() {}
+
+//==============================================================================
+// FenceLineNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* FenceLineNode::creator()
+{
+ return new FenceLineNode();
+}
+
+//==============================================================================
+// FenceLineNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus FenceLineNode::initialize()
+{
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// FenceLineNode::postConstructor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void FenceLineNode::postConstructor()
+{
+ //No moving the fenceline.
+ MPlug lPlug( thisMObject(), localPosition );
+ lPlug.setLocked( true );
+
+ MPlug wPlug( thisMObject(), worldPosition );
+ wPlug.setLocked( true );
+}
+
+//This is how you export one of these.
+//==============================================================================
+// FenceLineNode::Export
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& fenceNode, tlHistory& history )
+//
+// Return: tlDataChunk
+//
+//==============================================================================
+tlDataChunk* FenceLineNode::Export( MObject& fenceNode, tlHistory& history )
+{
+ //This fenceline assumes that there are fences below it.
+ MFnDagNode fnNode( fenceNode );
+
+ if ( fnNode.typeId() == FenceLineNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlFenceLineChunk* fenceLine = new tlFenceLineChunk;
+
+ //Go through all it's children and add them to the chunk incrementing the
+ //count.
+
+ unsigned int childCount = 0;
+ MItDag dagIt( MItDag::kDepthFirst, MFn::kLocator );
+
+ MFnDagNode fnDag( fenceNode );
+ MObject fenceT = fnDag.parent( 0 );
+
+ dagIt.reset( fenceT );
+
+ while ( !dagIt.isDone() )
+ {
+ MFnDependencyNode fnNode( dagIt.item() );
+ MTypeId id = fnNode.typeId();
+
+ if ( id == WallLocatorNode::id )
+ {
+ //Export a wall locator;
+ tlDataChunk* newChunk = WallLocatorNode::Export( dagIt.item(), history );
+
+ //Append this to the fence line
+ fenceLine->AppendSubChunk( newChunk );
+
+ ++childCount;
+ }
+
+ dagIt.next();
+ }
+
+ if ( childCount )
+ {
+ fenceLine->SetNumWalls( childCount );
+ }
+ else
+ {
+ delete fenceLine;
+ return NULL;
+ }
+
+ return fenceLine;
+ }
+
+ assert( false );
+ return NULL;
+}
+
+//==============================================================================
+// FenceLineNode::AddWall
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& fenceLine, MObject& wall )
+//
+// Return: void
+//
+//==============================================================================
+void FenceLineNode::AddWall( MObject& fenceLine, MObject& wall )
+{
+ //Test to make sure the fenceLine passed in is an obj, not a transform.
+ MFnDagNode fnDag( fenceLine );
+ if ( fnDag.typeId() == FenceLineNode::id )
+ {
+ MExt::AddChild( fenceLine, wall );
+ }
+ else
+ {
+ if ( fenceLine.apiType() == MFn::kTransform )
+ {
+ //We need to find the FenceLine node that is the child of this transform.
+ unsigned int childCount = fnDag.childCount();
+
+ unsigned int i;
+
+ MObject child;
+ MFnDagNode fnDagChild;
+
+ for ( i = 0; i < childCount; ++i )
+ {
+ child = fnDag.child( i );
+
+ fnDagChild.setObject( child );
+
+ if ( fnDagChild.typeId() == FenceLineNode::id )
+ {
+ //This is the child.
+ MExt::AddChild( child, wall );
+ return;
+ }
+ }
+
+ MExt::DisplayError( "Tried to parent something strange to fenceLine" );
+ assert(false);
+ }
+ }
+}
+
diff --git a/tools/trackeditor/code/nodes/fenceline.h b/tools/trackeditor/code/nodes/fenceline.h
new file mode 100644
index 0000000..d174f13
--- /dev/null
+++ b/tools/trackeditor/code/nodes/fenceline.h
@@ -0,0 +1,30 @@
+#include "precompiled/PCH.h"
+
+
+#ifndef FENCELINE
+#define FENCELINE
+
+#include "main/constants.h"
+
+class tlDataChunk;
+
+class FenceLineNode : public MPxLocatorNode
+{
+public:
+ FenceLineNode();
+ ~FenceLineNode();
+
+ static void* creator();
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ static void AddWall( MObject& fenceLine, MObject& wall );
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& fenceNode, tlHistory& history );
+
+ static MTypeId id;
+ static const char* stringId;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/intersection.cpp b/tools/trackeditor/code/nodes/intersection.cpp
new file mode 100644
index 0000000..f3dce53
--- /dev/null
+++ b/tools/trackeditor/code/nodes/intersection.cpp
@@ -0,0 +1,213 @@
+#include "precompiled/PCH.h"
+
+#include "intersection.h"
+#include "main/constants.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "utility/transformmatrix.h"
+#include <toollib.hpp>
+
+
+MTypeId IntersectionLocatorNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::Intersection );
+const char* IntersectionLocatorNode::stringId = "IntersectionLocatorNode";
+
+//Attribute
+const char* IntersectionLocatorNode::TYPE_NAME_LONG = "IntersectionType";
+const char* IntersectionLocatorNode::TYPE_NAME_SHORT = "it";
+MObject IntersectionLocatorNode::mType;
+
+const char* IntersectionLocatorNode::ROAD_LONG = "Roads";
+const char* IntersectionLocatorNode::ROAD_SHORT = "R";
+MObject IntersectionLocatorNode::mRoads;
+
+
+const int IntersectionLocatorNode::ACTIVE_COLOUR = 13;
+const int IntersectionLocatorNode::INACTIVE_COLOUR = 22;
+const float IntersectionLocatorNode::SCALE = 1.0f * TEConstants::Scale;
+
+IntersectionLocatorNode::IntersectionLocatorNode() {};
+IntersectionLocatorNode::~IntersectionLocatorNode() {};
+
+//==============================================================================
+// IntersectionLocatorNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* IntersectionLocatorNode::creator()
+{
+ return new IntersectionLocatorNode();
+}
+
+//==============================================================================
+// IntersectionLocatorNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus IntersectionLocatorNode::initialize()
+{
+ MStatus status;
+ MFnTypedAttribute fnTyped;
+ MFnMessageAttribute fnMessage;
+
+ mType = fnTyped.create( TYPE_NAME_LONG, TYPE_NAME_SHORT, MFnData::kString, MObject::kNullObj, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mType ) );
+
+ mRoads = fnMessage.create( ROAD_LONG, ROAD_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mRoads ) );
+
+
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// IntersectionLocatorNode::postConstructor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void IntersectionLocatorNode::postConstructor()
+{
+}
+
+
+//==============================================================================
+// IntersectionLocatorNode::draw
+//==============================================================================
+// Description: Comment
+//
+// Parameters: draw( M3dView & view,
+// const MDagPath & path,
+// M3dView::DisplayStyle style,
+// M3dView::DisplayStatus status )
+//
+// Return: void
+//
+//==============================================================================
+void IntersectionLocatorNode::draw( M3dView & view,
+ const MDagPath & path,
+ M3dView::DisplayStyle style,
+ M3dView::DisplayStatus status )
+{
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ if ( status == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawI( TEConstants::Scale );
+ GLExt::drawSphere( SCALE );
+
+ glPopAttrib();
+ view.endGL();
+}
+
+//==============================================================================
+// IntersectionLocatorNode::Export
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& intersectionLocatorNode, tlHistory& history )
+//
+// Return: tlDataChunk
+//
+//==============================================================================
+tlDataChunk* IntersectionLocatorNode::Export( MObject& intersectionLocatorNode,
+ tlHistory& history )
+{
+ MFnDagNode fnNode( intersectionLocatorNode );
+
+ if ( fnNode.typeId() == IntersectionLocatorNode::id )
+ {
+ tlIntersectionChunk* intersectionChunk = new tlIntersectionChunk;
+
+ intersectionChunk->SetName( fnNode.name().asChar() );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, intersectionLocatorNode );
+
+ tlPoint point;
+ point[0] = thisPosition[0] / TEConstants::Scale;
+ point[1] = thisPosition[1] / TEConstants::Scale;
+ point[2] = -thisPosition[2] / TEConstants::Scale; //Maya vs. P3D...
+
+ intersectionChunk->SetCentre( rmt::Vector( point ) );
+
+ //GetScale...
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ double scaleX;
+ fnTransform.findPlug( MString( "sx" ) ).getValue( scaleX );
+
+ intersectionChunk->SetRadius( (float)scaleX );
+
+ MPlug typePlug = fnNode.findPlug( mType );
+ MString type;
+ typePlug.getValue( type );
+
+ if ( MString("NoStop") == type )
+ {
+ intersectionChunk->SetType( 0 );
+ }
+ else if ( MString("NWay") == type )
+ {
+ intersectionChunk->SetType( 1 );
+ }
+ else if ( MString("FourWay") == type )
+ {
+ intersectionChunk->SetType( 2 );
+ }
+ else if ( MString("NoStopN") == type )
+ {
+ intersectionChunk->SetType( 3 );
+ }
+ else //if ( MString("NWay") == type )
+ {
+ intersectionChunk->SetType( 4 );
+ }
+
+
+ return intersectionChunk;
+ }
+
+ assert( false );
+ return NULL;
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/intersection.h b/tools/trackeditor/code/nodes/intersection.h
new file mode 100644
index 0000000..fade595
--- /dev/null
+++ b/tools/trackeditor/code/nodes/intersection.h
@@ -0,0 +1,48 @@
+#include "precompiled/PCH.h"
+
+#ifndef INTERSECTION_LOCATOR
+#define INTERSECTION_LOCATOR
+
+
+#include "main/constants.h"
+
+class tlDataChunk;
+
+class IntersectionLocatorNode : public MPxLocatorNode
+{
+public:
+ IntersectionLocatorNode();
+ ~IntersectionLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& intersectionLocatorNode, tlHistory& history );
+
+ static const char* TYPE_NAME_LONG;
+ static const char* TYPE_NAME_SHORT;
+ static MObject mType;
+
+ static const char* ROAD_LONG;
+ static const char* ROAD_SHORT;
+ static MObject mRoads; //This is an out message to all the roads this intersection connects.
+
+ static MTypeId id;
+ static const char* stringId;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/pedpath.cpp b/tools/trackeditor/code/nodes/pedpath.cpp
new file mode 100644
index 0000000..682f004
--- /dev/null
+++ b/tools/trackeditor/code/nodes/pedpath.cpp
@@ -0,0 +1,271 @@
+#include "pedpath.h"
+#include "walllocator.h"
+#include "utility/mext.h"
+
+#include <toollib.hpp>
+
+MTypeId PedPathNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::PedPath );
+const char* PedPathNode::stringId = "PedPath";
+
+//==============================================================================
+// PedPathNode::PedPathNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PedPathNode
+//
+//==============================================================================
+PedPathNode::PedPathNode() {}
+
+//==============================================================================
+// PedPathNode::~PedPathNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: PedPathNode
+//
+//==============================================================================
+PedPathNode::~PedPathNode() {}
+
+//==============================================================================
+// PedPathNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* PedPathNode::creator()
+{
+ return new PedPathNode();
+}
+
+//==============================================================================
+// PedPathNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus PedPathNode::initialize()
+{
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// PedPathNode::postConstructor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void PedPathNode::postConstructor()
+{
+ //No moving the pedpath.
+ MPlug lPlug( thisMObject(), localPosition );
+ lPlug.setLocked( true );
+
+ MPlug wPlug( thisMObject(), worldPosition );
+ wPlug.setLocked( true );
+}
+
+//This is how you export one of these.
+//==============================================================================
+// PedPathNode::Export
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& pedNode, tlHistory& history )
+//
+// Return: tlDataChunk
+//
+//==============================================================================
+tlDataChunk* PedPathNode::Export( MObject& pedNode, tlHistory& history )
+{
+ //This fenceline assumes that there are fences below it.
+ MFnDagNode fnNode( pedNode );
+
+ if ( fnNode.typeId() == PedPathNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlPedpathChunk* pedPath = new tlPedpathChunk;
+
+ //Go through all it's children and add them to the chunk incrementing the
+ //count.
+
+ unsigned int childCount = 0;
+ MItDag dagIt( MItDag::kDepthFirst, MFn::kLocator );
+
+ MFnDagNode fnDag( pedNode );
+ MObject fenceT = fnDag.parent( 0 );
+
+ dagIt.reset( fenceT );
+
+ tlDataChunk tempChunk;
+
+ while ( !dagIt.isDone() )
+ {
+ MFnDependencyNode fnNode( dagIt.item() );
+ MTypeId id = fnNode.typeId();
+
+ if ( id == WallLocatorNode::id )
+ {
+ //Export a wall locator;
+ tlWallChunk* newChunk = reinterpret_cast<tlWallChunk*>(WallLocatorNode::Export( dagIt.item(), history ));
+
+ //Append this to the fence line
+ tempChunk.AppendSubChunk( newChunk );
+
+ ++childCount;
+ }
+
+ dagIt.next();
+ }
+
+ if ( childCount )
+ {
+ tlPoint* points = new tlPoint[childCount + 1];
+
+ unsigned int i;
+// for ( i = 0; i < tempChunk.SubChunkCount(); i++ )
+// {
+// points[i] = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( i ))->GetStart();
+//
+// if ( i == tempChunk.SubChunkCount() - 1 )
+// {
+// points[childCount] = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( i ))->GetEnd();
+// }
+// }
+
+ //Okay, we need to order the points... If there was a split, the points will
+ //be badly ordered.
+ points[0] = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( 0 ))->GetStart(); //First point is always good.
+
+ //This is the testing point for the loop below.
+ tlPoint testPoint = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( 0 ))->GetEnd();
+ tempChunk.RemoveSubChunk( 0 );
+
+ unsigned int remainingChunks = childCount - 1;
+ unsigned int foundCount = 1;
+
+
+ while ( foundCount < childCount )
+ {
+ bool found = false;
+ unsigned int chunkIndex = 0;
+ for ( i = 0; i < remainingChunks; ++i )
+ {
+ if ( !found && reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( i ))->GetStart() == testPoint )
+ {
+ points[foundCount] = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( i ))->GetStart();
+ found = true;
+ foundCount++;
+
+ //heheh
+ if ( foundCount == childCount )
+ {
+ points[foundCount] = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( i ))->GetEnd();
+ foundCount++;
+ }
+
+ chunkIndex = i;
+ }
+ }
+
+ if ( found )
+ {
+ testPoint = reinterpret_cast<tlWallChunk*>(tempChunk.GetSubChunk( chunkIndex ))->GetEnd();
+
+ tempChunk.RemoveSubChunk( chunkIndex );
+ remainingChunks--;
+ }
+ else
+ {
+ MExt::DisplayError("WHOA! Big error, get Cary!!!! Looks like ped paths are screwy..");
+ break;
+ }
+ }
+
+
+
+ pedPath->SetPoints( points, childCount + 1 );
+ pedPath->SetNumPoints( childCount + 1 );
+
+ delete[] points;
+ points = NULL;
+ }
+ else
+ {
+ delete pedPath;
+ return NULL;
+ }
+
+ return pedPath;
+ }
+
+ assert( false );
+ return NULL;
+}
+
+//==============================================================================
+// PedPathNode::AddWall
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& pedPath, MObject& wall )
+//
+// Return: void
+//
+//==============================================================================
+void PedPathNode::AddWall( MObject& pedPath, MObject& wall )
+{
+ //Test to make sure the fenceLine passed in is an obj, not a transform.
+ MFnDagNode fnDag( pedPath );
+ if ( fnDag.typeId() == PedPathNode::id )
+ {
+ MExt::AddChild( pedPath, wall );
+ }
+ else
+ {
+ if ( pedPath.apiType() == MFn::kTransform )
+ {
+ //We need to find the FenceLine node that is the child of this transform.
+ unsigned int childCount = fnDag.childCount();
+
+ unsigned int i;
+
+ MObject child;
+ MFnDagNode fnDagChild;
+
+ for ( i = 0; i < childCount; ++i )
+ {
+ child = fnDag.child( i );
+
+ fnDagChild.setObject( child );
+
+ if ( fnDagChild.typeId() == PedPathNode::id )
+ {
+ //This is the child.
+ MExt::AddChild( child, wall );
+ return;
+ }
+ }
+
+ MExt::DisplayError( "Tried to parent something strange to pedPath" );
+ assert(false);
+ }
+ }
+}
+
diff --git a/tools/trackeditor/code/nodes/pedpath.h b/tools/trackeditor/code/nodes/pedpath.h
new file mode 100644
index 0000000..be8bf48
--- /dev/null
+++ b/tools/trackeditor/code/nodes/pedpath.h
@@ -0,0 +1,30 @@
+#include "precompiled/PCH.h"
+
+
+#ifndef PED_PATH
+#define PED_PATH
+
+#include "main/constants.h"
+
+class tlDataChunk;
+
+class PedPathNode : public MPxLocatorNode
+{
+public:
+ PedPathNode();
+ ~PedPathNode();
+
+ static void* creator();
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ static void AddWall( MObject& fenceLine, MObject& wall );
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& fenceNode, tlHistory& history );
+
+ static MTypeId id;
+ static const char* stringId;
+};
+
+#endif //PED_PATH \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/road.cpp b/tools/trackeditor/code/nodes/road.cpp
new file mode 100644
index 0000000..c414d84
--- /dev/null
+++ b/tools/trackeditor/code/nodes/road.cpp
@@ -0,0 +1,409 @@
+#include "road.h"
+#include "utility/mext.h"
+#include "utility/transformmatrix.h"
+#include <toollib.hpp>
+
+const tlPoint MVectorTotlPoint( const MVector& vector )
+{
+ tlPoint point;
+ point[0] = vector[0];
+ point[1] = vector[1];
+ point[2] = vector[2];
+
+ return point;
+}
+
+MTypeId RoadNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::Road );
+const char* RoadNode::stringId = "RoadNode";
+
+const char* RoadNode::ROAD_SEG_NAME_SHORT = "RoadSegments";
+const char* RoadNode::ROAD_SEG_NAME_LONG = "rs";
+MObject RoadNode::mRoadSegments;
+
+const char* RoadNode::INTERSECTION_START_SHORT = "is";
+const char* RoadNode::INTERSECTION_START_LONG = "IntersectionStart";
+MObject RoadNode::mIntersectionStart;
+
+const char* RoadNode::INTERSECTION_END_SHORT = "ie";
+const char* RoadNode::INTERSECTION_END_LONG = "IntersectionEnd";
+MObject RoadNode::mIntersectionEnd;
+
+const char* RoadNode::DENSITY_SHORT = "den";
+const char* RoadNode::DENSITY_LONG = "density";
+MObject RoadNode::mDensity;
+
+const char* RoadNode::SPEED_SHORT = "spd";
+const char* RoadNode::SPEED_LONG = "speed";
+MObject RoadNode::mSpeed;
+
+const char* RoadNode::DIFF_SHORT = "diff";
+const char* RoadNode::DIFF_LONG = "difficulty";
+MObject RoadNode::mDiff;
+
+const char* RoadNode::SHORTCUT_SHORT = "shct";
+const char* RoadNode::SHORTCUT_LONG = "shortCut";
+MObject RoadNode::mShortcut;
+
+
+
+//==============================================================================
+// RoadNode::RoadNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: RoadNode
+//
+//==============================================================================
+RoadNode::RoadNode() {}
+
+//==============================================================================
+// RoadNode::~RoadNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: RoadNode
+//
+//==============================================================================
+RoadNode::~RoadNode() {}
+
+//==============================================================================
+// RoadNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* RoadNode::creator()
+{
+ return new RoadNode();
+}
+
+//==============================================================================
+// RoadNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus RoadNode::initialize()
+{
+ MStatus status;
+ MFnMessageAttribute fnMessage;
+
+ mRoadSegments = fnMessage.create( ROAD_SEG_NAME_LONG, ROAD_SEG_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mRoadSegments ) );
+
+ mIntersectionStart = fnMessage.create( INTERSECTION_START_LONG, INTERSECTION_START_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mIntersectionStart ) );
+
+ mIntersectionEnd = fnMessage.create( INTERSECTION_END_LONG, INTERSECTION_END_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mIntersectionEnd ) );
+
+ MFnNumericAttribute fnNumeric;
+ mDensity = fnNumeric.create( DENSITY_LONG, DENSITY_SHORT, MFnNumericData::kInt, 5, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mDensity ) );
+
+ mSpeed = fnNumeric.create( SPEED_LONG, SPEED_SHORT, MFnNumericData::kInt, 50, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mSpeed ) );
+
+ mShortcut = fnNumeric.create( SHORTCUT_LONG, SHORTCUT_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mShortcut ) );
+
+ mDiff = fnNumeric.create( DIFF_LONG, DIFF_SHORT, MFnNumericData::kInt, 0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnNumeric.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mDiff ) );
+
+
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// RoadNode::postConstructor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void RoadNode::postConstructor()
+{
+ //No moving the road.
+ MPlug lPlug( thisMObject(), localPosition );
+ lPlug.setLocked( true );
+
+ MPlug wPlug( thisMObject(), worldPosition );
+ wPlug.setLocked( true );
+}
+
+//This is how you export one of these.
+//=============================================================================
+// RoadNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& roadNode, tlHistory& history, tlDataChunk* outChunk )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* RoadNode::Export( MObject& roadNode, tlHistory& history, tlDataChunk* outChunk ) //I think this is hackish.
+{
+ //This fenceline assumes that there are fences below it.
+ MFnDagNode fnNode( roadNode );
+
+ if ( fnNode.typeId() == RoadNode::id )
+ {
+ MFnDependencyNode fnTempNode;
+
+ tlRoadChunk* roadChunk = new tlRoadChunk;
+
+ roadChunk->SetName( fnNode.name().asChar() );
+ roadChunk->SetType( 0 );
+
+ //Get the intersections.
+
+ //START
+ MPlug intersectionPlug = fnNode.findPlug( mIntersectionStart );
+ MPlugArray source, dest;
+ MExt::ResolveConnections( &source, &dest, intersectionPlug, AS_SOURCE );
+
+ if ( dest.length() == 0 )
+ {
+ MExt::DisplayError( "ERROR: Road %s has no start intersection!", fnNode.name().asChar() );
+ delete roadChunk;
+ return NULL;
+ }
+
+ fnTempNode.setObject( dest[0].node() );
+ roadChunk->SetStartIntersection( fnTempNode.name().asChar() );
+
+ //END
+ intersectionPlug = fnNode.findPlug( mIntersectionEnd );
+ MExt::ResolveConnections( &source, &dest, intersectionPlug, AS_SOURCE );
+
+ if ( dest.length() == 0 )
+ {
+ MExt::DisplayError( "ERROR: Road %s has no end intersection!", fnNode.name().asChar() );
+ delete roadChunk;
+ return NULL;
+ }
+
+ fnTempNode.setObject( dest[0].node() );
+ roadChunk->SetEndIntersection( fnTempNode.name().asChar() );
+
+ int density;
+ fnNode.findPlug( mDensity ).getValue( density );
+ roadChunk->SetDensity( density );
+
+ int speed;
+ fnNode.findPlug( mSpeed ).getValue( speed );
+ if ( speed > 255 || speed < 0 )
+ {
+ speed = 255; //No need to mask, but what the hell.
+ }
+
+ int diff;
+ fnNode.findPlug( mDiff ).getValue( diff );
+ if ( diff > 255 || diff < 0 )
+ {
+ diff = 255;
+ }
+
+ bool sc;
+ fnNode.findPlug( mShortcut ).getValue( sc );
+
+
+ //This works differently now.
+ //8 bits - speed
+ //8 bits - difficulty level
+ //1 bit - id Short cut
+ //15 bits - saved for later
+ const int SPEED_MASK = 0x000000FF;
+ const int DIFFIC_MASK = 0x0000FF00;
+ const int SC_MASK = 0x00010000;
+
+ roadChunk->SetSpeed( speed | ( diff << 8 ) | ( sc ? SC_MASK : 0 ) );
+
+ //New set all the road segment chunks.
+ MPlug roadSegPlug = fnNode.findPlug( mRoadSegments );
+ MExt::ResolveConnections( &source, &dest, roadSegPlug, AS_DEST );
+
+ MDagPath dagPath;
+ MPlug tempPlug;
+ tlRoadSegmentChunk* roadSegChunk = NULL;
+ tlRoadSegmentDataChunk* roadSegDataChunk = NULL;
+ unsigned int i;
+ for ( i = 0; i < source.length(); ++i )
+ {
+ //Create new tlRoadSegmentChunks
+ roadSegChunk = new tlRoadSegmentChunk;
+ roadSegDataChunk = new tlRoadSegmentDataChunk;
+
+ fnTempNode.setObject( source[ i ].node() );
+ MExt::FindDagNodeByName( &dagPath, fnTempNode.name() );
+ MFnMesh fnMesh( dagPath );
+
+ roadSegChunk->SetName( fnMesh.name().asChar() );
+ roadSegChunk->SetRoadSegmentData( fnMesh.name().asChar() );
+ roadSegDataChunk->SetName( fnMesh.name().asChar() );
+
+ tempPlug = fnMesh.findPlug( MString( "teType" ) );
+ int type;
+ tempPlug.getValue( type );
+ roadSegDataChunk->SetType( type < 0 ? 0 : type );
+
+ tempPlug = fnMesh.findPlug( MString( "teLanes" ) );
+ int lanes;
+ tempPlug.getValue( lanes );
+ roadSegDataChunk->SetNumLanes( lanes );
+
+ tempPlug = fnMesh.findPlug( MString( "teShoulder" ) );
+ bool shoulder;
+ tempPlug.getValue( shoulder );
+ roadSegDataChunk->SetHasShoulder( shoulder ? 1 : 0 );
+
+ MPointArray points;
+ fnMesh.getPoints( points, MSpace::kWorld );
+
+ //ORIGIN
+ tempPlug = fnMesh.findPlug( MString( "teOrigin" ) );
+ int origin;
+ tempPlug.getValue( origin );
+ assert( origin >= 0 );
+ MPoint orig;
+ orig[ 0 ] = points[origin][0] / TEConstants::Scale;
+ orig[ 1 ] = points[origin][1] / TEConstants::Scale;
+ orig[ 2 ] = -points[origin][2] / TEConstants::Scale;
+
+ //DIRECTION
+ tempPlug = fnMesh.findPlug( MString( "teRoad" ) );
+ int direction;
+ tempPlug.getValue( direction );
+ assert( direction >= 0 );
+ MPoint dir;
+ dir[ 0 ] = points[direction][0] / TEConstants::Scale;
+ dir[ 1 ] = points[direction][1] / TEConstants::Scale;
+ dir[ 2 ] = -points[direction][2] / TEConstants::Scale;
+
+ MVector vDir = dir - orig;
+ roadSegDataChunk->SetDirection( MVectorTotlPoint( vDir ) );
+
+ //TOP
+ tempPlug = fnMesh.findPlug( MString( "teTop" ) );
+ int top;
+ tempPlug.getValue( top );
+ assert( top >= 0 );
+ MPoint topPoint;
+ topPoint[ 0 ] = points[top][0] / TEConstants::Scale;
+ topPoint[ 1 ] = points[top][1] / TEConstants::Scale;
+ topPoint[ 2 ] = -points[top][2] / TEConstants::Scale;
+
+ MVector vTop = topPoint - orig;
+ roadSegDataChunk->SetTop( MVectorTotlPoint( vTop ) );
+
+ //BOTTOM
+ tempPlug = fnMesh.findPlug( MString( "teBottom" ) );
+ int bottom;
+ tempPlug.getValue( bottom );
+ assert( bottom >= 0 );
+ MPoint bot;
+ bot[ 0 ] = points[bottom][0] / TEConstants::Scale;
+ bot[ 1 ] = points[bottom][1] / TEConstants::Scale;
+ bot[ 2 ] = -points[bottom][2] / TEConstants::Scale;
+
+ MVector vBottom = bot - orig;
+ roadSegDataChunk->SetBottom( MVectorTotlPoint( vBottom ) );
+
+
+ //Lets to the SCALE and ROTATION of the segment.
+ MPointArray worldPoints;
+ fnMesh.getPoints( worldPoints, MSpace::kWorld );
+
+ //WORLD ORIGIN
+ MPoint worldOrig;
+ worldOrig[ 0 ] = worldPoints[origin][0] / TEConstants::Scale;
+ worldOrig[ 1 ] = worldPoints[origin][1] / TEConstants::Scale;
+ worldOrig[ 2 ] = -worldPoints[origin][2] / TEConstants::Scale;
+
+ //Get the parent transform matrix for the mesh.
+ MObject meshTransformObj = fnMesh.parent( 0 );
+ MFnTransform fnTransform( meshTransformObj );
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= TEConstants::Scale;
+ hmatrix.element[3][1] /= TEConstants::Scale;
+ hmatrix.element[3][2] /= TEConstants::Scale;
+
+ if ( hmatrix.element[3][0] == 0.0f &&
+ hmatrix.element[3][1] == 0.0f &&
+ hmatrix.element[3][2] == 0.0f )
+ {
+ //This could be a frozen
+ MExt::DisplayWarning( "%s could have it's transforms frozen! NOT GOOD! Forced to assume object was built at origin.", fnMesh.name().asChar() );
+
+ hmatrix.element[3][0] = worldOrig.x;
+ hmatrix.element[3][1] = worldOrig.y;
+ hmatrix.element[3][2] = worldOrig.z;
+ }
+
+ tlMatrix smatrix;
+ tm.GetScaleMatrixLHS( smatrix );
+
+ //MATRICIES
+ roadSegChunk->SetHierarchyMatrix( hmatrix );
+ roadSegChunk->SetScaleMatrix( smatrix );
+
+ //DONE
+ roadChunk->AppendSubChunk( roadSegChunk );
+
+ outChunk->AppendSubChunk( roadSegDataChunk );
+ }
+
+ return roadChunk;
+ }
+
+ assert( false );
+ return NULL;
+}
+
diff --git a/tools/trackeditor/code/nodes/road.h b/tools/trackeditor/code/nodes/road.h
new file mode 100644
index 0000000..a601433
--- /dev/null
+++ b/tools/trackeditor/code/nodes/road.h
@@ -0,0 +1,56 @@
+#include "precompiled/PCH.h"
+
+
+#ifndef ROAD_H
+#define ROAD_H
+
+#include "main/constants.h"
+
+class tlDataChunk;
+
+class RoadNode : public MPxLocatorNode
+{
+public:
+ RoadNode();
+ ~RoadNode();
+
+ static void* creator();
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& roadNode, tlHistory& history, tlDataChunk* outChunk );
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* ROAD_SEG_NAME_SHORT;
+ static const char* ROAD_SEG_NAME_LONG;
+ static MObject mRoadSegments;
+
+ static const char* INTERSECTION_START_SHORT;
+ static const char* INTERSECTION_START_LONG;
+ static MObject mIntersectionStart;
+
+ static const char* INTERSECTION_END_SHORT;
+ static const char* INTERSECTION_END_LONG;
+ static MObject mIntersectionEnd;
+
+ static const char* DENSITY_SHORT;
+ static const char* DENSITY_LONG;
+ static MObject mDensity;
+
+ static const char* SPEED_SHORT;
+ static const char* SPEED_LONG;
+ static MObject mSpeed;
+
+ static const char* DIFF_SHORT;
+ static const char* DIFF_LONG;
+ static MObject mDiff;
+
+ static const char* SHORTCUT_SHORT;
+ static const char* SHORTCUT_LONG;
+ static MObject mShortcut;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/tiledisplay.cpp b/tools/trackeditor/code/nodes/tiledisplay.cpp
new file mode 100644
index 0000000..e26f7f9
--- /dev/null
+++ b/tools/trackeditor/code/nodes/tiledisplay.cpp
@@ -0,0 +1,212 @@
+#include "tiledisplay.h"
+#include "main/constants.h"
+#include "main/trackeditor.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+
+MTypeId TileDisplayNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::TileDisplay );
+const char* TileDisplayNode::stringId = "TileDisplayNode";
+
+const int TileDisplayNode::ORIGIN_COLOUR = 10;
+const int TileDisplayNode::ROAD_COLOUR = 11;
+const int TileDisplayNode::TOP_COLOUR = 12;
+const int TileDisplayNode::BOTTOM_COLOUR = 13;
+const int TileDisplayNode::LANE_COLOUR = 4;
+const float TileDisplayNode::SCALE = 1.0f * TEConstants::Scale;
+const float TileDisplayNode::LINE_WIDTH = 6.0f;
+const float TileDisplayNode::Y_OFFSET = 0.5f;
+
+TileDisplayNode::TileDisplayNode() {};
+
+TileDisplayNode::~TileDisplayNode() {};
+
+//==============================================================================
+// TileDisplayNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* TileDisplayNode::creator()
+{
+ return new TileDisplayNode();
+}
+//==============================================================================
+// TileDisplayNode::draw
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view,
+// const MDagPath& path,
+// M3dView::DisplayStyle displayStyle,
+// M3dView::DisplayStatus displayStatus )
+//
+//
+// Return: void
+//
+//==============================================================================
+void TileDisplayNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ )
+{
+ if ( TrackEditor::GetEditMode() != TrackEditor::OFF )
+ {
+ //Display the arrows for the selected mesh.
+ MStatus status;
+ MSelectionList activeList;
+ MGlobal::getActiveSelectionList(activeList);
+
+ MItSelectionList iter( activeList, MFn::kMesh, &status);
+
+ unsigned int count = activeList.length();
+
+ //Draw
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ while ( !iter.isDone() )
+ {
+ MDagPath meshDagPath;
+ iter.getDagPath( meshDagPath );
+
+ MFnMesh fnMesh( meshDagPath );
+
+ MPlug teOriginPlug = fnMesh.findPlug( MString("teOrigin"), &status );
+
+ if ( status == MStatus::kSuccess )
+ {
+ //This is a mesh of the appropriate type
+ //Get all the vertices that are set and display arrows for them.
+ int originVert;
+ teOriginPlug.getValue( originVert );
+
+ int roadVert;
+ MPlug teRoadPlug = fnMesh.findPlug( MString("teRoad"), &status );
+ assert( status );
+ teRoadPlug.getValue( roadVert );
+
+ int topVert;
+ MPlug teTopPlug = fnMesh.findPlug( MString("teTop"), &status );
+ assert( status );
+ teTopPlug.getValue( topVert );
+
+ int bottomVert;
+ MPlug teBottomPlug = fnMesh.findPlug( MString("teBottom"), &status );
+ assert( status );
+ teBottomPlug.getValue( bottomVert );
+
+ int numLanes;
+ MPlug teLanesPlug = fnMesh.findPlug( MString("teLanes"), &status );
+ assert( status );
+ teLanesPlug.getValue( numLanes );
+
+ if ( numLanes < 1 )
+ {
+ MExt::DisplayError( "The mesh %s has a road with no lanes!", fnMesh.name().asChar() );
+ }
+
+ MPoint teOriginPoint;
+ fnMesh.getPoint( originVert, teOriginPoint, MSpace::kWorld );
+ teOriginPoint[1] += Y_OFFSET;
+
+ MPoint teRoadPoint;
+ fnMesh.getPoint( roadVert, teRoadPoint, MSpace::kWorld );
+ teRoadPoint[1] += Y_OFFSET;
+
+ MPoint teTopPoint;
+ fnMesh.getPoint( topVert, teTopPoint, MSpace::kWorld );
+ teTopPoint[1] += Y_OFFSET;
+
+ MPoint teBottomPoint;
+ fnMesh.getPoint( bottomVert, teBottomPoint, MSpace::kWorld );
+ teBottomPoint[1] += Y_OFFSET;
+
+ //When we are in render mode, we draw the lines.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ if ( (value == GL_RENDER) )
+ {
+ if ( originVert >= 0 )
+ {
+ view.setDrawColor( ORIGIN_COLOUR, M3dView::kActiveColors );
+ GLExt::drawSphere( 0.5f * SCALE, teOriginPoint );
+ }
+
+ if ( roadVert >= 0 )
+ {
+ view.setDrawColor( ROAD_COLOUR, M3dView::kActiveColors );
+ GLExt::drawSphere( 0.5f * SCALE, teRoadPoint );
+ GLExt::drawLine( teOriginPoint, teRoadPoint, LINE_WIDTH );
+ }
+
+ if ( topVert >= 0 )
+ {
+ view.setDrawColor( TOP_COLOUR, M3dView::kActiveColors );
+ GLExt::drawSphere( 0.5f * SCALE, teTopPoint );
+ GLExt::drawLine( teRoadPoint, teTopPoint, LINE_WIDTH );
+ }
+
+ if ( bottomVert >= 0 )
+ {
+ view.setDrawColor( BOTTOM_COLOUR, M3dView::kActiveColors );
+ GLExt::drawSphere( 0.5f * SCALE, teBottomPoint );
+ GLExt::drawLine( teOriginPoint, teBottomPoint, LINE_WIDTH );
+ }
+
+ if ( numLanes > 0 )
+ {
+ MVector scaledVector0, scaledVector1;
+ scaledVector0 = teBottomPoint - teOriginPoint;
+ scaledVector0 /= numLanes;
+ scaledVector0 /= 2;
+
+ scaledVector1 = teTopPoint - teRoadPoint;
+ scaledVector1 /= numLanes;
+ scaledVector1 /= 2;
+
+ unsigned int i;
+ for( i = 0; i < numLanes; ++i )
+ {
+ MPoint p0, p1;
+
+ p0 = teOriginPoint + scaledVector0 + (scaledVector0 * i * 2);
+ p1 = teRoadPoint + scaledVector1 + (scaledVector1 * i * 2);
+
+ view.setDrawColor( LANE_COLOUR, M3dView::kActiveColors );
+ GLExt::drawArrow( p0, p1, LINE_WIDTH );
+ }
+ }
+ }
+ }
+
+ iter.next();
+ }
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//==============================================================================
+// TileDisplayNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus TileDisplayNode::initialize()
+{
+ return MStatus::kSuccess;
+}
+
diff --git a/tools/trackeditor/code/nodes/tiledisplay.h b/tools/trackeditor/code/nodes/tiledisplay.h
new file mode 100644
index 0000000..631778a
--- /dev/null
+++ b/tools/trackeditor/code/nodes/tiledisplay.h
@@ -0,0 +1,35 @@
+#include "precompiled/PCH.h"
+
+
+#ifndef TILE_DSIPLAY_H
+#define TILE_DSIPLAY_H
+
+class TileDisplayNode : public MPxLocatorNode
+{
+public:
+ TileDisplayNode();
+ ~TileDisplayNode();
+
+ static void* creator();
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+
+ static MTypeId id;
+ static const char* stringId;
+
+private:
+ static const int ORIGIN_COLOUR;
+ static const int ROAD_COLOUR;
+ static const int TOP_COLOUR;
+ static const int BOTTOM_COLOUR;
+ static const int LANE_COLOUR;
+ static const float SCALE;
+ static const float LINE_WIDTH;
+ static const float Y_OFFSET;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/treelineshapenode.cpp b/tools/trackeditor/code/nodes/treelineshapenode.cpp
new file mode 100644
index 0000000..701ab9c
--- /dev/null
+++ b/tools/trackeditor/code/nodes/treelineshapenode.cpp
@@ -0,0 +1,1343 @@
+#include <windows.h>
+#include <GL/glu.h>
+
+#include <math.h>
+
+#include <radmath/radmath.hpp>
+
+#include "nodes/treelineshapenode.h"
+#include "utility/mext.h"
+#include "utility/mui.h"
+#include "main/shapeconstants.h"
+#include "main/constants.h"
+#include "main/trackeditor.h"
+
+namespace TETreeLine
+{
+
+#define DORMANT_VERTEX_COLOR 8 // purple
+#define ACTIVE_VERTEX_COLOR 16 // yellow
+
+// Vertex point size
+//
+#define POINT_SIZE 2.0
+
+void SetQuadricDrawStyle (GLUquadricObj* qobj, int token)
+{
+ if ((token==SMOOTH_SHADED)||(token==FLAT_SHADED))
+ {
+ gluQuadricNormals( qobj, GLU_SMOOTH );
+ gluQuadricTexture( qobj, true );
+ gluQuadricDrawStyle( qobj, GLU_FILL );
+ }
+ else
+ {
+ gluQuadricDrawStyle( qobj, GLU_LINE );
+ }
+}
+
+void p3dBaseShapeUI::getDrawRequestsWireframe( MDrawRequest& request, const MDrawInfo& info )
+{
+ request.setToken( WIREFRAME );
+
+ M3dView::DisplayStatus displayStatus = info.displayStatus();
+ M3dView::ColorTable activeColorTable = M3dView::kActiveColors;
+ M3dView::ColorTable dormantColorTable = M3dView::kDormantColors;
+ switch ( displayStatus )
+ {
+ case M3dView::kLead :
+ request.setColor( lead_color, activeColorTable );
+ break;
+ case M3dView::kActive :
+ request.setColor( active_color, activeColorTable );
+ break;
+ case M3dView::kActiveAffected :
+ request.setColor( active_affected_color, activeColorTable );
+ break;
+ case M3dView::kDormant :
+ request.setColor( dormant_color, dormantColorTable );
+ break;
+ case M3dView::kHilite :
+ request.setColor( hilite_color, activeColorTable );
+ break;
+ }
+}
+
+void p3dBaseShapeUI::getDrawRequestsShaded( MDrawRequest& request, const MDrawInfo& info,
+ MDrawRequestQueue& queue, MDrawData& data )
+{
+ // Need to get the material info
+ //
+ MDagPath path = info.multiPath(); // path to your dag object
+ M3dView view = info.view();; // view to draw to
+ MMaterial material = MPxSurfaceShapeUI::material( path );
+ M3dView::DisplayStatus displayStatus = info.displayStatus();
+
+ // Evaluate the material and if necessary, the texture.
+ //
+ if ( ! material.evaluateMaterial( view, path ) )
+ {
+ MExt::DisplayError( "Could not evaluate\n" );
+ }
+
+ if ( material.materialIsTextured() )
+ {
+ material.evaluateTexture( data );
+ }
+
+ request.setMaterial( material );
+
+ bool materialTransparent = false;
+ material.getHasTransparency( materialTransparent );
+ if ( materialTransparent )
+ {
+ request.setIsTransparent( true );
+ }
+
+ // create a draw request for wireframe on shaded if
+ // necessary.
+ //
+ if ( (displayStatus == M3dView::kActive) ||
+ (displayStatus == M3dView::kLead) ||
+ (displayStatus == M3dView::kHilite) )
+ {
+ MDrawRequest wireRequest = info.getPrototype( *this );
+ wireRequest.setDrawData( data );
+ getDrawRequestsWireframe( wireRequest, info );
+ wireRequest.setToken( WIREFRAME_SHADED );
+ wireRequest.setDisplayStyle( M3dView::kWireFrame );
+ queue.add( wireRequest );
+ }
+}
+
+/////////////////////////////////////////////////////////////////////
+// SHAPE NODE IMPLEMENTATION
+/////////////////////////////////////////////////////////////////////
+MTypeId TreelineShapeNode::id(TEConstants::NodeIDs::TreeLine);
+const char* TreelineShapeNode::stringId = "TreelineShapeNode";
+
+const char* TreelineShapeNode::SHADER_NAME_LONG = "material";
+const char* TreelineShapeNode::SHADER_NAME_SHORT = "mt";
+MObject TreelineShapeNode::sShader;
+
+const char* TreelineShapeNode::USCALE_NAME_LONG = "uscale";
+const char* TreelineShapeNode::USCALE_NAME_SHORT = "us";
+MObject TreelineShapeNode::sUScale;
+
+const char* TreelineShapeNode::COLOUR_NAME_LONG = "colour";
+const char* TreelineShapeNode::COLOUR_NAME_SHORT = "clr";
+MObject TreelineShapeNode::sColour;
+
+const char* TreelineShapeNode::RED_NAME_LONG = "red";
+const char* TreelineShapeNode::RED_NAME_SHORT = "r";
+MObject TreelineShapeNode::sRed;
+
+const char* TreelineShapeNode::GREEN_NAME_LONG = "green";
+const char* TreelineShapeNode::GREEN_NAME_SHORT = "g";
+MObject TreelineShapeNode::sGreen;
+
+const char* TreelineShapeNode::BLUE_NAME_LONG = "blue";
+const char* TreelineShapeNode::BLUE_NAME_SHORT = "b";
+MObject TreelineShapeNode::sBlue;
+
+const char* TreelineShapeNode::ALPHA_NAME_LONG = "alpha";
+const char* TreelineShapeNode::ALPHA_NAME_SHORT = "a";
+MObject TreelineShapeNode::sAlpha;
+
+const char* TreelineShapeNode::HEIGHT_NAME_LONG = "height";
+const char* TreelineShapeNode::HEIGHT_NAME_SHORT = "h";
+MObject TreelineShapeNode::sHeight;
+
+TreelineShapeNode::TreelineShapeNode()
+{
+}
+
+TreelineShapeNode::~TreelineShapeNode()
+{
+}
+
+//********************************************************************************************
+// Description
+//
+// When instances of this node are created internally, the MObject associated
+// with the instance is not created until after the constructor of this class
+// is called. This means that no member functions of MPxSurfaceShape can
+// be called in the constructor.
+// The postConstructor solves this problem. Maya will call this function
+// after the internal object has been created.
+// As a general rule do all of your initialization in the postConstructor.
+//********************************************************************************************
+void TreelineShapeNode::postConstructor()
+{
+ // This call allows the shape to have shading groups assigned
+ setRenderable( true );
+}
+
+//********************************************************************************************
+// Compute attribute values of the node
+//********************************************************************************************
+MStatus TreelineShapeNode::compute( const MPlug& plug, MDataBlock& datablock )
+{
+ return MS::kSuccess;
+}
+
+//********************************************************************************************
+// Capture when connections are made to this shape
+//********************************************************************************************
+MStatus TreelineShapeNode::connectionMade ( const MPlug &plug, const MPlug &otherPlug, bool asSrc )
+{
+ MObject shaderObj = otherPlug.node();
+ if ( asSrc && shaderObj.hasFn(MFn::kShadingEngine) )
+ {
+ MFnDependencyNode parentFn( plug.node() );
+ MFnDependencyNode shaderFn( shaderObj );
+
+ // connect this material with the chosen object
+
+ MStatus status;
+ MPlug parentMaterialPlug = parentFn.findPlug( SHADER_NAME_LONG, &status );
+
+ if ( !status )
+ {
+ MExt::DisplayError( "Could not assign %s to %s", shaderFn.name(), parentFn.name() );
+ }
+ else
+ {
+ parentMaterialPlug.setLocked( false );
+ parentMaterialPlug.setValue( shaderFn.name() );
+ parentMaterialPlug.setLocked( true );
+ }
+ }
+
+ // let Maya process the connection too
+ return MS::kUnknownParameter;
+}
+
+//********************************************************************************************
+// Create instance of shape
+//********************************************************************************************
+void* TreelineShapeNode::creator()
+{
+ return new TreelineShapeNode();
+}
+
+//********************************************************************************************
+// Create and initialize all attributes in maya
+//********************************************************************************************
+MStatus TreelineShapeNode::initialize()
+{
+ MStatus status;
+ MFnTypedAttribute strAttr;
+ MFnNumericAttribute numAttr;
+ MFnCompoundAttribute compAttr;
+
+ sShader = strAttr.create( SHADER_NAME_LONG, SHADER_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( strAttr.setInternal( false ) );
+ RETURN_STATUS_ON_FAILURE( strAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( strAttr.setKeyable( false ) );
+ status = addAttribute( sShader );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ sUScale = numAttr.create( USCALE_NAME_LONG, USCALE_NAME_SHORT, MFnNumericData::kDouble, 1.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.01) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(100.0) );
+ RETURN_STATUS_ON_FAILURE( strAttr.setInternal( false ) );
+ RETURN_STATUS_ON_FAILURE( strAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( strAttr.setKeyable( true ) );
+ status = addAttribute( sUScale );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ // Compound colour attribute
+ sRed = numAttr.create ( RED_NAME_LONG, RED_NAME_SHORT, MFnNumericData::kFloat, 1.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(1.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+
+ sGreen = numAttr.create ( GREEN_NAME_LONG, GREEN_NAME_SHORT, MFnNumericData::kFloat, 1.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(1.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+
+ sBlue = numAttr.create ( BLUE_NAME_LONG, BLUE_NAME_SHORT, MFnNumericData::kFloat, 1.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(1.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+
+ sColour = numAttr.create( COLOUR_NAME_LONG, COLOUR_NAME_SHORT, sRed, sGreen, sBlue, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setUsedAsColor(true) );
+ status = addAttribute( sColour );
+ RETURN_STATUS_ON_FAILURE( status );
+
+ sAlpha = numAttr.create ( ALPHA_NAME_LONG, ALPHA_NAME_SHORT, MFnNumericData::kFloat, 1.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(1.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setInternal( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+ status = addAttribute( sAlpha );
+ RETURN_STATUS_ON_FAILURE( status );
+
+
+ sHeight = numAttr.create( HEIGHT_NAME_LONG, HEIGHT_NAME_SHORT, MFnNumericData::kFloat, 10.0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.1) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(100.0) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setInternal( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setHidden( false ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setKeyable( true ) );
+ status = addAttribute( sHeight );
+
+ return MS::kSuccess;
+}
+
+//********************************************************************************************
+// Returns the bounding box for the shape.
+// In this case just use the radius and height attributes
+// to determine the bounding box.
+//********************************************************************************************
+MBoundingBox TreelineShapeNode::boundingBox() const
+{
+ MBoundingBox result;
+
+ MStatus status;
+ MObject obj = thisMObject();
+
+ float height = 1.0f;
+
+ MFnDagNode dagNodeFn(obj);
+ MPlug plug;
+
+ plug = dagNodeFn.findPlug( sHeight, &status );
+ plug.getValue( height );
+
+ MPlug vertices = dagNodeFn.findPlug( mControlPoints, &status );
+ assert( status );
+
+ unsigned int i;
+ for ( i = 0; i < vertices.numElements(); ++i )
+ {
+ MPoint point;
+ MPlug vertex1 = vertices.elementByLogicalIndex( i, &status );
+ assert( status );
+
+ MPlug x1 = vertex1.child( mControlValueX, &status );
+ assert( status );
+ x1.getValue( point.x );
+
+ MPlug y1 = vertex1.child( mControlValueY, &status );
+ assert( status );
+ y1.getValue( point.y );
+
+ MPlug z1 = vertex1.child( mControlValueZ, &status );
+ assert( status );
+ z1.getValue( point.z );
+
+ result.expand( point );
+
+ point.y = point.y + ( height * TEConstants::Scale );
+
+ result.expand( point );
+ }
+
+ return result;
+}
+
+//=============================================================================
+// TreelineShapeNode::componentToPlugs
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& component, MSelectionList& selectionList )
+//
+// Return: void
+//
+//=============================================================================
+void TreelineShapeNode::componentToPlugs( MObject& component,
+ MSelectionList& selectionList ) const
+{
+ if ( component.hasFn(MFn::kMeshVertComponent) )
+ {
+ MFnSingleIndexedComponent fnVtxComp( component );
+ MObject thisNode = thisMObject();
+ MPlug plug( thisNode, mControlPoints );
+ int len = fnVtxComp.elementCount();
+ for ( int i = 0; i < len; i++ )
+ {
+ MPlug vtxPlug = plug.elementByLogicalIndex( fnVtxComp.element(i) );
+ selectionList.add( vtxPlug );
+ }
+ }
+}
+
+//=============================================================================
+// TreelineShapeNode::matchComponent
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MSelectionList& item, const MAttributeSpecArray& spec, MSelectionList& list )
+//
+// Return: MPxSurfaceShape
+//
+//=============================================================================
+MPxSurfaceShape::MatchResult
+TreelineShapeNode::matchComponent( const MSelectionList& item,
+ const MAttributeSpecArray& spec,
+ MSelectionList& list )
+//
+// Description:
+//
+// Component/attribute matching method.
+// This method validates component names and indices which are
+// specified as a string and adds the corresponding component
+// to the passed in selection list.
+//
+// For instance, select commands such as "select shape1.vtx[0:7]"
+// are validated with this method and the corresponding component
+// is added to the selection list.
+//
+// Arguments
+//
+// item - DAG selection item for the object being matched
+// spec - attribute specification object
+// list - list to add components to
+//
+// Returns
+//
+// the result of the match
+//
+{
+ MPxSurfaceShape::MatchResult result = MPxSurfaceShape::kMatchOk;
+ MAttributeSpec attrSpec = spec[0];
+ int dim = attrSpec.dimensions();
+
+ // Look for attributes specifications of the form :
+ // vtx[ index ]
+ // vtx[ lower:upper ]
+ //
+ if ( (1 == spec.length()) &&
+ (dim > 0) &&
+ (attrSpec.name() == "controlPoints" ) )
+ {
+ MObject node;
+ item.getDependNode( 0, node );
+ MFnDependencyNode fnDepNode( node );
+ int numVertices = fnDepNode.findPlug( mControlPoints ).numElements();
+ MAttributeIndex attrIndex = attrSpec[0];
+
+ int upper = 0;
+ int lower = 0;
+ if ( attrIndex.hasLowerBound() ) {
+ attrIndex.getLower( lower );
+ }
+ if ( attrIndex.hasUpperBound() ) {
+ attrIndex.getUpper( upper );
+ }
+
+ // Check the attribute index range is valid
+ //
+ if ( (lower > upper) || (upper >= numVertices) ) {
+ result = MPxSurfaceShape::kMatchInvalidAttributeRange;
+ }
+ else {
+ MDagPath path;
+ item.getDagPath( 0, path );
+ MFnSingleIndexedComponent fnVtxComp;
+ MObject vtxComp = fnVtxComp.create( MFn::kMeshVertComponent );
+
+ for ( int i=lower; i<=upper; i++ )
+ {
+ fnVtxComp.addElement( i );
+ }
+ list.add( path, vtxComp );
+ }
+ }
+ else {
+ // Pass this to the parent class
+ return MPxSurfaceShape::matchComponent( item, spec, list );
+ }
+
+ return result;
+}
+
+//=============================================================================
+// TreelineShapeNode::match
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MSelectionMask & mask, const MObjectArray& componentList )
+//
+// Return: bool
+//
+//=============================================================================
+bool TreelineShapeNode::match( const MSelectionMask & mask, const MObjectArray& componentList ) const
+//
+// Description:
+//
+// Check for matches between selection type / component list, and
+// the type of this shape / or it's components
+//
+// This is used by sets and deformers to make sure that the selected
+// components fall into the "vertex only" category.
+//
+// Arguments
+//
+// mask - selection type mask
+// componentList - possible component list
+//
+// Returns
+// true if matched any
+//
+{
+ bool result = false;
+
+ if( componentList.length() == 0 ) {
+ result = mask.intersects( MSelectionMask::kSelectMeshes );
+ }
+ else
+ {
+ for ( int i=0; i<(int)componentList.length(); i++ )
+ {
+ if ( (componentList[i].apiType() == MFn::kMeshVertComponent) &&
+ (mask.intersects(MSelectionMask::kSelectMeshVerts))
+ )
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+//=============================================================================
+// TreelineShapeNode::transformUsing
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MMatrix & mat, const MObjectArray & componentList )
+//
+// Return: void
+//
+//=============================================================================
+void TreelineShapeNode::transformUsing( const MMatrix & mat,
+ const MObjectArray & componentList )
+//
+// Description
+//
+// Transforms the given components. This method is used by
+// the move, rotate, and scale tools in component mode.
+// Bounding box has to be updated here, so do the normals and
+// any other attributes that depend on vertex positions.
+//
+// Arguments
+//
+// mat - matrix to tranform the components by
+// componentList - list of components to be transformed
+//
+{
+ MStatus stat;
+
+ MFnDependencyNode fnDepNode( thisMObject() );
+ MPlug vertices = fnDepNode.findPlug( mControlPoints );
+
+ int len = componentList.length();
+ int i;
+ for ( i=0; i<len; i++ )
+ {
+ MObject comp = componentList[i];
+ MFnSingleIndexedComponent fnComp( comp );
+ int elemCount = fnComp.elementCount();
+ for ( int idx=0; idx<elemCount; idx++ )
+ {
+ int elemIndex = fnComp.element( idx );
+ MPlug vertex = vertices.elementByLogicalIndex( elemIndex );
+
+ MPoint point;
+ vertex.child(0).getValue( point.x );
+ vertex.child(1).getValue( point.y );
+ vertex.child(2).getValue( point.z );
+
+ point *= mat;
+
+ vertex.child(0).setValue( point.x );
+ vertex.child(1).setValue( point.y );
+ vertex.child(2).setValue( point.z );
+ }
+ }
+
+ // Moving vertices will likely change the bounding box.
+ //
+
+ // Tell maya the bounding box for this object has changed
+ // and thus "boundingBox()" needs to be called.
+ //
+ childChanged( MPxSurfaceShape::kBoundingBoxChanged );
+}
+
+//=============================================================================
+// TreelineShapeNode::closestPoint
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MPoint & toThisPoint, MPoint & theClosestPoint, double tolerance )
+//
+// Return: void
+//
+//=============================================================================
+void TreelineShapeNode::closestPoint ( const MPoint& toThisPoint,
+ MPoint& theClosestPoint,
+ double tolerance )
+{
+ MStatus stat;
+
+ MFnDependencyNode fnDepNode( thisMObject() );
+ MPlug vertices = fnDepNode.findPlug( mControlPoints );
+
+ bool found = false;
+ double dist = 10000000.0;
+
+ unsigned int i;
+ for ( i = 0; i < vertices.numElements(); ++i )
+ {
+ MPlug vertex = vertices.elementByLogicalIndex( i );
+ MPoint point;
+
+ vertex.child( 0 ).getValue( point.x );
+ vertex.child( 1 ).getValue( point.y );
+ vertex.child( 2 ).getValue( point.z );
+
+ if ( point.distanceTo( toThisPoint ) < dist )
+ {
+ dist = point.distanceTo( toThisPoint );
+ theClosestPoint = point;
+ }
+ }
+}
+
+//=============================================================================
+// TreelineShapeNode::SnapTreeline
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& treeline )
+//
+// Return: void
+//
+//=============================================================================
+void TreelineShapeNode::SnapTreeline( MObject& treeline )
+{
+ MFnDependencyNode fnDepNode( treeline );
+
+ MPlug vertices = fnDepNode.findPlug( mControlPoints );
+
+ unsigned int i;
+
+ for ( i = 0; i < vertices.numElements(); ++i )
+ {
+ MPlug vertex = vertices.elementByLogicalIndex( i );
+
+ MPoint point;
+
+ vertex.child( 0 ).getValue( point.x );
+ vertex.child( 1 ).getValue( point.y );
+ vertex.child( 2 ).getValue( point.z );
+
+ MPoint intersectPoint;
+ //Look down...
+ if ( MExt::MeshIntersectAlongVector( point, MPoint(0, -100000.0, 0 ), intersectPoint ) )
+ {
+ vertex.child( 0 ).setValue( intersectPoint.x );
+ vertex.child( 1 ).setValue( intersectPoint.y );
+ vertex.child( 2 ).setValue( intersectPoint.z );
+ }
+ else
+ {
+ //Try looking up...
+ if ( MExt::MeshIntersectAlongVector( point, MPoint(0, 100000.0, 0 ), intersectPoint ) )
+ {
+ vertex.child( 0 ).setValue( intersectPoint.x );
+ vertex.child( 1 ).setValue( intersectPoint.y );
+ vertex.child( 2 ).setValue( intersectPoint.z );
+ }
+ }
+ }
+}
+
+void TreelineShapeNode::ConvertToGeometry( MObject& obj )
+{
+ MFnMesh newMesh;
+ MObject newMeshObj;
+
+ MFnDependencyNode fnDepNode( obj );
+ MPlug vertices = fnDepNode.findPlug( mControlPoints );
+
+ if ( vertices.numElements() >= 2 )
+ {
+ double height;
+ fnDepNode.findPlug( sHeight ).getValue( height );
+
+ double uScale;
+ fnDepNode.findPlug( sUScale).getValue( uScale );
+
+ MFloatArray uArray, vArray;
+ MIntArray uvCounts, uvIds;
+
+ unsigned int i = 0;
+ unsigned int j = 0;
+ do
+ {
+ //Create the new mesh...
+ MPointArray points;
+ MPoint point1, point2, point3, point4;
+
+ MPlug vertex1 = vertices.elementByLogicalIndex( i );
+ vertex1.child(0).getValue( point1.x );
+ vertex1.child(1).getValue( point1.y );
+ vertex1.child(2).getValue( point1.z );
+
+ point2 = point1;
+ point1.y += height * TEConstants::Scale;
+
+ points.append( point1 );
+ points.append( point2 );
+
+ MPlug vertex2 = vertices.elementByLogicalIndex( i + 1 );
+ vertex2.child(0).getValue( point3.x );
+ vertex2.child(1).getValue( point3.y );
+ vertex2.child(2).getValue( point3.z );
+
+ point4 = point3;
+ point4.y += height * TEConstants::Scale;
+
+ points.append( point3 );
+ points.append( point4 );
+
+ newMeshObj = newMesh.addPolygon( points );
+
+ double dist = point2.distanceTo( point3 );
+
+ float U = ceil( dist / (uScale * TEConstants::Scale ) );
+
+ uArray.append( 0 );
+ uArray.append( 0 );
+ uArray.append( U );
+ uArray.append( U );
+
+ vArray.append( 1 );
+ vArray.append( 0 );
+ vArray.append( 0 );
+ vArray.append( 1 );
+
+ uvCounts.append( 4 );
+
+ uvIds.append( 0 + j );
+ uvIds.append( 1 + j );
+ uvIds.append( 2 + j );
+ uvIds.append( 3 + j );
+
+ ++i;
+ j += 4;
+ }
+ while ( i < vertices.numElements() - 1 );
+
+ MString material;
+ fnDepNode.findPlug( sShader ).getValue( material );
+
+ if ( material.length() > 0 )
+ {
+ //Set the material to the new object.
+
+ newMesh.setUVs( uArray, vArray );
+ newMesh.assignUVs( uvCounts, uvIds );
+
+ //MEL command for assigning the texture.
+ //sets -e -forceElement pure3dSimpleShader1SG polySurface1;
+ MString meshName = newMesh.name();
+
+ MString cmd;
+
+ cmd += MString("sets -e -forceElement ") + material + MString(" ") + meshName;
+
+ MStatus status;
+ MGlobal::executeCommand( cmd, status );
+ }
+ }
+ else
+ {
+ assert(false);
+ MExt::DisplayError( "Treeline: %s is invalid for converting to geometry!", fnDepNode.name().asChar() );
+ }
+
+ if ( TrackEditor::GetDeleteTreelines() )
+ {
+ MExt::DeleteNode( obj, true );
+ }
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// UI IMPLEMENTATION
+/////////////////////////////////////////////////////////////////////
+
+TreelineShapeNodeUI::TreelineShapeNodeUI()
+{
+}
+
+TreelineShapeNodeUI::~TreelineShapeNodeUI()
+{
+}
+
+void* TreelineShapeNodeUI::creator()
+{
+ return new TreelineShapeNodeUI();
+}
+
+//********************************************************************************************
+// The draw data is used to pass geometry through the
+// draw queue. The data should hold all the information
+// needed to draw the shape.
+//********************************************************************************************
+void TreelineShapeNodeUI::getDrawRequests( const MDrawInfo & info, bool objectAndActiveOnly, MDrawRequestQueue & queue )
+{
+ MDrawData data;
+ MDrawRequest request = info.getPrototype( *this );
+ TreelineShapeNode* shapeNode = (TreelineShapeNode*)surfaceShape();
+ getDrawData( NULL, data );
+ request.setDrawData( data );
+
+ // Use display status to determine what color to draw the object
+ switch ( info.displayStyle() )
+ {
+ case M3dView::kGouraudShaded :
+ request.setToken( SMOOTH_SHADED );
+ getDrawRequestsShaded( request, info, queue, data );
+ queue.add( request );
+ break;
+
+ case M3dView::kFlatShaded :
+ request.setToken( FLAT_SHADED );
+ getDrawRequestsShaded( request, info, queue, data );
+ queue.add( request );
+ break;
+
+ default :
+ request.setToken(WIREFRAME);
+ getDrawRequestsWireframe( request, info );
+ queue.add( request );
+ break;
+
+ }
+
+ // Add draw requests for components
+ //
+ if ( !objectAndActiveOnly )
+ {
+ // Inactive components
+ //
+ if ( (info.displayStyle() == M3dView::kPoints) ||
+ (info.displayStatus() == M3dView::kHilite) )
+ {
+ MDrawRequest vertexRequest = info.getPrototype( *this );
+ vertexRequest.setDrawData( data );
+ vertexRequest.setToken( VERTICES );
+ vertexRequest.setColor( DORMANT_VERTEX_COLOR, //TODO: PICK COLOURS
+ M3dView::kActiveColors );
+
+ queue.add( vertexRequest );
+ }
+
+ // Active components
+ //
+ if ( surfaceShape()->hasActiveComponents() ) {
+
+ MDrawRequest activeVertexRequest = info.getPrototype( *this );
+ activeVertexRequest.setDrawData( data );
+ activeVertexRequest.setToken( VERTICES );
+ activeVertexRequest.setColor( ACTIVE_VERTEX_COLOR, //TODO: PICK COLOURS
+ M3dView::kActiveColors );
+
+ MObjectArray clist = surfaceShape()->activeComponents();
+ MObject vertexComponent = clist[0]; // Should filter list
+ activeVertexRequest.setComponent( vertexComponent );
+
+ queue.add( activeVertexRequest );
+ }
+ }
+
+}
+
+//********************************************************************************************
+// Actual draw call
+//********************************************************************************************
+void TreelineShapeNodeUI::drawQuad(int drawMode) const
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ TreelineShapeNode* shapeNode = (TreelineShapeNode*)surfaceShape();
+ MFnDagNode dagNodeFn(shapeNode->thisMObject());
+ MPlug plug;
+
+ MStatus status;
+ float height;
+ MPlug heightPlug = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::sHeight, &status );
+ assert( status );
+
+ heightPlug.getValue( height );
+
+ MPlug vertices = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::mControlPoints, &status );
+ assert( status );
+
+ if ( vertices.numElements() >= 2 )
+ {
+ double uScale;
+ MPlug uScalePlug = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::sUScale, &status );
+ assert( status );
+ uScalePlug.getValue( uScale );
+
+ int primType;
+ if ((drawMode==SMOOTH_SHADED)||(drawMode==FLAT_SHADED))
+ {
+ glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL);
+ primType = GL_POLYGON;
+ }
+ else
+ {
+ glPolygonMode ( GL_FRONT_AND_BACK, GL_LINE);
+ primType = GL_LINE_LOOP;
+ }
+
+ glPushMatrix();
+
+ unsigned int i = 0;
+
+ do
+ {
+ MPoint point1, point2;
+ MPlug vertex1 = vertices.elementByLogicalIndex( i, &status );
+ assert( status );
+
+ MPlug vertex2 = vertices.elementByLogicalIndex( i + 1, &status );
+ assert( status );
+
+ MPlug x1 = vertex1.child( TETreeLine::TreelineShapeNode::mControlValueX, &status );
+ assert( status );
+ x1.getValue( point1.x );
+
+ MPlug y1 = vertex1.child( TETreeLine::TreelineShapeNode::mControlValueY, &status );
+ assert( status );
+ y1.getValue( point1.y );
+
+ MPlug z1 = vertex1.child( TETreeLine::TreelineShapeNode::mControlValueZ, &status );
+ assert( status );
+ z1.getValue( point1.z );
+
+ MPlug x2 = vertex2.child( TETreeLine::TreelineShapeNode::mControlValueX, &status );
+ assert( status );
+ x2.getValue( point2.x );
+
+ MPlug y2 = vertex2.child( TETreeLine::TreelineShapeNode::mControlValueY, &status );
+ assert( status );
+ y2.getValue( point2.y );
+
+ MPlug z2 = vertex2.child( TETreeLine::TreelineShapeNode::mControlValueZ, &status );
+ assert( status );
+ z2.getValue( point2.z );
+
+ MPoint normal, vect;
+ rmt::Vector normalVec;
+ rmt::Vector v;
+
+ double dist = point1.distanceTo( point2 );
+
+ double U = ceil( dist / (uScale * TEConstants::Scale ) );
+
+ vect = point2 - point1;
+ v.Set( vect.x, vect.y, vect.z );
+ normalVec.CrossProduct( v, rmt::Vector( 0.0f, 1.0f, 0.0f ) );
+
+ glBegin(primType);
+ glNormal3f( normalVec.x, normalVec.y, normalVec.z ); //TODO: CALCULATE THIS!
+ glTexCoord2f ( 0, 1 );
+ glVertex3f( point1.x,
+ (point1.y) + (height * TEConstants::Scale),
+ point1.z );
+ glTexCoord2f ( 0, 0 );
+ glVertex3f( point1.x,
+ point1.y,
+ point1.z );
+ glTexCoord2f ( U, 0 );
+ glVertex3f( point2.x,
+ point2.y,
+ point2.z );
+ glTexCoord2f ( U, 1 );
+ glVertex3f( point2.x,
+ (point2.y) + (height * TEConstants::Scale),
+ point2.z );
+ glEnd();
+
+ ++i;
+ }
+ while ( i < vertices.numElements() - 1 );
+
+ glPopMatrix();
+
+ glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL);
+ }
+ glPopAttrib();
+}
+
+//********************************************************************************************
+// From the given draw request, get the draw data and display the quad
+//********************************************************************************************
+void TreelineShapeNodeUI::draw( const MDrawRequest & request, M3dView & view ) const
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ MDagPath dagPath = request.multiPath();
+ MDrawData data = request.drawData();
+ short token = request.token();
+ bool drawTexture = false;
+
+ view.beginGL();
+
+ if ( (token == SMOOTH_SHADED) || (token == FLAT_SHADED) )
+ {
+ glEnable( GL_POLYGON_OFFSET_FILL );
+ // Set up the material
+ //
+ MMaterial material = request.material();
+ material.setMaterial(dagPath,false);
+
+ // Enable texturing
+ //
+ drawTexture = material.materialIsTextured();
+ if ( drawTexture ) glEnable(GL_TEXTURE_2D);
+
+ // Apply the texture to the current view
+ //
+ if ( drawTexture )
+ {
+ material.applyTexture( view, data );
+ }
+ }
+
+ if ( token == VERTICES )
+ {
+ drawVertices( request, view );
+ }
+ else
+ {
+ drawQuad(token);
+ }
+
+ // Turn off texture mode
+ //
+ if ( drawTexture ) glDisable(GL_TEXTURE_2D);
+
+ view.endGL();
+ glPopAttrib();
+}
+
+//********************************************************************************************
+// Select function. Gets called when the bbox for the object is selected.
+// This function just selects the object without doing any intersection tests.
+//********************************************************************************************
+bool TreelineShapeNodeUI::select( MSelectInfo &selectInfo, MSelectionList &selectionList, MPointArray &worldSpaceSelectPts ) const
+{
+ bool selected = false;
+
+ if ( selectInfo.displayStatus() == M3dView::kHilite ) {
+ selected = selectVertices( selectInfo, selectionList,worldSpaceSelectPts );
+ }
+
+ if ( !selected )
+ {
+ M3dView view = selectInfo.view();
+
+ //
+ // Re-Draw the object and see if they lie withing the selection area
+ // Sets OpenGL's render mode to select and stores
+ // selected items in a pick buffer
+ //
+ view.beginSelect();
+
+ switch ( selectInfo.displayStyle() )
+ {
+ case M3dView::kGouraudShaded :
+ drawQuad(SMOOTH_SHADED);
+ break;
+
+ case M3dView::kFlatShaded :
+ drawQuad(FLAT_SHADED);
+ break;
+
+ default :
+ drawQuad(WIREFRAME);
+ break;
+ }
+
+ if( view.endSelect() > 0 )
+ {
+ MSelectionMask priorityMask( MSelectionMask::kSelectObjectsMask );
+ MSelectionList item;
+ item.add( selectInfo.selectPath() );
+ MPoint xformedPt;
+ selectInfo.addSelection( item, xformedPt, selectionList, worldSpaceSelectPts, priorityMask, false );
+ return true;
+ }
+ }
+
+ return selected;
+}
+
+//=============================================================================
+// TreelineShapeNodeUI::drawVertices
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MDrawRequest & request, M3dView & view )
+//
+// Return: void
+//
+//=============================================================================
+void TreelineShapeNodeUI::drawVertices( const MDrawRequest & request, M3dView & view ) const
+//
+// Description:
+//
+// Component (vertex) drawing routine
+//
+// Arguments:
+//
+// request - request to be drawn
+// view - view to draw into
+//
+{
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+ MDrawData data = request.drawData();
+ TreelineShapeNode* shapeNode = (TreelineShapeNode*)surfaceShape();
+ MFnDagNode dagNodeFn(shapeNode->thisMObject());
+
+ view.beginGL();
+
+ // Query current state so it can be restored
+ //
+ bool lightingWasOn = glIsEnabled( GL_LIGHTING ) ? true : false;
+ if ( lightingWasOn ) {
+ glDisable( GL_LIGHTING );
+ }
+ float lastPointSize;
+ glGetFloatv( GL_POINT_SIZE, &lastPointSize );
+
+ // Set the point size of the vertices
+ //
+ glPointSize( POINT_SIZE );
+
+ // If there is a component specified by the draw request
+ // then loop over comp (using an MFnComponent class) and draw the
+ // active vertices, otherwise draw all vertices.
+ //
+ MObject comp = request.component();
+ if ( ! comp.isNull() )
+ {
+ MPlug vertices = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::mControlPoints );
+
+ MFnSingleIndexedComponent fnComponent( comp );
+ for ( int i=0; i<fnComponent.elementCount(); i++ )
+ {
+ int index = fnComponent.element( i );
+ glBegin( GL_POINTS );
+ MPlug vertexPlug = vertices.elementByLogicalIndex( index );
+
+ MPoint vertex;
+ vertexPlug.child( 0 ).getValue( vertex.x );
+ vertexPlug.child( 1 ).getValue( vertex.y );
+ vertexPlug.child( 2 ).getValue( vertex.z );
+
+ glVertex3f( (float)vertex[0],
+ (float)vertex[1],
+ (float)vertex[2] );
+ glEnd();
+
+ char annotation[32];
+ sprintf( annotation, "%d", index );
+ view.drawText( annotation, vertex );
+ }
+ }
+ else
+ {
+ MPlug vertices = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::mControlPoints );
+
+ for ( int i=0; i<vertices.numElements(); i++ )
+ {
+ glBegin( GL_POINTS );
+ MPlug vertexPlug = vertices.elementByLogicalIndex( i );
+
+ MPoint vertex;
+ vertexPlug.child( 0 ).getValue( vertex.x );
+ vertexPlug.child( 1 ).getValue( vertex.y );
+ vertexPlug.child( 2 ).getValue( vertex.z );
+
+ glVertex3f( (float)vertex[0],
+ (float)vertex[1],
+ (float)vertex[2] );
+ glEnd();
+ }
+ }
+ // Restore the state
+ //
+ if ( lightingWasOn ) {
+ glEnable( GL_LIGHTING );
+ }
+ glPointSize( lastPointSize );
+
+ view.endGL();
+ glPopAttrib();
+}
+
+//=============================================================================
+// TreelineShapeNodeUI::selectVertices
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MSelectInfo &selectInfo, MSelectionList &selectionList, MPointArray &worldSpaceSelectPts )
+//
+// Return: bool
+//
+//=============================================================================
+bool TreelineShapeNodeUI::selectVertices( MSelectInfo &selectInfo,
+ MSelectionList &selectionList,
+ MPointArray &worldSpaceSelectPts ) const
+//
+// Description:
+//
+// Vertex selection.
+//
+// Arguments:
+//
+// selectInfo - the selection state information
+// selectionList - the list of selected items to add to
+// worldSpaceSelectPts -
+//
+{
+ bool selected = false;
+ M3dView view = selectInfo.view();
+
+ MPoint xformedPoint;
+ MPoint currentPoint;
+ MPoint selectionPoint;
+ double z,previousZ = 0.0;
+ int closestPointVertexIndex = -1;
+
+ const MDagPath & path = selectInfo.multiPath();
+
+ // Create a component that will store the selected vertices
+ //
+ MFnSingleIndexedComponent fnComponent;
+ MObject surfaceComponent = fnComponent.create( MFn::kMeshVertComponent );
+ int vertexIndex;
+
+ // if the user did a single mouse click and we find > 1 selection
+ // we will use the alignmentMatrix to find out which is the closest
+ //
+ MMatrix alignmentMatrix;
+ MPoint singlePoint;
+ bool singleSelection = selectInfo.singleSelection();
+ if( singleSelection ) {
+ alignmentMatrix = selectInfo.getAlignmentMatrix();
+ }
+
+ // Get the geometry information
+ //
+ TreelineShapeNode* shapeNode = (TreelineShapeNode*)surfaceShape();
+ MFnDagNode dagNodeFn(shapeNode->thisMObject());
+
+ // Loop through all vertices of the mesh and
+ // see if they lie withing the selection area
+ //
+ MPlug vertices = dagNodeFn.findPlug( TETreeLine::TreelineShapeNode::mControlPoints );
+
+ int numVertices = vertices.numElements();
+
+ for ( vertexIndex=0; vertexIndex<numVertices; vertexIndex++ )
+ {
+ MPlug vertexPlug = vertices.elementByLogicalIndex( vertexIndex );
+
+ MPoint currentPoint;
+ vertexPlug.child( 0 ).getValue( currentPoint.x );
+ vertexPlug.child( 1 ).getValue( currentPoint.y );
+ vertexPlug.child( 2 ).getValue( currentPoint.z );
+
+ // Sets OpenGL's render mode to select and stores
+ // selected items in a pick buffer
+ //
+ view.beginSelect();
+
+ glBegin( GL_POINTS );
+
+ glVertex3f( (float)currentPoint[0],
+ (float)currentPoint[1],
+ (float)currentPoint[2] );
+ glEnd();
+
+ if ( view.endSelect() > 0 ) // Hit count > 0
+ {
+ selected = true;
+
+ if ( singleSelection ) {
+ xformedPoint = currentPoint;
+ xformedPoint.homogenize();
+ xformedPoint*= alignmentMatrix;
+ z = xformedPoint.z;
+ if ( closestPointVertexIndex < 0 || z > previousZ ) {
+ closestPointVertexIndex = vertexIndex;
+ singlePoint = currentPoint;
+ previousZ = z;
+ }
+ } else {
+ // multiple selection, store all elements
+ //
+ fnComponent.addElement( vertexIndex );
+ }
+ }
+ }
+
+ // If single selection, insert the closest point into the array
+ //
+ if ( selected && selectInfo.singleSelection() ) {
+ fnComponent.addElement(closestPointVertexIndex);
+
+ // need to get world space position for this vertex
+ //
+ selectionPoint = singlePoint;
+ selectionPoint *= path.inclusiveMatrix();
+ }
+
+ // Add the selected component to the selection list
+ //
+ if ( selected ) {
+ MSelectionList selectionItem;
+ selectionItem.add( path, surfaceComponent );
+
+ MSelectionMask mask( MSelectionMask::kSelectComponentsMask );
+ selectInfo.addSelection(
+ selectionItem, selectionPoint,
+ selectionList, worldSpaceSelectPts,
+ mask, true );
+ }
+
+ return selected;
+}
+
+} //namespace TETreeLine
+
+
diff --git a/tools/trackeditor/code/nodes/treelineshapenode.h b/tools/trackeditor/code/nodes/treelineshapenode.h
new file mode 100644
index 0000000..e1a25ac
--- /dev/null
+++ b/tools/trackeditor/code/nodes/treelineshapenode.h
@@ -0,0 +1,142 @@
+#ifndef TREELINE_SHAPE_NODE_H
+#define TREELINE_SHAPE_NODE_H
+
+#include "precompiled/PCH.h"
+
+class tlDataChunk;
+
+namespace TETreeLine
+{
+
+class p3dBaseShape : public MPxSurfaceShape
+{
+public:
+ p3dBaseShape() {}
+ virtual ~p3dBaseShape() {}
+};
+
+class p3dBaseShapeUI : public MPxSurfaceShapeUI
+{
+public:
+ p3dBaseShapeUI()
+ {
+ lead_color = 18; //green
+ active_color = 15; //white
+ active_affected_color = 8; //purple
+ dormant_color = 4; //blue
+ hilite_color = 17; //pale blue
+ }
+ virtual ~p3dBaseShapeUI() {}
+
+ virtual void getDrawRequestsWireframe( MDrawRequest&, const MDrawInfo& );
+ virtual void getDrawRequestsShaded( MDrawRequest&, const MDrawInfo&, MDrawRequestQueue&, MDrawData& data );
+
+protected:
+ int lead_color;
+ int active_color;
+ int active_affected_color;
+ int dormant_color;
+ int hilite_color;
+};
+
+/////////////////////////////////////////////////////////////////////
+//
+// Shape class - defines the non-UI part of a shape node
+//
+class TreelineShapeNode : public p3dBaseShape
+{
+public:
+ TreelineShapeNode();
+ virtual ~TreelineShapeNode();
+
+ virtual void postConstructor();
+ virtual MStatus compute( const MPlug& plug, MDataBlock& datablock );
+ virtual MStatus connectionMade ( const MPlug &plug, const MPlug &otherPlug, bool asSrc );
+ static void* creator();
+ static MStatus initialize();
+ virtual bool isBounded() const {return true;}
+ virtual MBoundingBox boundingBox() const;
+
+ virtual void componentToPlugs( MObject& component, MSelectionList& selectionList ) const;
+ virtual MPxSurfaceShape::MatchResult
+ matchComponent( const MSelectionList& item,
+ const MAttributeSpecArray& spec,
+ MSelectionList& list );
+ virtual bool match( const MSelectionMask& mask,
+ const MObjectArray& componentList ) const;
+ virtual void transformUsing( const MMatrix& mat, const MObjectArray& componentList );
+ virtual void closestPoint ( const MPoint & toThisPoint, MPoint & theClosestPoint, double tolerance );
+
+ static void SnapTreeline( MObject& treeline );
+
+ static void ConvertToGeometry( MObject& obj );
+
+ static MTypeId id;
+ static const char* stringId;
+
+private:
+ // Attributes
+ static const char* SHADER_NAME_LONG;
+ static const char* SHADER_NAME_SHORT;
+ static MObject sShader;
+
+ static const char* USCALE_NAME_LONG;
+ static const char* USCALE_NAME_SHORT;
+ static MObject sUScale;
+
+ static const char* COLOUR_NAME_LONG;
+ static const char* COLOUR_NAME_SHORT;
+ static MObject sColour;
+
+ static const char* RED_NAME_LONG;
+ static const char* RED_NAME_SHORT;
+ static MObject sRed;
+
+ static const char* GREEN_NAME_LONG;
+ static const char* GREEN_NAME_SHORT;
+ static MObject sGreen;
+
+ static const char* BLUE_NAME_LONG;
+ static const char* BLUE_NAME_SHORT;
+ static MObject sBlue;
+
+ static const char* ALPHA_NAME_LONG;
+ static const char* ALPHA_NAME_SHORT;
+ static MObject sAlpha;
+
+ static const char* HEIGHT_NAME_LONG;
+ static const char* HEIGHT_NAME_SHORT;
+ static MObject sHeight;
+};
+
+/////////////////////////////////////////////////////////////////////
+//
+// UI class - defines the UI part of a shape node
+//
+class TreelineShapeNodeUI : public p3dBaseShapeUI
+{
+public:
+ TreelineShapeNodeUI();
+ virtual ~TreelineShapeNodeUI();
+
+ virtual void getDrawRequests( const MDrawInfo & info, bool objectAndActiveOnly, MDrawRequestQueue & requests );
+ virtual void draw( const MDrawRequest & request, M3dView & view ) const;
+ virtual bool select( MSelectInfo &selectInfo, MSelectionList &selectionList, MPointArray &worldSpaceSelectPts ) const;
+ static void * creator();
+
+protected:
+ void drawQuad(int drawMode) const;
+ void drawVertices( const MDrawRequest & request, M3dView & view ) const;
+ bool selectVertices( MSelectInfo &selectInfo,
+ MSelectionList &selectionList,
+ MPointArray &worldSpaceSelectPts ) const;
+};
+
+
+} //namespace TETreeLine
+
+
+
+#endif //TREELINE_SHAPE_NODE_H
+
+
diff --git a/tools/trackeditor/code/nodes/walllocator.cpp b/tools/trackeditor/code/nodes/walllocator.cpp
new file mode 100644
index 0000000..e4d5c4f
--- /dev/null
+++ b/tools/trackeditor/code/nodes/walllocator.cpp
@@ -0,0 +1,551 @@
+#include "precompiled/PCH.h"
+
+#include "walllocator.h"
+#include "main/constants.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include <toollib.hpp>
+
+
+MTypeId WallLocatorNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::WallLocator );
+const char* WallLocatorNode::stringId = "WallLocatorNode";
+
+const int WallLocatorNode::ACTIVE_COLOUR = 13;
+const int WallLocatorNode::INACTIVE_COLOUR = 22;
+const float WallLocatorNode::SCALE = 1.0f * TEConstants::Scale;
+
+//This is an attribute.
+
+const char* WallLocatorNode::LEFTRIGHT_NAME_LONG = "leftRight";
+const char* WallLocatorNode::LEFTRIGHT_NAME_SHORT = "lr";
+MObject WallLocatorNode::mLeftRight;
+
+const char* WallLocatorNode::PREVNODE_NAME_LONG = "prevNode";
+const char* WallLocatorNode::PREVNODE_NAME_SHORT = "pn";
+MObject WallLocatorNode::mPrevNode;
+
+const char* WallLocatorNode::NEXTNODE_NAME_LONG = "nextNode";
+const char* WallLocatorNode::NEXTNODE_NAME_SHORT = "nn";
+MObject WallLocatorNode::mNextNode;
+
+const char* WallLocatorNode::ID_NAME_LONG = "callbackID";
+const char* WallLocatorNode::ID_NAME_SHORT = "cb";
+MObject WallLocatorNode::mCallbackId;
+
+//==============================================================================
+// WallLocatorNode::WallLocatorNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: WallLocatorNode
+//
+//==============================================================================
+WallLocatorNode::WallLocatorNode() {};
+
+//==============================================================================
+// WallLocatorNode::~WallLocatorNode
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: WallLocatorNode
+//
+//==============================================================================
+WallLocatorNode::~WallLocatorNode() {};
+
+//==============================================================================
+// WallLocatorNode::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* WallLocatorNode::creator()
+{
+ return new WallLocatorNode();
+}
+
+//==============================================================================
+// WallLocatorNode::initialize
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus WallLocatorNode::initialize()
+{
+ MFnMessageAttribute fnMessage;
+ MFnNumericAttribute fnNumeric;
+ MStatus status;
+
+ //Create the left/right attrib
+ mLeftRight = fnNumeric.create( LEFTRIGHT_NAME_LONG, LEFTRIGHT_NAME_SHORT, MFnNumericData::kInt, LEFT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ fnNumeric.setDefault(LEFT);
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mLeftRight ) );
+
+
+ //Create the sttribute for the previous node.
+ mPrevNode = fnMessage.create( PREVNODE_NAME_LONG, PREVNODE_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mPrevNode ) );
+
+ //Create the sttribute for the next node.
+ mNextNode = fnMessage.create( NEXTNODE_NAME_LONG, NEXTNODE_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( fnMessage.setWritable( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mNextNode ) );
+
+
+ mCallbackId = fnNumeric.create( ID_NAME_LONG, ID_NAME_SHORT, MFnNumericData::kLong, 0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ fnNumeric.setDefault( 0 );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( mCallbackId ) );
+
+ return MS::kSuccess;
+}
+
+//==============================================================================
+// WallLocatorNode::legalConnection
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MPlug & plug, const MPlug & otherPlug, bool asSrc, bool& result )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus WallLocatorNode::legalConnection ( const MPlug & plug, const MPlug & otherPlug, bool asSrc, bool& result ) const
+{
+ if ( otherPlug.node() == thisMObject() )
+ {
+ result = false;
+ return MS::kSuccess;
+ }
+
+ if ( plug == mNextNode )
+ {
+ //This is the source of the connection.
+ //Therefore the connection is legal if I'm not already connected to the same node by the input.
+ MFnDependencyNode fnNode;
+ MStatus status;
+
+ fnNode.setObject( thisMObject() );
+ MPlug prevPlug = fnNode.findPlug( mPrevNode, &status );
+ assert( status );
+
+ if ( prevPlug.node() != otherPlug.node() )
+ {
+ //Go ahead and connect.
+ result = true;
+ }
+ else
+ {
+ //Already connected to this node. No 2-Node loops please.
+ result = false;
+ }
+
+ return MS::kSuccess;
+ }
+ else if ( plug == mPrevNode )
+ {
+ //This is the destination of the connection.
+ //Therefore the connection is legal if I'm not already connected to the same node by the output
+ MFnDependencyNode fnNode;
+ MStatus status;
+
+ fnNode.setObject( thisMObject() );
+ MPlug nextPlug = fnNode.findPlug( mNextNode, &status );
+ assert( status );
+
+ if ( nextPlug.node() != otherPlug.node() )
+ {
+ //Go ahead and connect.
+ result = true;
+ }
+ else
+ {
+ //Already connected to this node. No 2-Node loops please.
+ result = false;
+ }
+ return MS::kSuccess;
+ }
+
+ return MS::kUnknownParameter;
+}
+
+//==============================================================================
+// WallLocatorNode::postConstructor
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void WallLocatorNode::postConstructor()
+{
+ //
+ // Register a callback that will notify us just prior to this node being
+ // deleted.
+ //
+ MStatus status;
+ MFnDependencyNode fnNode;
+
+ fnNode.setObject( thisMObject() );
+ MPlug plug = fnNode.findPlug( mCallbackId, &status );
+ assert( status );
+
+ int id = MNodeMessage::addNodeAboutToDeleteCallback(
+ thisMObject(),
+ NodeAboutToDeleteCallback,
+ (void*)(this),
+ &status
+ );
+
+ plug.setValue( id );
+
+ //Since this is a planar dealie, we want the Y to stay at 0...
+ MPlug lyPlug( thisMObject(), localPositionY );
+ lyPlug.setLocked( true );
+
+ MPlug wyPlug( thisMObject(), worldPositionY );
+ wyPlug.setLocked( true );
+
+ assert( status );
+}
+
+//==============================================================================
+// WallLocatorNode::draw
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView & view,
+// const MDagPath & path,
+// M3dView::DisplayStyle style,
+// M3dView::DisplayStatus status )
+//
+// Return: void
+//
+//==============================================================================
+void WallLocatorNode::draw( M3dView & view,
+ const MDagPath & path,
+ M3dView::DisplayStyle style,
+ M3dView::DisplayStatus status )
+{
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //If there is a connected wall locator node, draw a line to it. Then draw the arrow halfway between them.
+ if ( MExt::IsConnected( thisMObject(), mNextNode ) )
+ {
+ //Can we stop the GL system from adding this to it's selection mechanism?
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ if ( (value == GL_RENDER) )
+ {
+ //Get the world position of the next node
+ MStatus st;
+ MPlugArray pa;
+ MFnDependencyNode fnNode;
+
+ fnNode.setObject( thisMObject() );
+ MPlug plug = fnNode.findPlug( mNextNode, &st );
+ assert( st );
+
+ plug.connectedTo( pa, false, true, &st );
+ assert( st );
+
+ //There is only one thing plugged into this...
+ MPlug nextPlug = pa[0];
+
+ //Got the nextNode's plug, let's get the WorldPosition of the other node.
+ MPoint nnwp;
+ MExt::GetWorldPosition( &nnwp, nextPlug.node() );
+
+ //Get the world position of this node.
+ MPoint wp;
+ MExt::GetWorldPosition( &wp, thisMObject() );
+
+ MPoint localPosNN( nnwp - wp );
+ MPoint localOrigin; // (0,0,0)
+
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+
+ GLExt::drawLine( localOrigin, localPosNN );
+
+
+ //Draw the LEFT / RIGHT line
+ MPoint wpMiddleOfLine = MExt::GetWorldPositionBetween( thisMObject(), nextPlug.node() );
+
+ MVector arrow;
+ if ( CalculateNormal( nnwp, &arrow ) )
+ {
+ MPoint arrowFrom( wpMiddleOfLine - wp );
+ double scale = ( localPosNN.distanceTo(localOrigin) / 6 );
+ if ( scale > 5 * TEConstants::Scale )
+ {
+ scale = 5 * TEConstants::Scale;
+ }
+
+ MPoint arrowTo( ( arrow * scale ) + arrowFrom );
+
+ GLExt::drawLine( arrowFrom, arrowTo, 5.0f );
+ }
+ }
+ }
+
+ if ( status == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kDormantColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE );
+
+ glPopAttrib();
+ view.endGL();
+}
+
+//==============================================================================
+// WallLocatorNode::NodeAboutToDeleteCallback
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MDGModifier& modifier, void* data )
+//
+// Return: void
+//
+//==============================================================================
+void WallLocatorNode::NodeAboutToDeleteCallback( MDGModifier& modifier, void* data )
+{
+ //
+ // Get the this pointer for the node being deleted.
+ //
+ WallLocatorNode* thisNode = (WallLocatorNode*)(data);
+ assert( thisNode );
+
+ //
+ // Get the MObject corresponding to this node.
+ //
+ MObject node = thisNode->thisMObject();
+
+ //Attach the neighbour nodes to eachother.
+ MObject nextNode;
+ MObject prevNode;
+
+ if ( MExt::IsConnected( node, mNextNode ) && MExt::IsConnected( node, mPrevNode ))
+ {
+ MStatus status;
+ MFnDependencyNode fnNode;
+ fnNode.setObject( node );
+
+ MPlug plug = fnNode.findPlug( mNextNode, &status );
+
+ MPlugArray pa;
+ plug.connectedTo( pa, false, true, &status );
+ assert( status );
+
+ MPlug nextPlug = pa[0];
+
+ nextNode = nextPlug.node();
+
+
+ fnNode.setObject( node );
+
+ plug = fnNode.findPlug( mPrevNode, &status );
+
+ plug.connectedTo( pa, true, false, &status );
+ assert( status );
+
+ MPlug prevPlug = pa[0];
+
+ prevNode = prevPlug.node();
+
+ //Remove all connections to this node.
+ MExt::DisconnectAll( node, mNextNode );
+ MExt::DisconnectAll( node, mPrevNode );
+
+
+ //Connect the nodes together... THANKS!
+ if ( prevNode != nextNode )
+ {
+ MExt::Connect( prevNode, WallLocatorNode::NEXTNODE_NAME_LONG, nextNode, WallLocatorNode::PREVNODE_NAME_LONG );
+ }
+ }
+
+ //
+ // cancel callback.
+ //
+ MStatus status;
+ MFnDependencyNode fnNode;
+ fnNode.setObject( node );
+
+ int id;
+ MPlug plug = fnNode.findPlug( mCallbackId, &status );
+ plug.getValue( id );
+
+ MMessage::removeCallback( id );
+}
+
+//==============================================================================
+// WallLocatorNode::CalculateNormal
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MPoint& nextNodeWP, MVector* normal )
+//
+// Return: bool
+//
+//==============================================================================
+bool WallLocatorNode::CalculateNormal( MPoint& nextNodeWP, MVector* normal )
+{
+ return CalculateNormal( thisMObject(), nextNodeWP, normal );
+}
+
+//==============================================================================
+// WallLocatorNode::CalculateNormal
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& thisNode, MPoint& nextNodeWP, MVector* normal )
+//
+// Return: bool
+//
+//==============================================================================
+bool WallLocatorNode::CalculateNormal( MObject& thisNode, MPoint& nextNodeWP, MVector* normal )
+{
+ //Get the world position of this node.
+ MPoint wp;
+ MExt::GetWorldPosition( &wp, thisNode );
+
+ MPoint localPosNN( nextNodeWP - wp );
+
+ MVector nextNode( localPosNN );
+
+ int isLeft = NONE;
+ MExt::Attr::Get( &isLeft, thisNode, mLeftRight );
+
+ if ( isLeft == LEFT )
+ {
+ MVector yUp( 0, -1.0f, 0 );
+ *normal = nextNode ^ yUp; //Cross product.
+ }
+ else if ( isLeft == RIGHT)
+ {
+ MVector yUp( 0, 1.0f, 0 );
+ *normal = nextNode ^ yUp; //Cross product.
+ }
+ else
+ {
+ return false;
+ }
+
+ normal->normalize();
+ return true;
+}
+
+//==============================================================================
+// WallLocatorNode::Export
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& wallLocatorNode, tlHistory& history )
+//
+// Return: tlDataChunk
+//
+//==============================================================================
+tlDataChunk* WallLocatorNode::Export( MObject& wallLocatorNode, tlHistory& history )
+{
+ MFnDagNode fnNode( wallLocatorNode );
+
+ if ( fnNode.typeId() == WallLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWallChunk* wall = new tlWallChunk;
+
+ MStatus st;
+ MPlugArray pa;
+ MPlug nextPlug = fnNode.findPlug( mNextNode, &st );
+ nextPlug.connectedTo( pa, false, true, &st );
+ assert( st );
+
+ //There is only one thing plugged into this...
+ MPlug nextNodePlug = pa[0];
+ MObject nextNode = nextNodePlug.node();
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, wallLocatorNode );
+
+ MPoint nextPosition;
+ MExt::GetWorldPosition( &nextPosition, nextNode );
+
+ MVector normal;
+ bool hasNormal = CalculateNormal( wallLocatorNode, nextPosition, &normal );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / TEConstants::Scale;
+ point[1] = thisPosition[1] / TEConstants::Scale;
+ point[2] = -thisPosition[2] / TEConstants::Scale; //Maya vs. P3D...
+ wall->SetStart( point );
+
+ point[0] = nextPosition[0] / TEConstants::Scale;
+ point[1] = nextPosition[1] / TEConstants::Scale;
+ point[2] = -nextPosition[2] / TEConstants::Scale; //Maya vs. P3D...
+ wall->SetEnd( point );
+
+ if ( hasNormal )
+ {
+ normal.normalize();
+ point[0] = normal[0];
+ point[1] = normal[1];
+ point[2] = -normal[2]; //Maya vs. P3D...
+ }
+ else
+ {
+ point[0] = 0;
+ point[1] = 0;
+ point[2] = 0;
+ }
+ wall->SetNormal( point );
+
+ return wall;
+ }
+
+ assert( false );
+ return NULL;
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/nodes/walllocator.h b/tools/trackeditor/code/nodes/walllocator.h
new file mode 100644
index 0000000..31d114c
--- /dev/null
+++ b/tools/trackeditor/code/nodes/walllocator.h
@@ -0,0 +1,69 @@
+#include "precompiled/PCH.h"
+
+#ifndef WALL_LOCATOR
+#define WALL_LOCATOR
+
+
+#include "main/constants.h"
+
+class tlDataChunk;
+
+class WallLocatorNode : public MPxLocatorNode
+{
+public:
+ WallLocatorNode();
+ ~WallLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual MStatus legalConnection ( const MPlug & plug, const MPlug & otherPlug, bool asSrc, bool& result ) const;
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& wallLocatorNode, tlHistory& history );
+ static bool CalculateNormal( MObject& thisNode, MPoint& nextNodeWP, MVector* normal );
+
+ static MTypeId id;
+ static const char* stringId;
+
+ //Custom to this object.
+ static const char* LEFTRIGHT_NAME_SHORT;
+ static const char* LEFTRIGHT_NAME_LONG;
+ static MObject mLeftRight;
+
+ enum
+ {
+ LEFT,
+ RIGHT,
+ NONE
+ };
+
+ static const char* PREVNODE_NAME_SHORT;
+ static const char* PREVNODE_NAME_LONG;
+ static MObject mPrevNode;
+
+ static const char* NEXTNODE_NAME_SHORT;
+ static const char* NEXTNODE_NAME_LONG;
+ static MObject mNextNode;
+
+ static const char* ID_NAME_SHORT;
+ static const char* ID_NAME_LONG;
+ static MObject mCallbackId;
+
+private:
+
+ static void NodeAboutToDeleteCallback( MDGModifier& modifier, void* data );
+ bool CalculateNormal( MPoint& nextNodeWP, MVector* normal );
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+};
+
+#endif \ No newline at end of file
diff --git a/tools/trackeditor/code/precompiled/PCH.cpp b/tools/trackeditor/code/precompiled/PCH.cpp
new file mode 100644
index 0000000..5f77b4a
--- /dev/null
+++ b/tools/trackeditor/code/precompiled/PCH.cpp
@@ -0,0 +1 @@
+#include "PCH.h" \ No newline at end of file
diff --git a/tools/trackeditor/code/precompiled/PCH.h b/tools/trackeditor/code/precompiled/PCH.h
new file mode 100644
index 0000000..f3cc7bf
--- /dev/null
+++ b/tools/trackeditor/code/precompiled/PCH.h
@@ -0,0 +1,68 @@
+#include <maya/M3dView.h>
+#include <maya/MAnimControl.h>
+#include <maya/MArgList.h>
+#include <maya/MAttributeIndex.h>
+#include <maya/MAttributeSpec.h>
+#include <maya/MAttributeSpecArray.h>
+#include <maya/MCursor.h>
+#include <maya/MDagPath.h>
+#include <maya/MDistance.h>
+#include <maya/MDGMessage.h>
+#include <maya/MDGModifier.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MDrawData.h>
+#include <maya/MDrawRequest.h>
+#include <maya/MEulerRotation.h>
+#include <maya/MFnCompoundAttribute.h>
+#include <maya/MFnData.h>
+#include <maya/MFnDagNode.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnEnumAttribute.h>
+#include <maya/MFnIkJoint.h>
+#include <maya/MFnIntArrayData.h>
+#include <maya/MFnMatrixData.h>
+#include <maya/MFnMesh.h>
+#include <maya/MFnMessageAttribute.h>
+#include <maya/MFnNumericAttribute.h>
+#include <maya/MFnSingleIndexedComponent.h>
+#include <maya/MFnStringArrayData.h>
+#include <maya/MFnTransform.h>
+#include <maya/MFnTypedAttribute.h>
+#include <maya/MGlobal.h>
+#include <maya/MIntArray.h>
+#include <maya/MItDag.h>
+#include <maya/MItDependencyNodes.h>
+#include <maya/MItMeshVertex.h>
+#include <maya/MItSelectionList.h>
+#include <maya/MMaterial.h>
+#include <maya/MMatrix.h>
+#include <maya/MNodeMessage.h>
+#include <maya/MObject.h>
+#include <maya/MObjectArray.h>
+#include <maya/MPlug.h>
+#include <maya/MPlugArray.h>
+#include <maya/MPoint.h>
+#include <maya/MPointArray.h>
+#include <maya/MPxCommand.h>
+#include <maya/MPxContext.h>
+#include <maya/MPxContextCommand.h>
+#include <maya/MPxGeometryIterator.h>
+#include <maya/MPxLocatorNode.h>
+#include <maya/MPxSurfaceShape.h>
+#include <maya/MPxSurfaceShapeUI.h>
+#include <maya/MQuaternion.h>
+#include <maya/MSelectionList.h>
+#include <maya/MSelectionMask.h>
+#include <maya/MStatus.h>
+#include <maya/MString.h>
+#include <maya/MStringArray.h>
+#include <maya/MTransformationMatrix.h>
+#include <maya/MTime.h>
+#include <maya/MTypeId.h>
+#include <maya/MUiMessage.h>
+#include <maya/MVector.h>
+
+#include "toollib.hpp"
+
+#include <assert.h> \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_BVContext.mel b/tools/trackeditor/code/scripts/te_BVContext.mel
new file mode 100644
index 0000000..e835468
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_BVContext.mel
@@ -0,0 +1,43 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_BVContext.mel
+//
+// Description: Defines all the scripts required by the BVContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartBVLoop()
+{
+ //Start the BV context...
+ if ( ! `contextInfo -exists BVCtx` )
+ {
+ BVContext BVCtx;
+ }
+
+ setToolTo BVCtx;
+}
+
+global proc te_MCB_SplitSelectedBV()
+{
+ //Call the API function.
+ BVSplitSelected();
+}
+
+global proc te_Delete_BVContext()
+{
+ if ( `contextInfo -exists BVCtx` )
+ {
+ deleteUI -toolContext BVCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_IntersectionContext.mel b/tools/trackeditor/code/scripts/te_IntersectionContext.mel
new file mode 100644
index 0000000..54561ff
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_IntersectionContext.mel
@@ -0,0 +1,212 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_IntersectionContext.mel
+//
+// Description: Defines all the scripts required by the IntersectionContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartIntersection()
+{
+ //Start the Intersection context...
+ if ( ! `contextInfo -exists IntersectionCtx` )
+ {
+ IntersectionContext IntersectionCtx;
+ }
+
+ setToolTo IntersectionCtx;
+}
+
+global string $gSelectedIntersection = "";
+global int $gIntersectionSelectionCallbackID = 0;
+global string $gSelectedName;
+global string $gTypeField;
+global string $gIntersectionTypes[] = { "NoStop", "NWay", "FourWay", "NoStopN", "NWayN" };
+
+global proc te_MCB_EditIntersection()
+{
+ global string $gSelectedName;
+ global int $gIntersectionSelectionCallbackID;
+ global string $gIntersectionTypes[];
+ global string $gTypeField;
+
+ if ( `window -exists TE_InteresctionEditor` )
+ {
+ deleteUI -window TE_IntersectionEditor;
+ }
+
+ window -rtf true -title "TE Road / Intersection Editor" TE_IntersectionEditor;
+
+ columnLayout -adjustableColumn true;
+
+ $gSelectedName = `textField -editable false -text "" -width 170`;
+
+ $gTypeField = `optionMenu -label "Type" -width 170 -changeCommand ("te_MCB_IntersectionTypeChange( \"#1\" )")`;
+
+ int $index;
+ int $size = size($gIntersectionTypes);
+ for ( $index = 0; $index < $size; $index++ )
+ {
+ menuItem -label $gIntersectionTypes[ $index ];
+ }
+ setParent ..;
+
+ button -label "Create Road" -command ( "te_MCB_CreateRoadFromSelected()" );
+ button -label "Show Whole Road" -command ( "te_MCB_ShowRoadFromSelected()" );
+ button -label "Destroy Road" -command ( "te_MCB_DestroyRoadFromSelected()" );
+ button -label "Set Intersection Start" -command ( "te_MCB_AddSelectedIntersectionToRoad( 0 )" );
+ button -label "Set Intersection End" -command ( "te_MCB_AddSelectedIntersectionToRoad( 1 )" );
+ separator;
+ button -label "Create Intersections" -command "te_MCB_StartIntersection()";
+
+ setParent ..;
+
+ showWindow;
+
+ //Create the selection change callback.
+ $gIntersectionSelectionCallbackID = `scriptJob -parent "TE_IntersectionEditor" -event "SelectionChanged" "te_UpdateIntersectionEditor()"`;
+
+}
+
+global proc te_MCB_IntersectionTypeChange( string $value )
+{
+ global string $gSelectedIntersection;
+
+ if ( $gSelectedIntersection != "" )
+ {
+ setAttr ( $gSelectedIntersection + ".IntersectionType" ) -type "string" $value;
+ }
+}
+
+global proc te_CloseIntersectionEditorWindow()
+{
+ global int $gIntersectionSelectionCallbackID;
+
+ if ( `window -exists TE_InteresctionEditor` )
+ {
+ deleteUI -window TE_IntersectionEditor;
+ }
+
+ $gIntersectionSelectionCallbackID = 0;
+}
+
+global proc te_UpdateIntersectionEditor()
+{
+ global string $gSelectedIntersection;
+ global string $gSelectedName;
+ global string $gTypeField;
+ global string $gIntersectionTypes[];
+
+ string $selectedObjects[] = `ls -sl -dag`;
+ string $selectedObjectName = $selectedObjects[0];
+ string $selectedNodeType;
+
+ if ( $selectedObjectName != "" )
+ {
+ //There is something selected
+
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "transform" )
+ {
+ //We don't want the transform, we want the child node.
+ string $children[] = `listRelatives -c $selectedObjectName`;
+ $selectedObjectName = $children[0];
+ }
+
+ if ( $selectedObjectName != "" )
+ {
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "IntersectionLocatorNode" )
+ {
+ //We're in business
+ textField -edit -text $selectedObjectName $gSelectedName;
+
+ string $value = `getAttr ( $selectedObjectName + ".IntersectionType" )`;
+
+ //Which index is this string?
+ int $size = size( $gIntersectionTypes );
+ int $index;
+
+ for ( $index = 0; $index < $size; $index++ )
+ {
+ if ( $gIntersectionTypes[ $index ] == $value )
+ {
+ optionMenu -edit -sl ($index + 1) $gTypeField;
+ break;
+ }
+ }
+
+ if ( $index == $size )
+ {
+ //This node had no proper setting. Resetting it.
+ warning "Node had invalid type setting. Correcting to default type";
+
+ optionMenu -edit -sl 1 $gTypeField;
+ setAttr ( $selectedObjectName + ".IntersectionType" ) -type "string" $gIntersectionTypes[ 0 ];
+ }
+
+ $gSelectedIntersection = $selectedObjectName;
+ return;
+ }
+ else if ( $selectedNodeType == "mesh" )
+ {
+ //This is for adding road to the selected intersection. Do not unselect the intersection.
+ string $whichRoad[] = `listAttr -st teWhichRoad $selectedObjectName`;
+
+ if ( size( $whichRoad ) )
+ {
+ return;
+ }
+ }
+ }
+ }
+
+ textField -edit -text "" $gSelectedName;
+ $gSelectedIntersection = "";
+
+}
+
+
+
+global proc te_MCB_CreateRoadFromSelected()
+{
+ TE_CreateRoad();
+}
+
+global proc te_MCB_ShowRoadFromSelected()
+{
+ TE_ShowRoad();
+}
+
+global proc te_MCB_DestroyRoadFromSelected()
+{
+ TE_DestroyRoad();
+}
+
+global proc te_MCB_AddSelectedIntersectionToRoad( int $isEnd )
+{
+ global string $gSelectedIntersection;
+
+ TE_AddIntersectionToRoad( $gSelectedIntersection, $isEnd );
+}
+
+global proc te_Delete_IntersectionContext()
+{
+ if ( `contextInfo -exists IntersectionCtx` )
+ {
+ deleteUI -toolContext IntersectionCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_PPContext.mel b/tools/trackeditor/code/scripts/te_PPContext.mel
new file mode 100644
index 0000000..a8cc63f
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_PPContext.mel
@@ -0,0 +1,43 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_PPContext.mel
+//
+// Description: Defines all the scripts required by the PPContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the bv context tool.
+
+global proc te_MCB_StartPPLoop()
+{
+ //Start the PP context...
+ if ( ! `contextInfo -exists PPCtx` )
+ {
+ PPContext PPCtx;
+ }
+
+ setToolTo PPCtx;
+}
+
+global proc te_MCB_SplitSelectedPP()
+{
+ //Call the API function.
+ PPSplitSelected();
+}
+
+global proc te_Delete_PPContext()
+{
+ if ( `contextInfo -exists PPCtx` )
+ {
+ deleteUI -toolContext PPCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_cleanup.mel b/tools/trackeditor/code/scripts/te_cleanup.mel
new file mode 100644
index 0000000..21f39d3
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_cleanup.mel
@@ -0,0 +1,12 @@
+te_Delete_TreeLineContext();
+te_Delete_BVContext();
+te_Delete_PPContext();
+te_Delete_IntersectionContext();
+te_CloseIntersectionEditorWindow();
+
+if ( `menu -exists te_MainMenu` )
+{
+ deleteUI te_MainMenu;
+
+ flushUndo;
+}
diff --git a/tools/trackeditor/code/scripts/te_editorwindow.mel b/tools/trackeditor/code/scripts/te_editorwindow.mel
new file mode 100644
index 0000000..1504a52
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_editorwindow.mel
@@ -0,0 +1,335 @@
+//Constant
+global int $gMAX_LANES = 4;
+
+global string $gSelectedName;
+global string $gOriginField;
+global string $gRoadField;
+global string $gTopField;
+global string $gBottomField;
+global string $gLanesField;
+global string $gShoulderField;
+
+global int $gSelectionScriptJob;
+
+global string $gSelectedObjectName;
+
+global proc teOpenEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gLanesField;
+ global string $gShoulderField;
+ global int $gMAX_LANES;
+
+
+ if ( `window -exists TE_TileEditor` )
+ {
+ deleteUI -window TE_TileEditor;
+ }
+
+ window -rtf true -title "TE Tile Editor" TE_TileEditor;
+
+ columnLayout -adjustableColumn true;
+
+ string $selectedRow = `rowLayout -numberOfColumns 3 -columnWidth 1 170`;
+ $gSelectedName = `textField -editable false -text "" -width 170`;
+ string $selectedButton = `button -label "Select Mesh" -command ("teSelectMesh()")`;
+ string $doneButton = `button -label "Done" -command ("teDoneEditingMesh()")`;
+
+ setParent ..;
+
+ string $originRow = `rowLayout -numberOfColumns 2`;
+ string $originButton = `button -label "Set Origin" -command ("teSelectOrigin()")`;
+ $gOriginField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $roadRow = `rowLayout -numberOfColumns 2`;
+ string $roadButton = `button -label "Set Road Dir" -command ("teSelectRoadDir()")`;
+ $gRoadField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $topRow = `rowLayout -numberOfColumns 2`;
+ string $topButton = `button -label "Set TOP" -command ("teSelectTOP()")`;
+ $gTopField = `intField -value -1 -editable false`;
+ setParent ..;
+
+
+ string $bottomRow = `rowLayout -numberOfColumns 2`;
+ string $bottomButton = `button -label "Set BOTTOM" -command ("teSelectBOTTOM()")`;
+ $gBottomField = `intField -value -1 -editable false`;
+ setParent ..;
+
+ //The following #1 is a trick that the scripting system converts into the value of the field/control...
+ string $laneRow = `rowLayout -numberOfColumns 2`;
+ string $laneLabel = `text -label "Num. Lanes" -align "center"`;
+ $gLanesField = `intField -value 1 -min 0 -max $gMAX_LANES -step 1 -editable true -changeCommand ("teSetNumLanes(#1)")`;
+ setParent ..;
+
+ $gShoulderField = `checkBox -label "Has Shoulder" -value true -changeCommand ("teSetShoulder(#1)")`;
+
+ setParent ..; //columnLayout
+
+ showWindow;
+}
+
+global proc teCloseEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gLanesField;
+ global string $gShoulderField;
+
+ global int $gSelectionScriptJob;
+
+ if ( `window -exists TE_TileEditor` )
+ {
+ deleteUI -window TE_TileEditor;
+ }
+
+ $gSelectedName = "";
+ $gOriginField = "";
+ $gRoadField = "";
+ $gTopField = "";
+ $gBottomField = "";
+ $gLanesField = "";
+ $gShoulderField = "";
+
+ $gSelectionScriptJob = 0;
+}
+
+global proc teSelectMesh()
+{
+ global string $gSelectedName;
+ global int $gSelectionScriptJob;
+ global string $gSelectedObjectName;
+
+ //May want to inform the TrackEditor of this selection if it is good.
+ string $selectedObjects[] = `ls -sl -dag`;
+ string $selectedObjectName = $selectedObjects[0];
+ string $selectedNodeType;
+
+ if ( $selectedObjectName != "" )
+ {
+ //There is something selected
+
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "transform" )
+ {
+ //We don't want the transform, we want the child node.
+ $selectedObjectName = $selectedObjects[1];
+ }
+
+ if ( $selectedObjectName != "" )
+ {
+ $selectedNodeType = `nodeType $selectedObjectName `;
+
+ if ( $selectedNodeType == "mesh" )
+ {
+ //We're in business
+ textField -edit -text $selectedObjectName $gSelectedName;
+
+ teSwitchToVertexSelection( 1 ); //Turn on vertex selection.
+
+ teAddSettingsToObject( $selectedObjectName );
+
+ $gSelectedObjectName = $selectedObjectName;
+
+ teUpdateEditorWindow();
+ }
+ }
+ }
+}
+
+global proc teUpdateEditorWindow()
+{
+ global string $gSelectedName;
+ global string $gOriginField;
+ global string $gRoadField;
+ global string $gTopField;
+ global string $gBottomField;
+ global string $gSelectedObjectName;
+ global string $gLanesField;
+ global string $gShoulderField;
+
+ //Update the fields according to the selected object.
+
+ int $valsSet = false;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ string $attr[] = `listAttr -st teOrigin $gSelectedObjectName`;
+
+ if ( $attr[0] != "" )
+ {
+ textField -edit -text $gSelectedObjectName $gSelectedName;
+
+ float $origin = `getAttr ($gSelectedObjectName + ".teOrigin")`;
+ intField -edit -value $origin $gOriginField;
+
+ float $road = `getAttr ($gSelectedObjectName + ".teRoad")`;
+ intField -edit -value $road $gRoadField;
+
+ float $top = `getAttr ($gSelectedObjectName + ".teTop")`;
+ intField -edit -value $top $gTopField;
+
+ float $bottom = `getAttr ($gSelectedObjectName + ".teBottom")`;
+ intField -edit -value $bottom $gBottomField;
+
+ int $lanes = `getAttr ($gSelectedObjectName + ".teLanes")`;
+ intField -edit -value $lanes $gLanesField;
+
+ int $hasShoulder = `getAttr ($gSelectedObjectName + ".teShoulder")`;
+ checkBox -edit -value $hasShoulder $gShoulderField;
+
+ $valsSet = 1;
+ }
+ }
+
+ if ( !$valsSet )
+ {
+ textField -edit -text "" $gSelectedName;
+
+ intField -edit -value -1 $gOriginField;
+ intField -edit -value -1 $gRoadField;
+ intField -edit -value -1 $gTopField;
+ intField -edit -value -1 $gBottomField;
+ intField -edit -value 0 $gLanesField;
+ checkBox -edit -value false $gShoulderField;
+ }
+}
+
+global proc teSwitchToVertexSelection( int $on )
+{
+ if ( $on )
+ {
+ selectMode -component;
+ selectType -vertex true;
+ }
+ else
+ {
+ selectMode -object;
+ }
+}
+
+global proc teDoneEditingMesh()
+{
+ global string $gSelectedObjectName;
+
+ $gSelectedObjectName = ""; //Clear the selection.
+
+ teSwitchToVertexSelection( 0 ); //Turn on vertex selection.
+
+ teUpdateEditorWindow();
+}
+
+global proc teAddSettingsToObject( string $objectName )
+{
+ string $attr[] = `listAttr -st teOrigin $objectName`;
+
+ if ( $attr[0] == "" )
+ {
+ addAttr -ln teOrigin -sn teO -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teRoad -sn teR -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teTop -sn teT -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teBottom -sn teB -at long -defaultValue -1 $objectName;
+
+ addAttr -ln teLanes -sn teL -at long -defaultValue 1 $objectName;
+
+ addAttr -ln teShoulder -sn teS -at bool -defaultValue true $objectName;
+
+ //This is for connecting to roads
+ addAttr -ln teWhichRoad -sn teWR -at message $objectName;
+
+ //This is a hint of the type
+ addAttr -ln teTypeHint -sn teTH -at long -defaultValue -1 $objectName;
+ }
+}
+
+global proc teSelectOrigin()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teOrigin" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectRoadDir()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teRoad" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectTOP()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teTop" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+global proc teSelectBOTTOM()
+{
+ global string $gSelectedObjectName;
+
+ int $pos = `TE_GetSelectedVertexIndex`;
+
+ if ( $pos >= 0 )
+ {
+ setAttr ( $gSelectedObjectName + ".teBottom" ) $pos;
+ }
+
+ teUpdateEditorWindow();
+}
+
+
+global proc teSetNumLanes( int $numLanes )
+{
+ global string $gSelectedObjectName;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ setAttr ( $gSelectedObjectName + ".teLanes" ) $numLanes;
+ }
+}
+
+global proc teSetShoulder( int $hasShoulder )
+{
+ global string $gSelectedObjectName;
+
+ if ( $gSelectedObjectName != "" )
+ {
+ setAttr ( $gSelectedObjectName + ".teShoulder" ) $hasShoulder;
+ }
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_globals.mel b/tools/trackeditor/code/scripts/te_globals.mel
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_globals.mel
@@ -0,0 +1 @@
+
diff --git a/tools/trackeditor/code/scripts/te_main.mel b/tools/trackeditor/code/scripts/te_main.mel
new file mode 100644
index 0000000..6a97582
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_main.mel
@@ -0,0 +1,195 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// TE_main.mel
+//
+// Description: Installs the Terrain Editor (TE) interface.
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created Apr 11, 2001 -- bkusy
+// + Stolen & Adapted -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// t e _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// t e _ M C B _ A b o u t
+//
+// Synopsis: Display an About Terrain Editor window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_MCB_About()
+{
+// string $pluginVersion = `te_GetVersion`;
+
+ string $pluginVersion = "2.0";
+
+ string $message = ( "\nSimpsons Road Rage Terrain Editor.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About Terrain Editor"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// t e _ d o M a i n M e n u I t e m s
+//
+// Synopsis: Creates the TE menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_doMainMenuItems( string $menu )
+{
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Bounding Fences" -sm true;
+
+ menuItem -label "Create fence line" -command "te_MCB_StartBVLoop()";
+
+ menuItem -label "Split Fence(s)" -command "te_MCB_SplitSelectedBV()";
+
+ setParent -menu ..;
+
+ menuItem -label "Pedestrian Paths" -sm true;
+
+ menuItem -label "Create path line" -command "te_MCB_StartPPLoop()";
+
+ menuItem -label "Split Path(s)" -command "te_MCB_SplitSelectedPP()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Track Editor" -sm true;
+
+ radioMenuItemCollection;
+
+ menuItem -label "Off" -radioButton on -command "TE_StateChange(0)";
+
+ menuItem -label "Edit Mode" -radioButton off -command "TE_StateChange(1)";
+
+ menuItem -label "Display Mode" -radioButton off -command "TE_StateChange(2)";
+
+ menuItem -divider true;
+
+ menuItem -label "Create Intersections" -command "te_MCB_StartIntersection()";
+
+ menuItem -label "Edit Roads / Intersections" -command "te_MCB_EditIntersection()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Tree Line Tool" -allowOptionBoxes true -sm true;
+
+ menuItem -label "Create Tree Lines" -command "te_MCB_CreateTreeLines()";
+
+ menuItem -label "Options" -optionBox true -command "te_MCB_TreelineOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Selected Treelines" -command "te_MCB_SnapTreelines()";
+
+ menuItem -divider true;
+
+ menuItem -label "Convert Treelines to Geometry" -command "te_MCB_ConvertToGeometry()";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Export" -command "te_MCB_Export()";
+
+ menuItem -optionBox true -command "TE_ExportOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "te_MCB_About()";
+
+ setParent -m ..;
+}
+
+//-----------------------------------------------------------------------------
+// t e _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc te_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install TE menu as a root menu.
+ //
+ if ( `menu -exists te_MainMenu` ) deleteUI te_MainMenu;
+ menu -label "Track Editor" -allowOptionBoxes true -parent $gMainWindow te_MainMenu;
+
+ te_doMainMenuItems "te_MainMenu";
+}
+
+global proc te_MCB_Export()
+{
+ $whichCtx = `currentCtx`;
+
+ if ( $whichCtx != "" )
+ {
+ ctxCompletion;
+ }
+
+ TE_Export();
+}
+
+source "te_globals.mel";
+source "te_setup.mel";
+source "te_BVContext.mel";
+source "te_PPContext.mel";
+source "te_treelineContext.mel";
+source "te_IntersectionContext.mel";
+source "te_editorWindow.mel";
+source "AETEShowRoadSegButton.mel";
+
+evalDeferred "te_InstallUI"; \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_setup.mel b/tools/trackeditor/code/scripts/te_setup.mel
new file mode 100644
index 0000000..d5ca442
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_setup.mel
@@ -0,0 +1,15 @@
+//Create the TrackEditorNode.
+
+
+global proc te_Create_TrackEditorNode()
+{
+ if ( !(`objExists TrackEditorNode`) )
+ {
+ createNode "transform" -n "TrackEditorNode";
+ createNode "transform" -n "Fences" -p "TrackEditorNode";
+ createNode "transform" -n "Roads" -p "TrackEditorNode";
+ createNode "transform" -n "Intersections" -p "TrackEditorNode";
+ createNode "transform" -n "Treelines" -p "TrackEditorNode";
+ createNode "transform" -n "PedPaths" -p "TrackEditorNode";
+ }
+} \ No newline at end of file
diff --git a/tools/trackeditor/code/scripts/te_treelineContext.mel b/tools/trackeditor/code/scripts/te_treelineContext.mel
new file mode 100644
index 0000000..c8120ab
--- /dev/null
+++ b/tools/trackeditor/code/scripts/te_treelineContext.mel
@@ -0,0 +1,84 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// te_treelineContext.mel
+//
+// Description: Defines all the scripts required by the TreeLineContext tool
+// As a convention all Terrain Editor global procedures
+// and global variables are prefixed with "te_". All commands
+// exposed through TE plugins are prefixed with "TE_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//This is the global instance of the tree line context tool.
+
+global proc te_MCB_CreateTreeLines()
+{
+ //Start the tree line context...
+ if ( ! `contextInfo -exists TreeLineCtx` )
+ {
+ TreeLineContext TreeLineCtx;
+ }
+
+ setToolTo TreeLineCtx;
+}
+
+global proc te_Delete_TreeLineContext()
+{
+ if ( `contextInfo -exists TreeLineCtx` )
+ {
+ deleteUI -toolContext TreeLineCtx;
+ }
+}
+
+global proc te_MCB_SnapTreelines()
+{
+ TE_SnapSelectedTreelines();
+}
+
+global proc te_MCB_ConvertToGeometry()
+{
+ string $whichCtx = `currentCtx`;
+
+ if ( $whichCtx == "TreeLineCtx" )
+ {
+ ctxAbort;
+ }
+
+ TE_ConvertTreelineToGeometry();
+}
+
+global int $gDeleteTreelines = true;
+
+global proc te_MCB_TreelineOptions()
+{
+ global int $gDeleteTreelines;
+
+ if ( `window -exists TE_TreelineOptions` )
+ {
+ deleteUI -window TE_TreelineOptions;
+ }
+
+ window -rtf true -title "TE Treeline Options" TE_TreelineOptions;
+
+ columnLayout -adjustableColumn true;
+
+ checkBox -label "Delete Treelines" -value $gDeleteTreelines -cc "te_BCB_SetDeleteTreelines(#1)";
+
+ setParent ..;
+
+ showWindow;
+}
+
+global proc te_BCB_SetDeleteTreelines( int $delete )
+{
+ global int $gDeleteTreelines;
+
+ $gDeleteTreelines = $delete;
+ TE_SetDeleteTreeline($delete);
+}
diff --git a/tools/worldbuilder/build/Debug/worldbuilder.log b/tools/worldbuilder/build/Debug/worldbuilder.log
new file mode 100644
index 0000000..c02224f
--- /dev/null
+++ b/tools/worldbuilder/build/Debug/worldbuilder.log
@@ -0,0 +1,8 @@
+Build started 11/7/2015 5:44:31 PM.
+ 1>Project "G:\Code\Simpsons Hit&Run\tools\worldbuilder\build\worldbuilder.vcxproj" on node 3 (Build target(s)).
+ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(369,5): error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.
+ 1>Done Building Project "G:\Code\Simpsons Hit&Run\tools\worldbuilder\build\worldbuilder.vcxproj" (Build target(s)) -- FAILED.
+
+Build FAILED.
+
+Time Elapsed 00:00:00.05
diff --git a/tools/worldbuilder/build/worldbuilder.dsp b/tools/worldbuilder/build/worldbuilder.dsp
new file mode 100644
index 0000000..bdfb38a
--- /dev/null
+++ b/tools/worldbuilder/build/worldbuilder.dsp
@@ -0,0 +1,1739 @@
+# Microsoft Developer Studio Project File - Name="worldbuilder" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 60000
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=worldbuilder - Win32 Tools Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "worldbuilder.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "worldbuilder.mak" CFG="worldbuilder - Win32 Tools Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "worldbuilder - Win32 Tools Debug" (based on "Win32 (x86) Application")
+!MESSAGE "worldbuilder - Win32 Tools Release" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "worldbuilder"
+# PROP Scc_LocalPath "."
+CPP=snCl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "worldbuilder___Win32_Tools_Debug"
+# PROP BASE Intermediate_Dir "worldbuilder___Win32_Tools_Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "C:\AW\Maya4.0\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /YX"precompiled\\" /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /GR /GX /ZI /Od /I "..\..\..\game\libs" /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /I "..\..\..\game\libs\pure3d\\" /I "..\..\..\game\libs\radcore\inc" /I "..\..\..\game\code\constants" /I "..\..\..\game\code" /I "..\..\..\game\libs\radcontent\inc" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_PC" /D "RAD_WIN32" /D "RAD_DEBUG" /D "WORLD_BUILDER" /FR /YX"precompiled\PCH.h" /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL"
+BSC32=snBsc.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\myCmd.mll" /pdbtype:sept /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 dxguid.lib user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib WS2_32.LIB /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug\worldbuilder.mll" /pdbtype:sept /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /libpath:"..\..\..\game\libs\pure3d\sdks\dx8\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy worldbuilder.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Debug\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderd.mll copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# PROP BASE Use_MFC 2
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "worldbuilder___Win32_Tools_Release"
+# PROP BASE Intermediate_Dir "worldbuilder___Win32_Tools_Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 2
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /I "C:\AW\Maya4.0\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /I "..\..\..\game\libs" /I "..\..\..\game\libs\pure3d\sdks\Maya4_0\include\\" /I "..\code\\" /I "..\..\..\game\libs\pure3d\toollib\inc" /I "..\..\..\game\libs\pure3d\toollib\chunks16\inc" /I "." /I "..\..\..\game\libs\pure3d\constants" /I "..\..\globalcode" /I "..\..\..\game\libs\radmath" /I "..\..\..\game\libs\pure3d\\" /I "..\..\..\game\libs\radcore\inc" /I "..\..\..\game\code\constants" /I "..\..\..\game\code" /I "..\..\..\game\libs\radcontent\inc" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /D "NT_PLUGIN" /D "RAD_PC" /D "RAD_WIN32" /D "RAD_RELEASE" /D "WORLD_BUILDER" /FAs /YX"precompiled\PCH.h" /FD /c
+# SUBTRACT CPP /Fr
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL"
+BSC32=snBsc.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=snLink.exe
+# ADD BASE LINK32 Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release\myCmd.mll" /libpath:"C:\AW\Maya4.0\lib" /export:initializePlugin /export:uninitializePlugin
+# ADD LINK32 dxguid.lib user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib WS2_32.LIB /nologo /subsystem:windows /dll /machine:I386 /out:"Release\worldbuilder.mll" /libpath:"..\..\..\game\libs\pure3d\sdks\Maya4_0\lib" /libpath:"..\..\..\game\libs\pure3d\sdks\dx8\lib" /export:initializePlugin /export:uninitializePlugin
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy worldbuilder.mll to Distribution and Maya dir.
+PostBuild_Cmds=copy .\Release\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderr.mll copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "worldbuilder - Win32 Tools Debug"
+# Name "worldbuilder - Win32 Tools Release"
+# Begin Group "main"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\main\constants.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\pluginMain.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\toolhack.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\worldbuilder.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\main\worldbuilder.h
+# End Source File
+# End Group
+# Begin Group "commands"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\commands\export.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\export.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\worldbuildercommands.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\commands\worldbuildercommands.h
+# End Source File
+# End Group
+# Begin Group "nodes"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\nodes\actioneventlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\actioneventlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\breakablecameralocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\breakablecameralocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\carstartlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\carstartlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\directionallocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\directionallocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\eventlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\eventlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\fovlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\fovlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\genericlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\genericlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\interiorentrancelocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\interiorentrancelocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\occlusionlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\occlusionlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\pedgrouplocator.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\pedgrouplocator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\railcamlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\railcamlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\scriptlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\scriptlocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\splinelocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\splinelocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\staticcameralocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\staticcameralocatornode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\triggertypes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\triggervolumenode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\triggervolumenode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\wbspline.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\wbspline.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\zoneeventlocatornode.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\nodes\zoneeventlocatornode.h
+# End Source File
+# End Group
+# Begin Group "contexts"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\contexts\locatorcontext.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\locatorcontext.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\triggercontext.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\contexts\triggercontext.h
+# End Source File
+# End Group
+# Begin Group "utility"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\GLExt.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\GLExt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\mayahandles.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MExt_template.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\MUI.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\nodehelper.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\stdafx.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\transformmatrix.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\transformmatrix.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\globalcode\utility\util.h
+# End Source File
+# End Group
+# Begin Group "mel scripts"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_cleanup.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_cleanup.mel
+InputName=wb_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_cleanup.mel
+InputName=wb_cleanup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_coinsplines.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_coinsplines.mel
+InputName=wb_coinsplines
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_coinsplines.mel
+InputName=wb_coinsplines
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_locator.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_locator.mel
+InputName=wb_locator
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_locator.mel
+InputName=wb_locator
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_main.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_main.mel
+InputName=wb_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_main.mel
+InputName=wb_main
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_setup.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_setup.mel
+InputName=wb_setup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_setup.mel
+InputName=wb_setup
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\scripts\wb_splines.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_splines.mel
+InputName=wb_splines
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install)
+InputPath=..\code\scripts\wb_splines.mel
+InputName=wb_splines
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\others\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "precompiled header"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.cpp
+# ADD BASE CPP /Yc"PCH.h"
+# ADD CPP /Yc"PCH.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\precompiled\PCH.h
+# End Source File
+# End Group
+# Begin Group "resources"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\resources\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\resources\resource.rc
+# End Source File
+# End Group
+# Begin Group "AETemplates"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel
+InputName=AEActionEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel
+InputName=AEActionEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel
+InputName=AEBreakableCameraLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel
+InputName=AEBreakableCameraLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AECarStartLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AECarStartLocatorNodeTemplate.mel
+InputName=AECarStartLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AECarStartLocatorNodeTemplate.mel
+InputName=AECarStartLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel
+InputName=AEDirectionalLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel
+InputName=AEDirectionalLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEEventLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEEventLocatorNodeTemplate.mel
+InputName=AEEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEEventLocatorNodeTemplate.mel
+InputName=AEEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEFOVLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEFOVLocatorNodeTemplate.mel
+InputName=AEFOVLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEFOVLocatorNodeTemplate.mel
+InputName=AEFOVLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEGenericLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEGenericLocatorNodeTemplate.mel
+InputName=AEGenericLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEGenericLocatorNodeTemplate.mel
+InputName=AEGenericLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel
+InputName=AEInteriorEntranceLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel
+InputName=AEInteriorEntranceLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel
+InputName=AEOcclusionLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel
+InputName=AEOcclusionLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEPedGroupLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEPedGroupLocatorNodeTemplate.mel
+InputName=AEPedGroupLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEPedGroupLocatorNodeTemplate.mel
+InputName=AEPedGroupLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AERailCamLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AERailCamLocatorNodeTemplate.mel
+InputName=AERailCamLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AERailCamLocatorNodeTemplate.mel
+InputName=AERailCamLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEScriptLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEScriptLocatorNodeTemplate.mel
+InputName=AEScriptLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEScriptLocatorNodeTemplate.mel
+InputName=AEScriptLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AESplineLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AESplineLocatorNodeTemplate.mel
+InputName=AESplineLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AESplineLocatorNodeTemplate.mel
+InputName=AESplineLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel
+InputName=AEStaticCameraLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel
+InputName=AEStaticCameraLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AETriggerVolumeNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETriggerVolumeNodeTemplate.mel
+InputName=AETriggerVolumeNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AETriggerVolumeNodeTemplate.mel
+InputName=AETriggerVolumeNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEWBLocatorSuppress.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBLocatorSuppress.mel
+InputName=AEWBLocatorSuppress
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBLocatorSuppress.mel
+InputName=AEWBLocatorSuppress
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEWBSelectTarget.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBSelectTarget.mel
+InputName=AEWBSelectTarget
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBSelectTarget.mel
+InputName=AEWBSelectTarget
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEWBTriggerButton.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBTriggerButton.mel
+InputName=AEWBTriggerButton
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEWBTriggerButton.mel
+InputName=AEWBTriggerButton
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel
+
+!IF "$(CFG)" == "worldbuilder - Win32 Tools Debug"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel
+InputName=AEZoneEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "worldbuilder - Win32 Tools Release"
+
+# Begin Custom Build - Copy $(InputPath) to Maya (dist and install) Templates
+InputPath=..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel
+InputName=AEZoneEventLocatorNodeTemplate
+
+BuildCmds= \
+ copy $(InputPath) C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel \
+ copy $(InputPath) ..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel \
+
+
+"C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "SuperCam"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\icamerashaker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\isupercamtarget.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\railcam.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\railcam.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\sinecosshaker.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\sinecosshaker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\staticcam.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\staticcam.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\supercam.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\supercam.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\supercamcontroller.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\camera\supercamcontroller.h
+# End Source File
+# End Group
+# Begin Group "TriggerVolumes"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\locator.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\locator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\recttriggervolume.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\recttriggervolume.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\spheretriggervolume.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\spheretriggervolume.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\triggerlocator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\triggervolume.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\triggervolume.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\triggervolumetracker.h
+# End Source File
+# End Group
+# Begin Group "game engine"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\code\gameengine\gameengine.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\gameengine\gameengine.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\gameengine\mayacamera.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\gameengine\mayacamera.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\gameengine\wbcamtarget.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\code\gameengine\wbcamtarget.h
+# End Source File
+# End Group
+# Begin Group "from game"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\..\game\code\ai\actionnames.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\button.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\button.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\worldsim\character\charactercontroller.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\main\commandlineoptions.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\controller.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\gamedata.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\gamedatamanager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\gamedatamanager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\render\DSG\IEntityDSG.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\render\DSG\IEntityDSG.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\inputmanager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\inputmanager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\locatorevents.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\meta\locatortypes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\mappable.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\mappable.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\mapper.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\mapper.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\memcard\memorycardmanager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\memcard\memorycardmanager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\rumbleeffect.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\rumbleeffect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\rumblexbox.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\savegameinfo.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\data\savegameinfo.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\usercontroller.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\usercontroller.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\game\code\input\virtualinputs.cpp
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\code\resources\icon1.ico
+# End Source File
+# End Target
+# End Project
diff --git a/tools/worldbuilder/build/worldbuilder.vcproj b/tools/worldbuilder/build/worldbuilder.vcproj
new file mode 100644
index 0000000..f4119ba
--- /dev/null
+++ b/tools/worldbuilder/build/worldbuilder.vcproj
@@ -0,0 +1,1010 @@
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.00"
+ Name="worldbuilder"
+ SccProjectName="Perforce Project"
+ SccAuxPath=""
+ SccLocalPath="."
+ SccProvider="MSSCCI:Perforce SCM"
+ Keyword="MFCProj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Tools Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\include\,..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath,..\..\..\game\libs\pure3d\,..\..\..\game\libs\radcore\inc,..\..\..\game\code\constants,..\..\..\game\code,..\..\..\game\libs\radcontent\inc"
+ PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_PC;RAD_WIN32;RAD_RELEASE;WORLD_BUILDER"
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ RuntimeTypeInfo="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="precompiled\PCH.h"
+ PrecompiledHeaderFile=".\Release/worldbuilder.pch"
+ AssemblerOutput="4"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib WS2_32.LIB"
+ OutputFile="Release\worldbuilder.mll"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ IgnoreDefaultLibraryNames="LIBC.lib;LIBCMT.lib;LIBCPMT.lib"
+ ProgramDatabaseFile=".\Release/worldbuilder.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Release/worldbuilder.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/worldbuilder.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy worldbuilder.mll to Distribution and Maya dir."
+ CommandLine="copy .\Release\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll
+copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderr.mll
+copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;NDEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ <Configuration
+ Name="Tools Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="2"
+ UseOfMFC="2"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\include\,..\code\,..\..\..\game\libs\pure3d\toollib\inc,..\..\..\game\libs\pure3d\toollib\chunks16\inc,.,..\..\..\game\libs\pure3d\constants,..\..\globalcode,..\..\..\game\libs\radmath,..\..\..\game\libs\pure3d\,..\..\..\game\libs\radcore\inc,..\..\..\game\code\constants,..\..\..\game\code,..\..\..\game\libs\radcontent\inc"
+ PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_PC;RAD_WIN32;RAD_DEBUG;WORLD_BUILDER"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="TRUE"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="precompiled\PCH.h"
+ PrecompiledHeaderFile=".\Debug/worldbuilder.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="user32.lib gdi32.lib glu32.lib version.lib Foundation.lib OpenGL32.lib OpenMaya.lib OpenMayaFX.lib OpenMayaRender.lib OpenMayaUI.lib OpenMayaAnim.lib WS2_32.LIB"
+ OutputFile="Debug\worldbuilder.mll"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\..\game\libs\pure3d\sdks\Maya4_0\lib"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/worldbuilder.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Debug/worldbuilder.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="TRUE"
+ SuppressStartupBanner="TRUE"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/worldbuilder.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copy worldbuilder.mll to Distribution and Maya dir."
+ CommandLine="copy .\Debug\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll
+copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderd.mll
+copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_AFXDLL;_DEBUG"
+ Culture="4105"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ </Configuration>
+ </Configurations>
+ <Files>
+ <Filter
+ Name="main"
+ Filter="">
+ <File
+ RelativePath="..\code\main\constants.h">
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.cpp">
+ </File>
+ <File
+ RelativePath="..\code\main\pluginMain.h">
+ </File>
+ <File
+ RelativePath="..\code\main\toolhack.h">
+ </File>
+ <File
+ RelativePath="..\code\main\worldbuilder.cpp">
+ </File>
+ <File
+ RelativePath="..\code\main\worldbuilder.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="commands"
+ Filter="">
+ <File
+ RelativePath="..\code\commands\export.cpp">
+ </File>
+ <File
+ RelativePath="..\code\commands\export.h">
+ </File>
+ <File
+ RelativePath="..\code\commands\worldbuildercommands.cpp">
+ </File>
+ <File
+ RelativePath="..\code\commands\worldbuildercommands.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="nodes"
+ Filter="">
+ <File
+ RelativePath="..\code\nodes\actioneventlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\actioneventlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\breakablecameralocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\breakablecameralocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\carstartlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\carstartlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\directionallocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\directionallocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\eventlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\eventlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\fovlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\fovlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\genericlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\genericlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\interiorentrancelocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\interiorentrancelocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\occlusionlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\occlusionlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\pedgrouplocator.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\pedgrouplocator.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\railcamlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\railcamlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\scriptlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\scriptlocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\splinelocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\splinelocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\staticcameralocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\staticcameralocatornode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\triggertypes.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\triggervolumenode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\triggervolumenode.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\wbspline.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\wbspline.h">
+ </File>
+ <File
+ RelativePath="..\code\nodes\zoneeventlocatornode.cpp">
+ </File>
+ <File
+ RelativePath="..\code\nodes\zoneeventlocatornode.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="contexts"
+ Filter="">
+ <File
+ RelativePath="..\code\contexts\locatorcontext.cpp">
+ </File>
+ <File
+ RelativePath="..\code\contexts\locatorcontext.h">
+ </File>
+ <File
+ RelativePath="..\code\contexts\triggercontext.cpp">
+ </File>
+ <File
+ RelativePath="..\code\contexts\triggercontext.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="utility"
+ Filter="">
+ <File
+ RelativePath="..\..\globalcode\utility\GLExt.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\GLExt.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MExt_template.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\MUI.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\mayahandles.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\nodehelper.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\stdafx.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\transformmatrix.cpp">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\transformmatrix.h">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.c">
+ </File>
+ <File
+ RelativePath="..\..\globalcode\utility\util.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="mel scripts"
+ Filter="">
+ <File
+ RelativePath="..\code\scripts\wb_cleanup.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\wb_locator.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\wb_main.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\wb_setup.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\scripts\wb_splines.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install)"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\others\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\others\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\others\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="precompiled header"
+ Filter="">
+ <File
+ RelativePath="..\code\precompiled\PCH.cpp">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="PCH.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="PCH.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\precompiled\PCH.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="resources"
+ Filter="">
+ <File
+ RelativePath="..\code\resources\resource.h">
+ </File>
+ <File
+ RelativePath="..\code\resources\resource.rc">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalIncludeDirectories="\simpsons2\tools\worldbuilder\code\resources;$(NoInherit)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCResourceCompilerTool"
+ AdditionalIncludeDirectories="\simpsons2\tools\worldbuilder\code\resources;$(NoInherit)"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="AETemplates"
+ Filter="">
+ <File
+ RelativePath="..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AECarStartLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEEventLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEFOVLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEGenericLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AERailCamLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEScriptLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AESplineLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AETriggerVolumeNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEWBLocatorSuppress.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEWBTriggerButton.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel">
+ <FileConfiguration
+ Name="Tools Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Tools Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Copy $(InputPath) to Maya (dist and install) Templates"
+ CommandLine="copy &quot;$(InputPath)&quot; &quot;C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;
+copy &quot;$(InputPath)&quot; &quot;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel&quot;"
+ Outputs="C:\AW\Maya4.0\scripts\AETemplates\$(InputName).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\$(InputName).mel"/>
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="SuperCam"
+ Filter="">
+ <File
+ RelativePath="..\..\..\game\code\camera\icamerashaker.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\isupercamtarget.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\railcam.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\railcam.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\sinecosshaker.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\sinecosshaker.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\staticcam.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\staticcam.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\supercam.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\camera\supercam.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="TriggerVolumes"
+ Filter="">
+ <File
+ RelativePath="..\..\..\game\code\meta\locator.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\locator.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\recttriggervolume.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\recttriggervolume.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\spheretriggervolume.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\spheretriggervolume.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\triggerlocator.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\triggervolume.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\triggervolume.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\triggervolumetracker.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="game engine"
+ Filter="">
+ <File
+ RelativePath="..\code\gameengine\gameengine.cpp">
+ </File>
+ <File
+ RelativePath="..\code\gameengine\gameengine.h">
+ </File>
+ <File
+ RelativePath="..\code\gameengine\mayacamera.cpp">
+ </File>
+ <File
+ RelativePath="..\code\gameengine\mayacamera.h">
+ </File>
+ <File
+ RelativePath="..\code\gameengine\wbcamtarget.cpp">
+ </File>
+ <File
+ RelativePath="..\code\gameengine\wbcamtarget.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="from game"
+ Filter="">
+ <File
+ RelativePath="..\..\..\game\code\render\DSG\IEntityDSG.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\render\DSG\IEntityDSG.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\ai\actionnames.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\worldsim\character\charactercontroller.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\main\commandlineoptions.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\memory\leakdetection.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\locatorevents.h">
+ </File>
+ <File
+ RelativePath="..\..\..\game\code\meta\locatortypes.h">
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\code\resources\icon1.ico">
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/worldbuilder/build/worldbuilder.vcxproj b/tools/worldbuilder/build/worldbuilder.vcxproj
new file mode 100644
index 0000000..43e0c3f
--- /dev/null
+++ b/tools/worldbuilder/build/worldbuilder.vcxproj
@@ -0,0 +1,514 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Tools Debug|Win32">
+ <Configuration>Tools Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Tools Release|Win32">
+ <Configuration>Tools Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath />
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>MFCProj</Keyword>
+ <ProjectGuid>{B5900135-3859-403D-BC2F-FD90B4C2B2E5}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ <UseOfMfc>Dynamic</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <OutDir>.\Release\</OutDir>
+ <IntDir>.\Release\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <OutDir>.\Debug\</OutDir>
+ <IntDir>.\Debug\</IntDir>
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;..\..\..\game\libs\pure3d\;..\..\..\game\libs\radcore\inc;..\..\..\game\code\constants;..\..\..\game\code;..\..\..\game\libs\radcontent\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>NDEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_PC;RAD_WIN32;RAD_RELEASE;WORLD_BUILDER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <RuntimeTypeInfo>true</RuntimeTypeInfo>
+ <PrecompiledHeader />
+ <PrecompiledHeaderFile>precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>.\Release/worldbuilder.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 /EXPORT:initializePlugin /EXPORT:uninitializePlugin %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaUI.lib;OpenMayaAnim.lib;WS2_32.LIB;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Release\worldbuilder.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <IgnoreSpecificDefaultLibraries>LIBC.lib;LIBCMT.lib;LIBCPMT.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>.\Release/worldbuilder.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>.\Release/worldbuilder.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/worldbuilder.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy worldbuilder.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Release\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll
+copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderr.mll
+copy .\Release\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\include\;..\code\;..\..\..\game\libs\pure3d\toollib\inc;..\..\..\game\libs\pure3d\toollib\chunks16\inc;.;..\..\..\game\libs\pure3d\constants;..\..\globalcode;..\..\..\game\libs\radmath;..\..\..\game\libs\pure3d\;..\..\..\game\libs\radcore\inc;..\..\..\game\code\constants;..\..\..\game\code;..\..\..\game\libs\radcontent\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;RAD_PC;RAD_WIN32;RAD_DEBUG;WORLD_BUILDER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <RuntimeTypeInfo>true</RuntimeTypeInfo>
+ <PrecompiledHeader />
+ <PrecompiledHeaderFile>precompiled\PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>.\Debug/worldbuilder.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Debug/</AssemblerListingLocation>
+ <ObjectFileName>.\Debug/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>user32.lib;gdi32.lib;glu32.lib;version.lib;Foundation.lib;OpenGL32.lib;OpenMaya.lib;OpenMayaFX.lib;OpenMayaRender.lib;OpenMayaUI.lib;OpenMayaAnim.lib;WS2_32.LIB;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>Debug\worldbuilder.mll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>..\..\..\game\libs\pure3d\sdks\Maya4_0\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Debug/worldbuilder.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>.\Debug/worldbuilder.lib</ImportLibrary>
+ </Link>
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/worldbuilder.tlb</TypeLibraryName>
+ </Midl>
+ <PostBuildEvent>
+ <Message>Copy worldbuilder.mll to Distribution and Maya dir.</Message>
+ <Command>copy .\Debug\worldbuilder.mll ..\..\MayaTools\Maya4.0\bin\plug-ins\worldbuilder.mll
+copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilderd.mll
+copy .\Debug\worldbuilder.mll C:\AW\Maya4.0\bin\plug-ins\worldbuilder.mll
+</Command>
+ </PostBuildEvent>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_AFXDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x1009</Culture>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\constants.h" />
+ <ClInclude Include="..\code\main\pluginMain.h" />
+ <ClInclude Include="..\code\main\toolhack.h" />
+ <ClInclude Include="..\code\main\worldbuilder.h" />
+ <ClInclude Include="..\code\commands\export.h" />
+ <ClInclude Include="..\code\commands\worldbuildercommands.h" />
+ <ClInclude Include="..\code\nodes\actioneventlocatornode.h" />
+ <ClInclude Include="..\code\nodes\breakablecameralocatornode.h" />
+ <ClInclude Include="..\code\nodes\carstartlocatornode.h" />
+ <ClInclude Include="..\code\nodes\directionallocatornode.h" />
+ <ClInclude Include="..\code\nodes\eventlocatornode.h" />
+ <ClInclude Include="..\code\nodes\fovlocatornode.h" />
+ <ClInclude Include="..\code\nodes\genericlocatornode.h" />
+ <ClInclude Include="..\code\nodes\interiorentrancelocatornode.h" />
+ <ClInclude Include="..\code\nodes\occlusionlocatornode.h" />
+ <ClInclude Include="..\code\nodes\pedgrouplocator.h" />
+ <ClInclude Include="..\code\nodes\railcamlocatornode.h" />
+ <ClInclude Include="..\code\nodes\scriptlocatornode.h" />
+ <ClInclude Include="..\code\nodes\splinelocatornode.h" />
+ <ClInclude Include="..\code\nodes\staticcameralocatornode.h" />
+ <ClInclude Include="..\code\nodes\triggertypes.h" />
+ <ClInclude Include="..\code\nodes\triggervolumenode.h" />
+ <ClInclude Include="..\code\nodes\wbspline.h" />
+ <ClInclude Include="..\code\nodes\zoneeventlocatornode.h" />
+ <ClInclude Include="..\code\contexts\locatorcontext.h" />
+ <ClInclude Include="..\code\contexts\triggercontext.h" />
+ <ClInclude Include="..\..\globalcode\utility\GLExt.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt.h" />
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h" />
+ <ClInclude Include="..\..\globalcode\utility\MUI.h" />
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h" />
+ <ClInclude Include="..\..\globalcode\utility\nodehelper.h" />
+ <ClInclude Include="..\..\globalcode\utility\stdafx.h" />
+ <ClInclude Include="..\..\globalcode\utility\transformmatrix.h" />
+ <ClInclude Include="..\..\globalcode\utility\util.h" />
+ <ClInclude Include="..\code\precompiled\PCH.h" />
+ <ClInclude Include="..\code\resources\resource.h" />
+ <ClInclude Include="..\..\..\game\code\camera\icamerashaker.h" />
+ <ClInclude Include="..\..\..\game\code\camera\isupercamtarget.h" />
+ <ClInclude Include="..\..\..\game\code\camera\railcam.h" />
+ <ClInclude Include="..\..\..\game\code\camera\sinecosshaker.h" />
+ <ClInclude Include="..\..\..\game\code\camera\staticcam.h" />
+ <ClInclude Include="..\..\..\game\code\camera\supercam.h" />
+ <ClInclude Include="..\..\..\game\code\meta\locator.h" />
+ <ClInclude Include="..\..\..\game\code\meta\recttriggervolume.h" />
+ <ClInclude Include="..\..\..\game\code\meta\spheretriggervolume.h" />
+ <ClInclude Include="..\..\..\game\code\meta\triggerlocator.h" />
+ <ClInclude Include="..\..\..\game\code\meta\triggervolume.h" />
+ <ClInclude Include="..\..\..\game\code\meta\triggervolumetracker.h" />
+ <ClInclude Include="..\code\gameengine\gameengine.h" />
+ <ClInclude Include="..\code\gameengine\mayacamera.h" />
+ <ClInclude Include="..\code\gameengine\wbcamtarget.h" />
+ <ClInclude Include="..\..\..\game\code\render\DSG\IEntityDSG.h" />
+ <ClInclude Include="..\..\..\game\code\ai\actionnames.h" />
+ <ClInclude Include="..\..\..\game\code\worldsim\character\charactercontroller.h" />
+ <ClInclude Include="..\..\..\game\code\meta\locatorevents.h" />
+ <ClInclude Include="..\..\..\game\code\meta\locatortypes.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp" />
+ <ClCompile Include="..\code\main\worldbuilder.cpp" />
+ <ClCompile Include="..\code\commands\export.cpp" />
+ <ClCompile Include="..\code\commands\worldbuildercommands.cpp" />
+ <ClCompile Include="..\code\nodes\actioneventlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\breakablecameralocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\carstartlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\directionallocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\eventlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\fovlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\genericlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\interiorentrancelocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\occlusionlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\pedgrouplocator.cpp" />
+ <ClCompile Include="..\code\nodes\railcamlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\scriptlocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\splinelocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\staticcameralocatornode.cpp" />
+ <ClCompile Include="..\code\nodes\triggervolumenode.cpp" />
+ <ClCompile Include="..\code\nodes\wbspline.cpp" />
+ <ClCompile Include="..\code\nodes\zoneeventlocatornode.cpp" />
+ <ClCompile Include="..\code\contexts\locatorcontext.cpp" />
+ <ClCompile Include="..\code\contexts\triggercontext.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\GLExt.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\transformmatrix.cpp" />
+ <ClCompile Include="..\..\globalcode\utility\util.c" />
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">PCH.h</PrecompiledHeaderFile>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">PCH.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\camera\railcam.cpp" />
+ <ClCompile Include="..\..\..\game\code\camera\sinecosshaker.cpp" />
+ <ClCompile Include="..\..\..\game\code\camera\staticcam.cpp" />
+ <ClCompile Include="..\..\..\game\code\camera\supercam.cpp" />
+ <ClCompile Include="..\..\..\game\code\meta\locator.cpp" />
+ <ClCompile Include="..\..\..\game\code\meta\recttriggervolume.cpp" />
+ <ClCompile Include="..\..\..\game\code\meta\spheretriggervolume.cpp" />
+ <ClCompile Include="..\..\..\game\code\meta\triggervolume.cpp" />
+ <ClCompile Include="..\code\gameengine\gameengine.cpp" />
+ <ClCompile Include="..\code\gameengine\mayacamera.cpp" />
+ <ClCompile Include="..\code\gameengine\wbcamtarget.cpp" />
+ <ClCompile Include="..\..\..\game\code\render\DSG\IEntityDSG.cpp" />
+ <ClCompile Include="..\..\..\game\code\main\commandlineoptions.cpp" />
+ <ClCompile Include="..\..\..\game\code\memory\leakdetection.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\wb_cleanup.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_locator.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_main.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_setup.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_splines.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install)</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\others\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\others\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\others\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AECarStartLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEEventLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEFOVLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEGenericLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AERailCamLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEScriptLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AESplineLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETriggerVolumeNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEWBLocatorSuppress.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEWBTriggerButton.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel">
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">Copy %(FullPath) to Maya (dist and install) Templates</Message>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">copy "%(FullPath)" "C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel"
+copy "%(FullPath)" "..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel"</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">C:\AW\Maya4.0\scripts\AETemplates\%(Filename).mel;..\..\MayaTools\Maya4.0\scripts\AETemplates\%(Filename).mel;%(Outputs)</Outputs>
+ </CustomBuild>
+ <None Include="..\code\resources\icon1.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\code\resources\resource.rc">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Tools Debug|Win32'">\simpsons2\tools\worldbuilder\code\resources</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Tools Release|Win32'">\simpsons2\tools\worldbuilder\code\resources</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\game\libs\pure3d\lib\freetype\builds\win32\visualc\freetype.vcxproj">
+ <Project>{6d333c70-a27d-4e25-ad26-bb9e20558b8f}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\game\libs\pure3d\toollib\toollib_extras.vcxproj">
+ <Project>{cdb92e4a-1e5d-49a8-8153-34264b3fef29}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/tools/worldbuilder/build/worldbuilder.vcxproj.filters b/tools/worldbuilder/build/worldbuilder.vcxproj.filters
new file mode 100644
index 0000000..3a0a61c
--- /dev/null
+++ b/tools/worldbuilder/build/worldbuilder.vcxproj.filters
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="main">
+ <UniqueIdentifier>{366c6ba8-356c-47df-8d66-9bd89b60358c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="commands">
+ <UniqueIdentifier>{935b3601-b5b9-47f8-ba04-ad2dd1e02b63}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="nodes">
+ <UniqueIdentifier>{d220ea56-95c9-4d82-a653-58cf05c5236f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="contexts">
+ <UniqueIdentifier>{c8ebdea7-8295-4987-8a5e-019ed8aa09e8}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="utility">
+ <UniqueIdentifier>{7ad26358-0035-4d79-9634-d1bb4038dcb8}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="mel scripts">
+ <UniqueIdentifier>{40773277-3c27-4841-a98a-0b283730dc7c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="precompiled header">
+ <UniqueIdentifier>{af47442b-26b9-4735-8425-6706a3083197}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="resources">
+ <UniqueIdentifier>{0e0156cf-22b5-4b50-96e0-429a7358170b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="AETemplates">
+ <UniqueIdentifier>{95adfaf0-4424-4f9b-b47a-b99817d16fd4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="SuperCam">
+ <UniqueIdentifier>{8f1fd96b-381a-4211-bda0-0b6d6b3ed6e6}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="TriggerVolumes">
+ <UniqueIdentifier>{98be18c4-5fa3-465b-ae4a-f82a46c20b0d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="game engine">
+ <UniqueIdentifier>{8f086d86-61ae-4349-88d8-49f1a6127674}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="from game">
+ <UniqueIdentifier>{01be528e-1bc5-4113-9fa2-863b9ba84a86}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\code\main\constants.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\pluginMain.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\toolhack.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\main\worldbuilder.h">
+ <Filter>main</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\export.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\commands\worldbuildercommands.h">
+ <Filter>commands</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\actioneventlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\breakablecameralocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\carstartlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\directionallocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\eventlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\fovlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\genericlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\interiorentrancelocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\occlusionlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\pedgrouplocator.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\railcamlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\scriptlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\splinelocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\staticcameralocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\triggertypes.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\triggervolumenode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\wbspline.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\nodes\zoneeventlocatornode.h">
+ <Filter>nodes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\locatorcontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\contexts\triggercontext.h">
+ <Filter>contexts</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\GLExt.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MExt_template.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\MUI.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\mayahandles.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\nodehelper.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\stdafx.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\transformmatrix.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\globalcode\utility\util.h">
+ <Filter>utility</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\precompiled\PCH.h">
+ <Filter>precompiled header</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\resources\resource.h">
+ <Filter>resources</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\icamerashaker.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\isupercamtarget.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\railcam.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\sinecosshaker.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\staticcam.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\camera\supercam.h">
+ <Filter>SuperCam</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\locator.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\recttriggervolume.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\spheretriggervolume.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\triggerlocator.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\triggervolume.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\triggervolumetracker.h">
+ <Filter>TriggerVolumes</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\gameengine\gameengine.h">
+ <Filter>game engine</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\gameengine\mayacamera.h">
+ <Filter>game engine</Filter>
+ </ClInclude>
+ <ClInclude Include="..\code\gameengine\wbcamtarget.h">
+ <Filter>game engine</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\render\DSG\IEntityDSG.h">
+ <Filter>from game</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\ai\actionnames.h">
+ <Filter>from game</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\worldsim\character\charactercontroller.h">
+ <Filter>from game</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\locatorevents.h">
+ <Filter>from game</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\game\code\meta\locatortypes.h">
+ <Filter>from game</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\code\main\pluginMain.cpp">
+ <Filter>main</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\main\worldbuilder.cpp">
+ <Filter>main</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\export.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\commands\worldbuildercommands.cpp">
+ <Filter>commands</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\actioneventlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\breakablecameralocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\carstartlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\directionallocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\eventlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\fovlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\genericlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\interiorentrancelocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\occlusionlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\pedgrouplocator.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\railcamlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\scriptlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\splinelocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\staticcameralocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\triggervolumenode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\wbspline.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\nodes\zoneeventlocatornode.cpp">
+ <Filter>nodes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\locatorcontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\contexts\triggercontext.cpp">
+ <Filter>contexts</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\GLExt.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MExt_template.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\MUI.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\mayahandles.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\transformmatrix.cpp">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\globalcode\utility\util.c">
+ <Filter>utility</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\precompiled\PCH.cpp">
+ <Filter>precompiled header</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\camera\railcam.cpp">
+ <Filter>SuperCam</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\camera\sinecosshaker.cpp">
+ <Filter>SuperCam</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\camera\staticcam.cpp">
+ <Filter>SuperCam</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\camera\supercam.cpp">
+ <Filter>SuperCam</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\meta\locator.cpp">
+ <Filter>TriggerVolumes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\meta\recttriggervolume.cpp">
+ <Filter>TriggerVolumes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\meta\spheretriggervolume.cpp">
+ <Filter>TriggerVolumes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\meta\triggervolume.cpp">
+ <Filter>TriggerVolumes</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\gameengine\gameengine.cpp">
+ <Filter>game engine</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\gameengine\mayacamera.cpp">
+ <Filter>game engine</Filter>
+ </ClCompile>
+ <ClCompile Include="..\code\gameengine\wbcamtarget.cpp">
+ <Filter>game engine</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\render\DSG\IEntityDSG.cpp">
+ <Filter>from game</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\main\commandlineoptions.cpp">
+ <Filter>from game</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\game\code\memory\leakdetection.cpp">
+ <Filter>from game</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\code\resources\icon1.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\code\resources\resource.rc">
+ <Filter>resources</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\code\scripts\wb_cleanup.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_locator.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_main.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_setup.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\scripts\wb_splines.mel">
+ <Filter>mel scripts</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEActionEventLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEBreakableCameraLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AECarStartLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEDirectionalLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEEventLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEFOVLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEGenericLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEInteriorEntranceLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEOcclusionLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AERailCamLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEScriptLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AESplineLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEStaticCameraLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AETriggerVolumeNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEWBLocatorSuppress.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEWBTriggerButton.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\code\AETemplates\AEZoneEventLocatorNodeTemplate.mel">
+ <Filter>AETemplates</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEActionEventLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEActionEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..4c1a413
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEActionEventLocatorNodeTemplate.mel
@@ -0,0 +1,34 @@
+global proc AEActionEventLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+
+ editorTemplate -addControl "exportTransform";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Action Attribute" -collapse false;
+ editorTemplate -addControl "actionObject";
+ editorTemplate -addControl "joint";
+ editorTemplate -addControl "action";
+ editorTemplate -addControl "buttonInput";
+ editorTemplate -addControl "shouldTransform";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel
new file mode 100644
index 0000000..82a08f2
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEBreakableCameraLocatorNodeTemplate.mel
@@ -0,0 +1,20 @@
+global proc AEBreakableCameraLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "FOV Settings" -collapse 0;
+ editorTemplate -addControl "fov";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AECarStartLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AECarStartLocatorNodeTemplate.mel
new file mode 100644
index 0000000..a3e9f04
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AECarStartLocatorNodeTemplate.mel
@@ -0,0 +1,21 @@
+global proc AECarStartLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Car Start Data" -collapse 0;
+ editorTemplate -addControl "isParked";
+ editorTemplate -addControl "specialName";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEDirectionalLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEDirectionalLocatorNodeTemplate.mel
new file mode 100644
index 0000000..cd9d34e
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEDirectionalLocatorNodeTemplate.mel
@@ -0,0 +1,16 @@
+global proc AEDirectionalLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEEventLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..9d6443b
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEEventLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEEventLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Event Attributes" -collapse false;
+ editorTemplate -addControl "event";
+ editorTemplate -addControl "extraData";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEFOVLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEFOVLocatorNodeTemplate.mel
new file mode 100644
index 0000000..c02a84a
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEFOVLocatorNodeTemplate.mel
@@ -0,0 +1,30 @@
+global proc AEFOVLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "FOV Settings" -collapse 0;
+ editorTemplate -addControl "fov";
+ editorTemplate -addControl "time";
+ editorTemplate -addControl "rate";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEGenericLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEGenericLocatorNodeTemplate.mel
new file mode 100644
index 0000000..c1ed3cb
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEGenericLocatorNodeTemplate.mel
@@ -0,0 +1,16 @@
+global proc AEGenericLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel
new file mode 100644
index 0000000..f23f6ee
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEInteriorEntranceLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEInteriorEntranceLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Interior Attribute" -collapse false;
+ editorTemplate -addControl "zone";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEOcclusionLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEOcclusionLocatorNodeTemplate.mel
new file mode 100644
index 0000000..5833530
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEOcclusionLocatorNodeTemplate.mel
@@ -0,0 +1,29 @@
+
+global proc AEOcclusionLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNewOcclude"
+ "AEWBTriggerButtonReplaceOcclude"
+ "message";
+
+ editorTemplate -callCustom "AEWBTriggerButtonNewVisible"
+ "AEWBTriggerButtonReplaceVisible"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEPedGroupLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEPedGroupLocatorNodeTemplate.mel
new file mode 100644
index 0000000..1dcfcce
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEPedGroupLocatorNodeTemplate.mel
@@ -0,0 +1,26 @@
+global proc AEPedGroupLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Ped Group Attributes" -collapse 0;
+ editorTemplate -addControl "group";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AERailCamLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AERailCamLocatorNodeTemplate.mel
new file mode 100644
index 0000000..7d3178c
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AERailCamLocatorNodeTemplate.mel
@@ -0,0 +1,56 @@
+global proc AERailCamLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Rail Attributes" -collapse false;
+ editorTemplate -addControl "cutInOut";
+ editorTemplate -addControl "carOnly";
+ editorTemplate -addControl "onFootOnly";
+ editorTemplate -addControl "reset";
+ editorTemplate -addControl "noFOV";
+ editorTemplate -addControl "camRail";
+ editorTemplate -addControl "behaviour";
+ editorTemplate -addControl "minRadius";
+ editorTemplate -addControl "maxRadius";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "trackRail";
+ editorTemplate -addControl "trackDist";
+ editorTemplate -addControl "reverseSense";
+ editorTemplate -addControl "fieldOfView";
+ editorTemplate -addControl "facingOffset";
+ editorTemplate -addControl "axisPlay";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "positionLag";
+ editorTemplate -addControl "targetLag";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl"active";
+ editorTemplate -addControl "target";
+
+ editorTemplate -addSeparator;
+ editorTemplate -addControl "transitionTo";
+
+ editorTemplate -callCustom "AEWBTargetSelectNew"
+ "AEWBTargetSelectReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEScriptLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEScriptLocatorNodeTemplate.mel
new file mode 100644
index 0000000..2e800c8
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEScriptLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEScriptLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Script Attributes" -collapse false;
+ editorTemplate -addControl "script";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AESplineLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AESplineLocatorNodeTemplate.mel
new file mode 100644
index 0000000..57e5e2a
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AESplineLocatorNodeTemplate.mel
@@ -0,0 +1,23 @@
+global proc AESplineLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEStaticCameraLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEStaticCameraLocatorNodeTemplate.mel
new file mode 100644
index 0000000..d611957
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEStaticCameraLocatorNodeTemplate.mel
@@ -0,0 +1,52 @@
+global proc AEStaticCameraLocatorNodeTemplate( string $nodeName )
+{
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Camera Attributes" -collapse false;
+ editorTemplate -addControl "cutInOut";
+ editorTemplate -addControl "carOnly";
+ editorTemplate -addControl "onFootOnly";
+ editorTemplate -addControl "oneShot";
+ editorTemplate -addControl "noFOV";
+ editorTemplate -addControl "fieldOfView";
+ editorTemplate -addControl "facingOffset";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "targetLag";
+
+ editorTemplate -addSeparator;
+
+ editorTemplate -addControl "active";
+
+ editorTemplate -addControl "target";
+ editorTemplate -addControl "tracking";
+
+ editorTemplate -addSeparator;
+ editorTemplate -addControl "transitionTo";
+
+ editorTemplate -callCustom "AEWBTargetSelectNew"
+ "AEWBTargetSelectReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AETriggerVolumeNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AETriggerVolumeNodeTemplate.mel
new file mode 100644
index 0000000..4166b0e
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AETriggerVolumeNodeTemplate.mel
@@ -0,0 +1,18 @@
+global proc AETriggerVolumeNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Trigger Volume Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+
+ editorTemplate -addControl "type";
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEWBLocatorSuppress.mel b/tools/worldbuilder/code/AETemplates/AEWBLocatorSuppress.mel
new file mode 100644
index 0000000..e9784d8
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEWBLocatorSuppress.mel
@@ -0,0 +1,37 @@
+global proc AEWBLocatorSuppress( string $nodeName )
+{
+ editorTemplate -suppress "inputTranslate";
+ editorTemplate -suppress "input";
+ editorTemplate -suppress "caching";
+ editorTemplate -suppress "nodeState";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "template";
+ editorTemplate -suppress "ghosting";
+ editorTemplate -suppress "instObjGroups";
+ editorTemplate -suppress "compInstObjGroups";
+ editorTemplate -suppress "castsShadows";
+ editorTemplate -suppress "receiveShadows";
+ editorTemplate -suppress "depthJitter";
+ editorTemplate -suppress "motionBlur";
+ editorTemplate -suppress "renderInfo";
+ editorTemplate -suppress "primaryVisibility";
+ editorTemplate -suppress "visibleInReflections";
+ editorTemplate -suppress "visibleInRefractions";
+ editorTemplate -suppress "geometryAntialiasingOverride";
+ editorTemplate -suppress "antialiasingLevel";
+ editorTemplate -suppress "shadingSamplesOverride";
+ editorTemplate -suppress "shadingSamples";
+ editorTemplate -suppress "maxShadingSamples";
+ editorTemplate -suppress "volumeSamplesOverride";
+ editorTemplate -suppress "volumeSamples";
+ editorTemplate -suppress "maxVisibilitySamplesOverride";
+ editorTemplate -suppress "maxVisibilitySamples";
+ editorTemplate -suppress "boundingBoxScale";
+ editorTemplate -suppress "drawOverride";
+ editorTemplate -suppress "useObjectColor";
+ editorTemplate -suppress "objectColor";
+ editorTemplate -suppress "intermediateObject";
+ editorTemplate -suppress "visibility";
+ editorTemplate -suppress "lodVisibility";
+} \ No newline at end of file
diff --git a/tools/worldbuilder/code/AETemplates/AEWBSelectTarget.mel b/tools/worldbuilder/code/AETemplates/AEWBSelectTarget.mel
new file mode 100644
index 0000000..d1cd428
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEWBSelectTarget.mel
@@ -0,0 +1,34 @@
+global proc wb_BCB_SelectTarget( string $nodeName )
+{
+ select $nodeName;
+ string $actNodes[] = `ls -sl -o`;
+
+ string $text = `textField -q -text WBTargetName`;
+
+ print ($text + "\n");
+
+ if ( $text != "" )
+ {
+ evalEcho ("setAttr " + $actNodes[0] + ".target -type \"string\" \"" + $text + "\"");
+ }
+
+ select $actNodes[0];
+}
+
+global proc AEWBTargetSelectNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ textField -ed true WBTargetName;
+ string $command = "wb_BCB_SelectTarget( \"" + $nodeName + "\" )";
+ button -label "Select Target" -command $command WBSelectTargetButton;
+
+ setParent ..;
+}
+
+global proc AEWBTargetSelectReplace( string $nodeName )
+{
+ textField -e -text "" WBTargetName;
+ string $command = "wb_BCB_SelectTarget( \"" + $nodeName + "\" )";
+ button -e -command $command WBSelectTargetButton;
+}
diff --git a/tools/worldbuilder/code/AETemplates/AEWBTriggerButton.mel b/tools/worldbuilder/code/AETemplates/AEWBTriggerButton.mel
new file mode 100644
index 0000000..ddb862a
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEWBTriggerButton.mel
@@ -0,0 +1,94 @@
+global int $gIsItVisibler = 0;
+
+global proc AEWBTriggerButtonNew( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -label "Attach Triggers" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+
+global proc AEWBTriggerButtonReplace( string $nodeName )
+{
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonNewOcclude( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -label "Add Occlusion Volume" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonReplaceOcclude( string $nodeName )
+{
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 0)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonNewVisible( string $nodeName )
+{
+ columnLayout -adj true;
+
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 1)";
+
+ button -label "Add Visibler Volume" -command $command WBMakeTriggerButton;
+
+ setParent ..;
+
+ select $names[0];
+}
+
+global proc AEWBTriggerButtonReplaceVisible( string $nodeName )
+{
+ select $nodeName;
+ string $names[] = `ls -sl -o`;
+
+ string $command = "wb_BCB_AttachTriggers(\"" + $names[0] + "\", 1)";
+
+ button -e -command $command WBMakeTriggerButton;
+
+ select $names[0];
+}
+
+global proc int IsVisibler()
+{
+ global int $gIsItVisibler;
+
+ return $gIsItVisibler;
+}
diff --git a/tools/worldbuilder/code/AETemplates/AEZoneEventLocatorNodeTemplate.mel b/tools/worldbuilder/code/AETemplates/AEZoneEventLocatorNodeTemplate.mel
new file mode 100644
index 0000000..869066a
--- /dev/null
+++ b/tools/worldbuilder/code/AETemplates/AEZoneEventLocatorNodeTemplate.mel
@@ -0,0 +1,28 @@
+global proc AEZoneEventLocatorNodeTemplate( string $nodeName )
+{
+
+ editorTemplate -beginScrollLayout;
+
+ editorTemplate -beginLayout "Locator Attributes" -collapse 0;
+ AElocatorCommon $nodeName;
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Zone Attribute" -collapse false;
+ editorTemplate -addControl "zone";
+ editorTemplate -endLayout;
+
+ editorTemplate -beginLayout "Triggers" -collapse 0;
+
+ editorTemplate -callCustom "AEWBTriggerButtonNew"
+ "AEWBTriggerButtonReplace"
+ "message";
+
+ editorTemplate -endLayout;
+
+ editorTemplate -addExtraControls;
+
+ editorTemplate -endScrollLayout;
+
+ AEWBLocatorSuppress( $nodeName );
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/commands/export.cpp b/tools/worldbuilder/code/commands/export.cpp
new file mode 100644
index 0000000..dda3c16
--- /dev/null
+++ b/tools/worldbuilder/code/commands/export.cpp
@@ -0,0 +1,282 @@
+#include "main/toolhack.h"
+
+#include "precompiled/PCH.h"
+
+#include "export.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "nodes/eventlocatornode.h"
+#include "nodes/scriptlocatornode.h"
+#include "nodes/genericlocatornode.h"
+#include "nodes/carstartlocatornode.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/splinelocatornode.h"
+#include "nodes/zoneeventlocatornode.h"
+#include "nodes/occlusionlocatornode.h"
+#include "nodes/railcamlocatornode.h"
+#include "nodes/interiorentrancelocatornode.h"
+#include "nodes/directionallocatornode.h"
+#include "nodes/actioneventlocatornode.h"
+#include "nodes/fovlocatornode.h"
+#include "nodes/BreakableCameraLocatorNode.h"
+#include "nodes/StaticCameraLocatorNode.h"
+#include "nodes/PedGroupLocator.h"
+#include "nodes/wbspline.h"
+#include "utility/mui.h"
+#include "utility/mext.h"
+
+#include <toollib.hpp>
+
+#include "../../../game/code/meta/locatortypes.h"
+
+const char* ExportCommand::stringId = "WB_Export";
+bool ExportCommand::sRegisteredChunks = false;
+
+ExportCommand::ExportCommand() {};
+ExportCommand::~ExportCommand() {};
+
+//==============================================================================
+// ExportCommand::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* ExportCommand::creator()
+{
+ return new ExportCommand();
+}
+
+//==============================================================================
+// ExportCommand::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus ExportCommand::doIt( const MArgList& args )
+{
+ if ( !sRegisteredChunks )
+ {
+ tlDataChunk::RegisterDefaultChunks();
+ sRegisteredChunks = true;
+ }
+
+ MStatus status;
+
+ //Go through all the chunks looking for the types we want and exporting them.
+ //Alternatively, we could go thtough all the chunks and attempt to access the
+ //IExportable interface and then export if the interface exists...
+
+ //Args are all, or selected.
+
+ const unsigned char FILE_NAME_SIZE = 255;
+ char filePath[FILE_NAME_SIZE];
+ filePath[0] = '\0';
+
+ if ( MUI::FileDialog( filePath,
+ FILE_NAME_SIZE,
+ "World Builder Export",
+ "Pure3D(*.p3d)|*.p3d|All Files(*.*)|*.*||",
+ "p3d",
+ MUI::SAVE ) )
+ {
+ MDagPath pathToWorldBuilder;
+ if ( !MExt::FindDagNodeByName( &pathToWorldBuilder, MString( WorldBuilder::sName ) ) )
+ {
+ return MStatus::kSuccess;
+ }
+
+ MItDag dagIt;
+ dagIt.reset( pathToWorldBuilder, MItDag::kBreadthFirst );
+
+ tlDataChunk* outChunk = new tlDataChunk;
+
+ //Put in a history chunk.
+ tlHistory history;
+
+ char hist[256];
+// sprintf(hist, "World Builder version: 2.0, toollib version: %s", tlversion);
+
+// history.AddLine( hist );
+
+ outChunk->AppendSubChunk( history.Chunk(), 0 );
+
+ bool deleteLast = false;
+ MFnDependencyNode fnNode;
+ MObject lastObj;
+ MTypeId id;
+
+ while ( !dagIt.isDone() )
+ {
+ fnNode.setObject( dagIt.item() );
+ id = fnNode.typeId();
+
+ tlDataChunk* newChunk = NULL;
+
+ if ( id == EventLocatorNode::id )
+ {
+ //Export an event locator;
+ newChunk = EventLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == ScriptLocatorNode::id )
+ {
+ //export a script locator
+ newChunk = ScriptLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == GenericLocatorNode::id )
+ {
+ //export a script locator
+ newChunk = GenericLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == CarStartLocatorNode::id )
+ {
+ //export a script locator
+ newChunk = CarStartLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == SplineLocatorNode::id )
+ {
+ //Export a spline locator
+ newChunk = SplineLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == ZoneEventLocatorNode::id )
+ {
+ //Export a zone event locator
+ newChunk = ZoneEventLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == OcclusionLocatorNode::id )
+ {
+ //Export a zone event locator
+ newChunk = OcclusionLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == InteriorEntranceLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = InteriorEntranceLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == DirectionalLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = DirectionalLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == ActionEventLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = ActionEventLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == FOVLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = FOVLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == BreakableCameraLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = BreakableCameraLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == StaticCameraLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = StaticCameraLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == PedGroupLocatorNode::id )
+ {
+ //Export an interior entrance
+ newChunk = PedGroupLocatorNode::Export( dagIt.item() );
+ }
+ else if ( id == RailCamLocatorNode::id )
+ {
+ //Don't export, but don't delete either.
+ }
+ else
+ {
+ //Is it a nurbs curve or a trigger volume?
+ MFnNurbsCurve( dagIt.item(), &status );
+
+ if ( !status && id != TriggerVolumeNode::id )
+ {
+ deleteLast = true;
+ }
+ }
+
+ if ( newChunk )
+ {
+ tlWBLocatorChunk* newLoc = dynamic_cast<tlWBLocatorChunk*>(newChunk);
+
+ if ( newLoc )
+ {
+ if ( newLoc->Type() == LocatorType::GENERIC )
+ {
+ unsigned int i;
+ for ( i = 0; i < newChunk->SubChunkCount(); ++i )
+ {
+ outChunk->AppendSubChunk( newChunk->GetSubChunk( i ) );
+
+ }
+
+ if ( i == 0 )
+ {
+ //Append to output file
+ outChunk->AppendSubChunk( newChunk );
+ }
+ }
+ else
+ {
+ outChunk->AppendSubChunk( newChunk );
+ }
+ }
+ else
+ {
+
+ //Append to output file
+ outChunk->AppendSubChunk( newChunk );
+ }
+ }
+
+ if ( deleteLast )
+ {
+ lastObj = dagIt.item();
+ }
+
+ dagIt.next();
+
+ if ( deleteLast )
+ {
+ MFnTransform fnTransform( lastObj, &status );
+ if ( !status )
+ {
+ MExt::DisplayWarning( "Deleting useless node: %s", fnNode.name().asChar() );
+ MExt::DeleteNode( lastObj, true );
+ }
+ deleteLast = false;
+ }
+ }
+
+ tlFile output(new tlFileByteStream(filePath, omWRITE), tlFile::CHUNK32);
+
+ if(!output.IsOpen())
+ {
+
+ MGlobal::displayError("Unable to write file!");
+
+ delete outChunk;
+ return MS::kFailure;
+ }
+
+ //Sort it out..
+ outChunk->SortSubChunks();
+ outChunk->Write(&output);
+
+ delete outChunk;
+
+ MGlobal::executeCommand( MString("flushUndo") );
+ }
+
+ return MS::kSuccess;
+}
diff --git a/tools/worldbuilder/code/commands/export.h b/tools/worldbuilder/code/commands/export.h
new file mode 100644
index 0000000..3ae78dc
--- /dev/null
+++ b/tools/worldbuilder/code/commands/export.h
@@ -0,0 +1,26 @@
+#include "precompiled/PCH.h"
+
+#ifndef EXPORT_COMMAND_H
+#define EXPORT_COMMAND_H
+
+class ExportCommand : MPxCommand
+{
+public:
+ enum ExportArg
+ {
+ SELECTED,
+ ALL
+ };
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+
+private:
+ ExportCommand();
+ ~ExportCommand();
+
+ static bool sRegisteredChunks;
+};
+#endif \ No newline at end of file
diff --git a/tools/worldbuilder/code/commands/worldbuildercommands.cpp b/tools/worldbuilder/code/commands/worldbuildercommands.cpp
new file mode 100644
index 0000000..92dde07
--- /dev/null
+++ b/tools/worldbuilder/code/commands/worldbuildercommands.cpp
@@ -0,0 +1,689 @@
+#include "worldbuildercommands.h"
+#include "main/worldbuilder.h"
+#include "utility/mui.h"
+#include "utility/mext.h"
+#include "resources/resource.h"
+#include "main/constants.h"
+#include "nodes/wbspline.h"
+#include "nodes/splinelocatornode.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/railcamlocatornode.h"
+
+const char* WBChangeDisplayCommand::stringId = "WB_ChangeDisplay";
+const char* WBSetLocatorTypeCmd::stringId = "WB_SetLocatorType";
+const char* WBSetPrefixCmd::stringId = "WB_SetPrefix";
+const char* WBSnapLocatorCmd::stringId = "WB_SnapLocator";
+const char* WBSplineCompleteCmd::stringId = "WB_SplineComplete";
+const char* WBCoinSplineCompleteCmd::stringId = "WB_CoinSplineComplete";
+const char* WBSelectObjectCmd::stringId = "WB_SelectObject";
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK SetPrefixLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT1, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDCANCEL ||
+ LOWORD(wParam) == IDC_BUTTON1 ||
+ LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[WorldBuilder::MAX_PREFIX_LENGTH];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, WorldBuilder::MAX_PREFIX_LENGTH );
+
+ WorldBuilder::SetPrefix( name );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+BOOL CALLBACK SplineNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[WBSpline::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, WBSpline::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Spline!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ WBSpline::SetName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ WBSpline::SetName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Commands
+//
+//******************************************************************************
+
+//=============================================================================
+// WBChangeDisplayCommand::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBChangeDisplayCommand::creator()
+{
+ return new WBChangeDisplayCommand();
+}
+
+//=============================================================================
+// WBChangeDisplayCommand::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus WBChangeDisplayCommand::doIt( const MArgList& args )
+{
+ assert( args.length() == 2 );
+ int arg;
+ args.get(0, arg);
+
+ int on;
+ args.get(1, on);
+
+ WorldBuilder::SetDisplayLevel( arg, on == 1 );
+
+ //Careful, don't call this too often!
+ M3dView::active3dView().refresh( true, true );
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// WBSetLocatorTypeCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBSetLocatorTypeCmd::creator()
+{
+ return new WBSetLocatorTypeCmd();
+}
+
+//=============================================================================
+// WBSetLocatorTypeCmd::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus WBSetLocatorTypeCmd::doIt( const MArgList& args )
+{
+ assert( args.length() == 1 );
+
+ MString string;
+ args.get( 0, string );
+
+ LocatorType::Type type;
+
+ int i;
+ for ( i = 0; i < LocatorType::NUM_TYPES; ++i )
+ {
+ if ( string == MString( LocatorType::Name[i] ) )
+ {
+ type = (LocatorType::Type)i;
+ WorldBuilder::SetLocatorType( type );
+
+ return MStatus::kSuccess;
+ }
+ }
+
+ assert( false );
+
+ return MStatus::kFailure;
+}
+
+//=============================================================================
+// WBSetPrefixCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBSetPrefixCmd::creator()
+{
+ return new WBSetPrefixCmd();
+}
+
+//=============================================================================
+// WBSetPrefixCmd::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus WBSetPrefixCmd::doIt( const MArgList& args )
+{
+ assert( args.length() == 0 );
+
+ MUI::PopupDialogue( IDD_DIALOG2, &SetPrefixLocatorNameCallBack );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// WBSnapLocatorCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBSnapLocatorCmd::creator()
+{
+ return new WBSnapLocatorCmd();
+}
+
+//=============================================================================
+// WBSnapLocatorCmd::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus WBSnapLocatorCmd::doIt( const MArgList& args )
+{
+ assert( args.length() == 1 );
+
+ double OFFSET = 0;
+
+ args.get( 0, OFFSET );
+
+ OFFSET *= WBConstants::Scale;
+
+ MSelectionList list;
+ MGlobal::getActiveSelectionList( list );
+
+ MItSelectionList i( list );
+
+ MFnDagNode fnDagNode;
+ MDagPath dagPath;
+ MItDag itDag;
+ MObject obj;
+ MDagPath objDagPath;
+ MObject childObj;
+
+ //For all selected objects.
+ for ( ; !i.isDone(); i.next() )
+ {
+ i.getDagPath( dagPath );
+
+ itDag.reset( dagPath, MItDag::kBreadthFirst, MFn::kTransform );
+
+ for ( ; !itDag.isDone() && itDag.depth() < 2; itDag.next() )
+ {
+ obj = itDag.item();
+ fnDagNode.setObject( obj );
+
+ const char* objName = fnDagNode.name().asChar();
+ const char* objTypeName = fnDagNode.typeName().asChar();
+
+ int childCount = fnDagNode.childCount();
+
+ int whichChild;
+
+ for ( whichChild = 0; whichChild < childCount; ++whichChild )
+ {
+ childObj = fnDagNode.child( whichChild );
+ fnDagNode.setObject( childObj );
+
+ const char* childObjName = fnDagNode.name().asChar();
+ const char* childObjTypeName = fnDagNode.typeName().asChar();
+
+ //Find a mesh below me and move my pivot to the intersection.
+ itDag.getPath( objDagPath );
+ MFnTransform fnTrans( objDagPath );
+
+
+ MVector pos = fnTrans.translation( MSpace::kWorld );
+ MPoint rotate = fnTrans.rotatePivot( MSpace::kWorld );
+ MVector rayDir( 0, -1.0, 0 );
+
+ MItDag meshIt( MItDag::kDepthFirst, MFn::kMesh );
+ MDagPath meshDagPath;
+ MPointArray intersectPoints;
+
+ bool found = false;
+
+ for ( ; !meshIt.isDone(); meshIt.next() )
+ {
+ meshIt.getPath( meshDagPath );
+ MFnMesh mesh( meshDagPath );
+
+ mesh.intersect( rotate, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ if ( intersectPoints.length() > 0 )
+ {
+ MVector diff( intersectPoints[ 0 ] - rotate );
+ diff.y += OFFSET;
+
+ fnTrans.translateBy( diff, MSpace::kWorld );
+
+ found = true;
+
+ break;
+ }
+ }
+
+ if ( !found )
+ {
+ //Look up
+ MPoint rotate = fnTrans.rotatePivot( MSpace::kWorld );
+ MVector rayDir( 0, 1.0, 0 );
+
+ MItDag meshIt( MItDag::kDepthFirst, MFn::kMesh );
+ MDagPath meshDagPath;
+ MPointArray intersectPoints;
+
+ for ( ; !meshIt.isDone(); meshIt.next() )
+ {
+ meshIt.getPath( meshDagPath );
+ MFnMesh mesh( meshDagPath );
+
+ mesh.intersect( rotate, rayDir, intersectPoints, 0.001f, MSpace::kWorld );
+
+ if ( intersectPoints.length() > 0 )
+ {
+ MVector diff( intersectPoints[ 0 ] - rotate );
+ diff.y -= OFFSET;
+
+ fnTrans.translateBy( diff, MSpace::kWorld );
+
+ found = true;
+
+ break;
+ }
+ }
+ }
+
+ if ( !found )
+ {
+ MString errorMsg( "The object: " );
+ errorMsg += fnTrans.name();
+ errorMsg += MString( " has no mesh below it.\nNo snapping done on it." );
+
+ MUI::InfoDialog( errorMsg.asChar() );
+ }
+ }
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// WBSplineCompleteCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBSplineCompleteCmd::creator()
+{
+ return new WBSplineCompleteCmd();
+}
+
+//=============================================================================
+// WBSplineCompleteCmd::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: WBSplineCompleteCmd
+//
+//=============================================================================
+MStatus WBSplineCompleteCmd::doIt( const MArgList& args )
+{
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.length() == 0 )
+ {
+ return MStatus::kSuccess;
+ }
+
+ MObject spline;
+ selectionList.getDependNode( 0, spline );
+
+ MStatus status;
+
+ MFnTransform fnTransform( spline, &status );
+ assert( status );
+
+ if ( status )
+ {
+ MDagPath dagPath;
+ selectionList.getDagPath(0, dagPath);
+ dagPath.extendToShape();
+
+ MFnNurbsCurve fnNurbs( dagPath, &status );
+ assert( status );
+
+ int numCvs = fnNurbs.numCVs();
+ assert( numCvs );
+
+ MPoint cv;
+ MBoundingBox bBox;
+ int i;
+ for ( i = 0; i < numCvs; ++i )
+ {
+ fnNurbs.getCV( i, cv, MSpace::kWorld );
+ bBox.expand( cv );
+ }
+
+ MPoint halfway = bBox.center();
+
+ double radius = bBox.height() > bBox.width() ? bBox.height() : bBox.width();
+ radius = radius > bBox.depth() ? radius : bBox.depth();
+ radius = radius / WBConstants::Scale / 2.0;
+
+ MFnDependencyNode fnDepNodeSpline( fnTransform.child(0) );
+
+ MUI::PopupDialogue( IDD_DIALOG1, SplineNameCallBack );
+
+ //Get the new name of the spline...
+ const char* name = WBSpline::GetName();
+ MString newName( name );
+
+ MObject locator, triggerVolume, transform;
+
+ //Create the spline locator
+ MExt::CreateNode( locator,
+ transform,
+ MString( SplineLocatorNode::stringId ),
+ &newName );
+
+ MExt::SetWorldPosition( halfway, locator );
+
+ WorldBuilder::AddChild( locator );
+
+ //Name the spline
+ MString splineName = newName + MString("Spline");
+ fnTransform.setName( splineName );
+ WorldBuilder::AddChild( fnDepNodeSpline.object() );
+
+ //Adding an extra attribute to the spline!!
+ MFnMessageAttribute msgAttr;
+ MObject locatorAttr;
+ locatorAttr = msgAttr.create( "locator", "l", &status );
+ assert( status );
+
+ msgAttr.setReadable( true );
+ msgAttr.setWritable( false );
+
+ fnDepNodeSpline.addAttribute( locatorAttr );
+
+ //Connect the Spline to the Locator.
+ MExt::Connect( fnDepNodeSpline.object(), "locator", locator, SplineLocatorNode::SPLINE_NAME_LONG );
+
+ //Create the Trigger Volume
+ MString triggerName = newName + MString( "Trigger" );
+
+ MExt::CreateNode( triggerVolume,
+ transform,
+ MString( TriggerVolumeNode::stringId ),
+ &triggerName );
+
+ MExt::SetWorldPosition( halfway, triggerVolume );
+
+ MFnTransform fnTransform( transform );
+ const double scale[3] = { radius, radius, radius };
+
+ //Scale this bad-boy!
+ fnTransform.setScale( scale );
+
+ //Connect the Trigger Volume to the Locator.
+ MExt::Connect( triggerVolume, TriggerVolumeNode::LOCATOR_NAME_LONG, locator, SplineLocatorNode::TRIGGERS_NAME_LONG );
+
+ WorldBuilder::AddChild( triggerVolume );
+
+ //Create the railcam
+ MObject railLocator;
+ MString railName = newName + MString( "RailCam" );
+ MExt::CreateNode( railLocator,
+ transform,
+ MString( RailCamLocatorNode::stringId ),
+ &railName );
+
+ fnNurbs.getCV( 0, cv, MSpace::kWorld );
+ MExt::SetWorldPosition( cv, railLocator );
+ MExt::Connect( railLocator, "message", locator, SplineLocatorNode::CAMERA_NAME_LONG );
+ MExt::Connect( fnDepNodeSpline.object(), "message", railLocator, RailCamLocatorNode::RAIL_NAME_LONG );
+
+ WorldBuilder::AddChild( railLocator );
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// WBCoinSplineCompleteCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBCoinSplineCompleteCmd::creator()
+{
+ return new WBCoinSplineCompleteCmd();
+}
+
+//=============================================================================
+// WBCoinSplineCompleteCmd::doIt
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: WBCoinSplineCompleteCmd
+//
+//=============================================================================
+MStatus WBCoinSplineCompleteCmd::doIt( const MArgList& args )
+{
+ MSelectionList selectionList;
+
+ MGlobal::getActiveSelectionList( selectionList );
+
+ if ( selectionList.length() == 0 )
+ {
+ return MStatus::kSuccess;
+ }
+
+
+ MObject spline;
+ selectionList.getDependNode( 0, spline );
+
+ MStatus status;
+
+ MFnTransform fnTransform( spline, &status );
+ assert( status );
+
+ if ( status )
+ {
+ MDagPath dagPath;
+ selectionList.getDagPath(0, dagPath);
+ dagPath.extendToShape();
+
+ MFnNurbsCurve fnNurbs( dagPath, &status );
+ assert( status );
+
+ int numCvs = fnNurbs.numCVs();
+ assert( numCvs );
+
+ MFnDependencyNode fnDepNodeSpline( fnTransform.child(0) );
+
+ MUI::PopupDialogue( IDD_DIALOG1, SplineNameCallBack );
+
+ //Get the new name of the spline...
+ const char* name = WBSpline::GetName();
+ MString newName( name );
+
+ MObject locator, triggerVolume, transform;
+
+ //Create the spline locator
+ MExt::CreateNode( locator,
+ transform,
+ MString( SplineLocatorNode::stringId ),
+ &newName );
+
+ MExt::SetWorldPosition( MPoint(0,0,0), locator );
+
+ //Set this locator to say that it is a coin locator
+ MFnDependencyNode fnNode( locator );
+ fnNode.findPlug( SplineLocatorNode::sIsCoin ).setValue( true );
+
+ WorldBuilder::AddChild( locator );
+
+ //Name the spline
+ MString splineName = newName + MString("Spline");
+ fnTransform.setName( splineName );
+ WorldBuilder::AddChild( fnDepNodeSpline.object() );
+
+ //Adding an extra attribute to the spline!!
+ MFnMessageAttribute msgAttr;
+ MObject locatorAttr;
+ locatorAttr = msgAttr.create( "locator", "l", &status );
+ assert( status );
+
+ msgAttr.setReadable( true );
+ msgAttr.setWritable( false );
+
+ fnDepNodeSpline.addAttribute( locatorAttr );
+
+ //Add a num coins attribute to the spline
+ MFnNumericAttribute numAttr;
+ MObject numCoinAttr;
+ numCoinAttr = numAttr.create( "numCoins", "nc", MFnNumericData::kInt, 10, &status );
+ assert( status );
+
+ numAttr.setReadable( true );
+ numAttr.setWritable( true );
+
+ fnDepNodeSpline.addAttribute( numCoinAttr );
+
+ //Connect the Spline to the Locator.
+ MExt::Connect( fnDepNodeSpline.object(), "locator", locator, SplineLocatorNode::SPLINE_NAME_LONG );
+ }
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// WBSelectObjectCmd::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* WBSelectObjectCmd::creator()
+{
+ return new WBSelectObjectCmd();
+}
+
+MStatus WBSelectObjectCmd::doIt( const MArgList& args )
+{
+ assert( args.length() == 1 );
+
+ MString objName;
+
+ args.get( 0, objName );
+
+ WorldBuilder::SetSelectedLocator( objName.asChar() );
+
+ return MStatus::kSuccess;
+} \ No newline at end of file
diff --git a/tools/worldbuilder/code/commands/worldbuildercommands.h b/tools/worldbuilder/code/commands/worldbuildercommands.h
new file mode 100644
index 0000000..7228185
--- /dev/null
+++ b/tools/worldbuilder/code/commands/worldbuildercommands.h
@@ -0,0 +1,90 @@
+#ifndef WORLD_BUILDER_COMMANDS_H
+#define WORLD_BUILDER_COMMANDS_H
+
+#include "precompiled/PCH.h"
+
+class WBChangeDisplayCommand : public MPxCommand
+{
+public:
+ WBChangeDisplayCommand() {};
+ ~WBChangeDisplayCommand() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBSetLocatorTypeCmd : public MPxCommand
+{
+public:
+ WBSetLocatorTypeCmd() {};
+ virtual ~WBSetLocatorTypeCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBSetPrefixCmd : public MPxCommand
+{
+public:
+ WBSetPrefixCmd() {};
+ virtual ~WBSetPrefixCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBSnapLocatorCmd : public MPxCommand
+{
+public:
+ WBSnapLocatorCmd() {};
+ virtual ~WBSnapLocatorCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBSplineCompleteCmd : public MPxCommand
+{
+public:
+ WBSplineCompleteCmd() {};
+ virtual ~WBSplineCompleteCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBCoinSplineCompleteCmd : public MPxCommand
+{
+public:
+ WBCoinSplineCompleteCmd() {};
+ virtual ~WBCoinSplineCompleteCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+class WBSelectObjectCmd : public MPxCommand
+{
+public:
+ WBSelectObjectCmd() {};
+ virtual ~WBSelectObjectCmd() {};
+
+ static void* creator();
+ virtual MStatus doIt( const MArgList& args );
+
+ static const char* stringId;
+};
+
+#endif //WORLD_BUILDER_COMMANDS_H \ No newline at end of file
diff --git a/tools/worldbuilder/code/contexts/locatorcontext.cpp b/tools/worldbuilder/code/contexts/locatorcontext.cpp
new file mode 100644
index 0000000..7c1ff0a
--- /dev/null
+++ b/tools/worldbuilder/code/contexts/locatorcontext.cpp
@@ -0,0 +1,887 @@
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <math.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+
+#include "Locatorcontext.h"
+#include "nodes/EventLocatorNode.h"
+#include "nodes/ScriptLocatorNode.h"
+#include "nodes/GenericLocatorNode.h"
+#include "nodes/CarStartLocatorNode.h"
+#include "nodes/TriggerVolumeNode.h"
+#include "nodes/zoneeventlocatornode.h"
+#include "nodes/occlusionlocatornode.h"
+#include "nodes/interiorentrancelocatornode.h"
+#include "nodes/directionallocatornode.h"
+#include "nodes/ActionEventLocatorNode.h"
+#include "nodes/FOVLocatorNode.h"
+#include "nodes/BreakableCameraLocatorNode.h"
+#include "nodes/StaticCameraLocatorNode.h"
+#include "nodes/PedGroupLocator.h"
+#include "utility/mext.h"
+#include "utility/mui.h"
+#include "main/worldbuilder.h"
+#include "main/constants.h"
+
+#include "resources/resource.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+const short OFFSET = 10;
+const double SCALE_FACTOR = 0.002;
+const double DEFAULT_SCALE = 5;
+
+const char* LocatorContext::stringId = "LocatorContext";
+
+LocatorType::Type LocatorContext::mLastLocatorType = LocatorType::NUM_TYPES;
+LocatorEvent::Event LocatorContext::mLastEvent = LocatorEvent::CHECK_POINT;
+
+//==============================================================================
+// LocatorContextCmd::LocatorContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: LocatorContextCmd
+//
+//==============================================================================
+LocatorContextCmd::LocatorContextCmd()
+{
+}
+
+//==============================================================================
+// LocatorContextCmd::~LocatorContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: LocatorContextCmd
+//
+//==============================================================================
+LocatorContextCmd::~LocatorContextCmd()
+{
+}
+
+//-----------------------------------------------------------------------------
+// c r e a t o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* LocatorContextCmd::creator()
+{
+ return new LocatorContextCmd();
+}
+
+//-----------------------------------------------------------------------------
+// m a k e O b j
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPxContext* LocatorContextCmd::makeObj()
+{
+ return new LocatorContext();
+}
+
+//==============================================================================
+// LocatorContext::LocatorContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: LocatorContext
+//
+//==============================================================================
+LocatorContext::LocatorContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 )
+{
+ SetHelpString();
+
+ setTitleString( "Locator Creation Tool" );
+}
+
+//==============================================================================
+// LocatorContext::~LocatorContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: LocatorContext
+//
+//==============================================================================
+LocatorContext::~LocatorContext()
+{
+}
+
+//==============================================================================
+// LocatorContext::abortAction
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void LocatorContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//-----------------------------------------------------------------------------
+// c o m p l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void LocatorContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//-----------------------------------------------------------------------------
+// d e l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void LocatorContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//-----------------------------------------------------------------------------
+// d o D r a g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus LocatorContext::doDrag( MEvent& event )
+{
+
+ event.getPosition( mXDrag, mYDrag );
+ ProcessState( MOUSEDRAG );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o E n t e r R e g i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus LocatorContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o H o l d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus LocatorContext::doHold( MEvent& event )
+{
+ MStatus status = MS::kSuccess;
+ return status;
+}
+
+//-----------------------------------------------------------------------------
+// d o P r e s s
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus LocatorContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o R e l e a s e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus LocatorContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O f f C l e a n u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void LocatorContext::toolOffCleanup()
+{
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ mLocator = MObject::kNullObj;
+ mLocatorTransform = MObject::kNullObj;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O n S e t u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void LocatorContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+}
+
+//-----------------------------------------------------------------------------
+//
+// P R I V A T E M E M B E R S
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// p r o c e s s S t a t e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void LocatorContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ }
+ break;
+ case MOUSEDRAG:
+ {
+ }
+ break;
+ case BUTTONUP:
+ {
+ InitLocator();
+ }
+ break;
+ case COMPLETED:
+ case ABORTED:
+ {
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ mLocator = MObject::kNullObj;
+ mLocatorTransform = MObject::kNullObj;
+ }
+ }
+ break;
+ case DELETED:
+ {
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ MGlobal::deleteNode( mLocator );
+ MGlobal::deleteNode( mLocatorTransform );
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//==============================================================================
+// LocatorContext::SetHelpString
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void LocatorContext::SetHelpString()
+{
+ mHelp = "Click to create Locator.";
+
+ setHelpString( mHelp );
+}
+
+//==============================================================================
+// LocatorContext::InitLocator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void LocatorContext::InitLocator()
+{
+ //Get the mesh below the clicked point and find it's y height.
+ MPoint intersectPoint;
+
+ if ( MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) )
+ {
+ bool needsTriggerVolume = false;
+ bool lockTriggerRotation = false;
+ MString newName;
+
+ //What kind of locator do we want?
+ switch ( WorldBuilder::GetLocatorType() )
+ {
+ case LocatorType::EVENT:
+ {
+ MUI::PopupDialogue( IDD_DIALOG1, &EventLocatorNameCallBack );
+
+ newName = MString( EventLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+// if ( mLastLocatorType == LocatorType::EVENT )
+// {
+// if ( !mLocator.isNull() )
+// {
+// //Make this the same kind of event as the last one
+// MFnDependencyNode fnNode( mLocator );
+// fnNode.findPlug( EventLocatorNode::sEvent ).getValue( mLastEvent );
+// }
+// }
+// else
+ {
+ mLastLocatorType = LocatorType::EVENT;
+ }
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( EventLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+
+ MFnDependencyNode fnNode( mLocator );
+ fnNode.findPlug( EventLocatorNode::sEvent ).setValue( mLastEvent );
+
+ //Lock out the x and z axis on the transform.
+// MFnDependencyNode fnDepNode( mLocatorTransform );
+// fnDepNode.findPlug( MString("rx") ).setLocked( true );
+// fnDepNode.findPlug( MString("ry") ).setLocked( true );
+// fnDepNode.findPlug( MString("rz") ).setLocked( true );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::SCRIPT:
+ {
+ mLastLocatorType = LocatorType::SCRIPT;
+
+ MUI::PopupDialogue( IDD_DIALOG5, &ScriptLocatorNameCallBack );
+
+ newName = MString( ScriptLocatorNode::GetNewName() );
+
+ const char* script = ScriptLocatorNode::GetScriptName();
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( ScriptLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+
+ fnDepNode.setObject( mLocator );
+ fnDepNode.findPlug( ScriptLocatorNode::sScript ).setValue( script );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::GENERIC:
+ {
+ mLastLocatorType = LocatorType::GENERIC;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &GenericLocatorNameCallBack );
+
+ newName = MString( GenericLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( GenericLocatorNode::stringId ),
+ &newName );
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::CAR_START:
+ {
+ mLastLocatorType = LocatorType::CAR_START;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &CarStartLocatorNameCallBack );
+
+ newName = MString( CarStartLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( CarStartLocatorNode::stringId ),
+ &newName );
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::DYNAMIC_ZONE:
+ {
+ mLastLocatorType = LocatorType::DYNAMIC_ZONE;
+
+ MUI::PopupDialogue( IDD_DIALOG3, &ZoneEventLocatorNameCallBack );
+
+ newName = MString( ZoneEventLocatorNode::GetNewName() );
+
+ const char* zone = ZoneEventLocatorNode::GetZoneName();
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( ZoneEventLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+
+ fnDepNode.setObject( mLocator );
+ fnDepNode.findPlug( ZoneEventLocatorNode::sZone ).setValue( zone );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::OCCLUSION:
+ {
+ mLastLocatorType = LocatorType::OCCLUSION;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &OcclusionLocatorNameCallBack );
+
+ newName = MString( OcclusionLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( OcclusionLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+
+ fnDepNode.setObject( mLocator );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::INTERIOR_ENTRANCE:
+ {
+ mLastLocatorType = LocatorType::INTERIOR_ENTRANCE;
+
+ MUI::PopupDialogue( IDD_DIALOG3, &InteriorEntranceLocatorNameCallBack );
+
+ newName = MString( InteriorEntranceLocatorNode::GetNewName() );
+
+ const char* zone = InteriorEntranceLocatorNode::GetZoneName();
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( InteriorEntranceLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+// //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+// fnDepNode.findPlug( MString("rx") ).setLocked( true );
+// fnDepNode.findPlug( MString("ry") ).setLocked( true );
+// fnDepNode.findPlug( MString("rz") ).setLocked( true );
+
+ fnDepNode.setObject( mLocator );
+ fnDepNode.findPlug( InteriorEntranceLocatorNode::sZone ).setValue( zone );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::DIRECTIONAL:
+ {
+ mLastLocatorType = LocatorType::DIRECTIONAL;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &DirectionalLocatorNameCallBack );
+
+ newName = MString( DirectionalLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( DirectionalLocatorNode::stringId ),
+ &newName );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::ACTION:
+ {
+ mLastLocatorType = LocatorType::ACTION;
+
+ MUI::PopupDialogue( IDD_DIALOG4, &ActionEventLocatorNameCallBack );
+
+ newName = MString( ActionEventLocatorNode::GetNewName() );
+ MString objName = ActionEventLocatorNode::GetNewObj();
+ MString jointName = ActionEventLocatorNode::GetNewJoint();
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( ActionEventLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ //fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ //fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ //fnDepNode.findPlug( MString("rz") ).setLocked( true );
+
+ fnDepNode.setObject( mLocator );
+ fnDepNode.findPlug( ActionEventLocatorNode::sObject ).setValue( objName );
+ fnDepNode.findPlug( ActionEventLocatorNode::sJoint ).setValue( jointName );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::FOV:
+ {
+ mLastLocatorType = LocatorType::FOV;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &FOVLocatorNameCallBack );
+
+ newName = MString( FOVLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( FOVLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::BREAKABLE_CAMERA:
+ {
+ mLastLocatorType = LocatorType::BREAKABLE_CAMERA;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &BreakableCameraLocatorNameCallBack );
+
+ newName = MString( BreakableCameraLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( BreakableCameraLocatorNode::stringId ),
+ &newName );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::STATIC_CAMERA:
+ {
+ mLastLocatorType = LocatorType::STATIC_CAMERA;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &StaticCameraLocatorNameCallBack );
+
+ newName = MString( StaticCameraLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( StaticCameraLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ case LocatorType::PED_GROUP:
+ {
+ mLastLocatorType = LocatorType::PED_GROUP;
+
+ MUI::PopupDialogue( IDD_DIALOG1, &PedGroupLocatorNameCallBack );
+
+ newName = MString( PedGroupLocatorNode::GetNewName() );
+
+ if ( newName.length() > 0 )
+ {
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( PedGroupLocatorNode::stringId ),
+ &newName );
+
+ needsTriggerVolume = true;
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+ break;
+ default:
+ assert( false );
+ break;
+ }
+
+ assert( !mLocator.isNull() );
+
+ MExt::SetWorldPosition( intersectPoint, mLocator );
+
+ if ( needsTriggerVolume )
+ {
+ //Create and connect a trigger volume to this node.
+ MObject tv;
+ MObject tvt;
+
+ MString name( newName );
+ name += MString( "Trigger" );
+
+ MExt::CreateNode( tv,
+ tvt,
+ MString( TriggerVolumeNode::stringId ),
+ &name );
+
+ MExt::SetWorldPosition( intersectPoint, tv );
+
+ MFnTransform fnTransform( tvt );
+ const double scale[3] = { DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE };
+
+ //Scale this bad-boy!
+ fnTransform.setScale( scale );
+
+ if ( lockTriggerRotation )
+ {
+ fnTransform.findPlug( MString( "rx" ) ).setLocked( true );
+ fnTransform.findPlug( MString( "ry" ) ).setLocked( true );
+ fnTransform.findPlug( MString( "rz" ) ).setLocked( true );
+ }
+
+ //Connect the Trigger Volume to the Locator.
+ MExt::Connect( tv, "locator", mLocator, "triggers" );
+
+ WorldBuilder::AddChild( tv );
+ }
+
+ WorldBuilder::AddChild( mLocator );
+
+ }
+
+DIE:
+ MGlobal::clearSelectionList();
+}
diff --git a/tools/worldbuilder/code/contexts/locatorcontext.h b/tools/worldbuilder/code/contexts/locatorcontext.h
new file mode 100644
index 0000000..a785b8c
--- /dev/null
+++ b/tools/worldbuilder/code/contexts/locatorcontext.h
@@ -0,0 +1,86 @@
+#include "precompiled/PCH.h"
+
+#ifndef LOCATOR_CONTEXT
+#define LOCATOR_CONTEXT
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <..\..\..\game\code\meta\locatortypes.h>
+#include <..\..\..\game\code\meta\locatorevents.h>
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// L o c a t o r C o n t e x t
+//
+//-----------------------------------------------------------------------------
+class LocatorContext : public MPxContext
+{
+ public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+
+ LocatorContext();
+ virtual ~LocatorContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& );
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& );
+ virtual MStatus doDrag( MEvent& );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+ private:
+ void ProcessState( Stimulus stimulus );
+ void SetHelpString();
+ void InitLocator();
+
+ MString mHelp;
+
+ short mXCurrent, mYCurrent;
+ short mXDrag, mYDrag;
+ MObject mLocator;
+ MObject mLocatorTransform;
+
+ static LocatorType::Type mLastLocatorType;
+ static LocatorEvent::Event mLastEvent;
+};
+
+//-----------------------------------------------------------------------------
+//
+// I n t e r s e c t i o n C o n t e x t C m d
+//
+//-----------------------------------------------------------------------------
+class LocatorContextCmd : public MPxContextCommand
+{
+ public:
+ LocatorContextCmd();
+ virtual ~LocatorContextCmd();
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+#endif
diff --git a/tools/worldbuilder/code/contexts/triggercontext.cpp b/tools/worldbuilder/code/contexts/triggercontext.cpp
new file mode 100644
index 0000000..53c195e
--- /dev/null
+++ b/tools/worldbuilder/code/contexts/triggercontext.cpp
@@ -0,0 +1,488 @@
+//----------------------------------------
+// System Includes
+//----------------------------------------
+#include <math.h>
+
+//----------------------------------------
+// Project Includes
+//----------------------------------------
+#include <nodes/triggervolumenode.h>
+#include <nodes/occlusionlocatornode.h>
+#include "triggercontext.h"
+#include "utility/mext.h"
+#include "utility/mui.h"
+#include "main/worldbuilder.h"
+#include "main/constants.h"
+
+#include "resources/resource.h"
+
+//----------------------------------------
+// Constants, Typedefs and Statics
+//----------------------------------------
+
+const short OFFSET = 10;
+const double SCALE_FACTOR = 0.002;
+const double DEFAULT_SCALE = 25;
+
+const char* TriggerContext::stringId = "TriggerContext";
+
+//==============================================================================
+// TriggerContextCmd::TriggerContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TriggerContextCmd
+//
+//==============================================================================
+TriggerContextCmd::TriggerContextCmd()
+{
+}
+
+//==============================================================================
+// TriggerContextCmd::~TriggerContextCmd
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TriggerContextCmd
+//
+//==============================================================================
+TriggerContextCmd::~TriggerContextCmd()
+{
+}
+
+//-----------------------------------------------------------------------------
+// c r e a t o r
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void* TriggerContextCmd::creator()
+{
+ return new TriggerContextCmd();
+}
+
+//-----------------------------------------------------------------------------
+// m a k e O b j
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MPxContext* TriggerContextCmd::makeObj()
+{
+ return new TriggerContext();
+}
+
+//==============================================================================
+// TriggerContext::TriggerContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TriggerContext
+//
+//==============================================================================
+TriggerContext::TriggerContext() :
+ mXCurrent( 0 ),
+ mYCurrent( 0 )
+{
+ SetHelpString();
+
+ setTitleString( "Trigger Creation Tool" );
+}
+
+//==============================================================================
+// TriggerContext::~TriggerContext
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: TriggerContext
+//
+//==============================================================================
+TriggerContext::~TriggerContext()
+{
+}
+
+//==============================================================================
+// TriggerContext::abortAction
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TriggerContext::abortAction()
+{
+ ProcessState( ABORTED );
+}
+
+//-----------------------------------------------------------------------------
+// c o m p l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void TriggerContext::completeAction()
+{
+ ProcessState( COMPLETED );
+}
+
+//-----------------------------------------------------------------------------
+// d e l e t e A c t i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void TriggerContext::deleteAction()
+{
+ ProcessState( DELETED );
+}
+
+//-----------------------------------------------------------------------------
+// d o D r a g
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus TriggerContext::doDrag( MEvent& event )
+{
+
+ event.getPosition( mXDrag, mYDrag );
+ ProcessState( MOUSEDRAG );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o E n t e r R e g i o n
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus TriggerContext::doEnterRegion( MEvent& event )
+{
+ SetHelpString();
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o H o l d
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus TriggerContext::doHold( MEvent& event )
+{
+ MStatus status = MS::kSuccess;
+ return status;
+}
+
+//-----------------------------------------------------------------------------
+// d o P r e s s
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus TriggerContext::doPress( MEvent& event )
+{
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONDOWN );
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// d o R e l e a s e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+MStatus TriggerContext::doRelease( MEvent& event )
+{
+ if ( event.mouseButton() == MEvent::kLeftMouse )
+ {
+ event.getPosition( mXCurrent, mYCurrent );
+ ProcessState( BUTTONUP );
+ }
+
+ return MS::kSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O f f C l e a n u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void TriggerContext::toolOffCleanup()
+{
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ mLocator = MObject::kNullObj;
+ mLocatorTransform = MObject::kNullObj;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// t o o l O n S e t u p
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void TriggerContext::toolOnSetup( MEvent& event )
+{
+ setCursor( MCursor::crossHairCursor );
+}
+
+//-----------------------------------------------------------------------------
+//
+// P R I V A T E M E M B E R S
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// p r o c e s s S t a t e
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+void TriggerContext::ProcessState( Stimulus stimulus )
+{
+ switch( stimulus )
+ {
+ case BUTTONDOWN:
+ {
+ }
+ break;
+ case MOUSEDRAG:
+ {
+ }
+ break;
+ case BUTTONUP:
+ {
+ InitLocator();
+ }
+ break;
+ case COMPLETED:
+ case ABORTED:
+ {
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ mLocator = MObject::kNullObj;
+ mLocatorTransform = MObject::kNullObj;
+ }
+ }
+ break;
+ case DELETED:
+ {
+ if ( mLocatorTransform != MObject::kNullObj )
+ {
+ MGlobal::deleteNode( mLocator );
+ MGlobal::deleteNode( mLocatorTransform );
+ }
+ }
+ break;
+ default:
+ {
+ }
+ break;
+ }
+
+ SetHelpString();
+}
+
+//==============================================================================
+// TriggerContext::SetHelpString
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TriggerContext::SetHelpString()
+{
+ mHelp = "Click to create Locator.";
+
+ setHelpString( mHelp );
+}
+
+//==============================================================================
+// TriggerContext::InitLocator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void TriggerContext::InitLocator()
+{
+ //Get the mesh below the clicked point and find it's y height.
+ MPoint intersectPoint;
+
+ if ( MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) )
+ {
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, MString( WorldBuilder::GetSelectedLocator() ) );
+
+ MFnDagNode fnDagNode( dagPath );
+
+ bool isOcclusionNode = false;
+ bool isVisibler = false;
+
+ if ( fnDagNode.typeId() == OcclusionLocatorNode::id )
+ {
+ isOcclusionNode = true;
+
+ MString cmd( "IsVisibler" );
+
+ int result = 0;
+ MGlobal::executeCommand( cmd, result );
+ isVisibler = (result == 1);
+ }
+
+ MString selectedObjectName;
+ selectedObjectName = fnDagNode.name();
+
+ if ( selectedObjectName.length() > 0 )
+ {
+ MString newName;
+
+ if ( isOcclusionNode )
+ {
+ if ( isVisibler )
+ {
+ newName = MString("Vis") + selectedObjectName + MString("Trig");
+ }
+ else
+ {
+ newName = MString("Occ") + selectedObjectName + MString("Trig");
+ }
+ }
+ else
+ {
+ newName = selectedObjectName + MString("Trigger");
+ }
+
+ //TODO, parent this properly.
+ MExt::CreateNode( mLocator,
+ mLocatorTransform,
+ MString( TriggerVolumeNode::stringId ),
+ &newName );
+
+
+ if ( isOcclusionNode )
+ {
+ //Lock out the x and z axis on the transform.
+ MFnDependencyNode fnDepNode( mLocatorTransform );
+ fnDepNode.findPlug( MString("rx") ).setLocked( true );
+ fnDepNode.findPlug( MString("ry") ).setLocked( true );
+ fnDepNode.findPlug( MString("rz") ).setLocked( true );
+ }
+
+ MExt::SetWorldPosition( intersectPoint, mLocator );
+
+ MFnTransform fnTransform( mLocatorTransform );
+ const double scale[3] = { DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE };
+
+ //Scale this bad-boy!
+ fnTransform.setScale( scale );
+
+
+ //Connect the Trigger Volume to the Locator.
+ MExt::Connect( mLocator, "locator", fnDagNode.object(), "triggers" );
+
+ WorldBuilder::AddChild( mLocator );
+ }
+ else
+ {
+ goto DIE; //Die outta here. It's cancelled.
+ }
+ }
+
+DIE:
+ MGlobal::clearSelectionList();
+}
diff --git a/tools/worldbuilder/code/contexts/triggercontext.h b/tools/worldbuilder/code/contexts/triggercontext.h
new file mode 100644
index 0000000..169355d
--- /dev/null
+++ b/tools/worldbuilder/code/contexts/triggercontext.h
@@ -0,0 +1,82 @@
+#include "precompiled/PCH.h"
+
+#ifndef TRIGGER_CONTEXT
+#define TRIGGER_CONTEXT
+
+//----------------------------------------
+// System Includes
+//----------------------------------------
+
+
+//----------------------------------------
+// Forward References
+//----------------------------------------
+
+//-----------------------------------------------------------------------------
+//
+// T r i g g e r C o n t e x t
+//
+//-----------------------------------------------------------------------------
+class TriggerContext : public MPxContext
+{
+ public:
+
+ enum Stimulus // Maskable values.
+ {
+ BUTTONDOWN = 0x0001,
+ BUTTONUP = 0x0002,
+ MOUSEDRAG = 0x0004,
+ COMPLETED = 0x0008,
+ DELETED = 0x0010,
+ ABORTED = 0x0020
+ };
+
+
+ TriggerContext();
+ virtual ~TriggerContext();
+
+ static const char* stringId;
+
+ virtual void toolOnSetup( MEvent& );
+ virtual void toolOffCleanup();
+ virtual MStatus doPress( MEvent& );
+ virtual MStatus doDrag( MEvent& );
+ virtual MStatus doRelease( MEvent& event );
+ virtual MStatus doHold( MEvent& event );
+ virtual MStatus doEnterRegion( MEvent& event );
+ virtual void deleteAction();
+ virtual void completeAction();
+ virtual void abortAction();
+
+ private:
+ void ProcessState( Stimulus stimulus );
+ void SetHelpString();
+ void InitLocator();
+
+ MString mHelp;
+
+ short mXCurrent, mYCurrent;
+ short mXDrag, mYDrag;
+ MObject mLocator;
+ MObject mLocatorTransform;
+};
+
+//-----------------------------------------------------------------------------
+//
+// T r i g g e r C o n t e x t C m d
+//
+//-----------------------------------------------------------------------------
+class TriggerContextCmd : public MPxContextCommand
+{
+ public:
+ TriggerContextCmd();
+ virtual ~TriggerContextCmd();
+
+ static void* creator();
+
+ virtual MPxContext* makeObj();
+
+ private:
+};
+
+#endif //TRIGGER_CONTEXT
diff --git a/tools/worldbuilder/code/gameengine/gameengine.cpp b/tools/worldbuilder/code/gameengine/gameengine.cpp
new file mode 100644
index 0000000..6aedada
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/gameengine.cpp
@@ -0,0 +1,749 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: GameEngine.cpp
+//
+// Description: Implement GameEngine
+//
+// History: 19/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+
+#ifdef WORLD_BUILDER
+#include "main/toolhack.h"
+#endif
+
+#include <assert.h>
+#include <tlmatrix.hpp>
+#include <tlpoint.hpp>
+#include <p3d/pointcamera.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "GameEngine.h"
+#include "nodes/railcamlocatornode.h"
+#include "nodes/staticcameralocatornode.h"
+#include "nodes/fovlocatornode.h"
+#include "nodes/splinelocatornode.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/staticcameralocatornode.h"
+#include "..\..\..\game\code\meta\recttriggervolume.h"
+#include "..\..\..\game\code\meta\spheretriggervolume.h"
+#include "..\..\..\game\code\meta\triggervolume.h"
+#include "utility\mext.h"
+#include "utility\glext.h"
+#include "main\constants.h"
+#include "wbcamtarget.h"
+
+#include "..\..\..\game\code\camera\railcam.h"
+#include "..\..\..\game\code\camera\staticcam.h"
+#include "utility/transformmatrix.h"
+
+#include <radtime.hpp>
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+GameEngine* GameEngine::mInstance = NULL;
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// GameEngine::CreateInstance
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::CreateInstance()
+{
+ assert( mInstance == NULL );
+
+ mInstance = new GameEngine();
+}
+
+//=============================================================================
+// GameEngine::DestroyInstance
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::DestroyInstance()
+{
+ assert( mInstance );
+
+ delete mInstance;
+ mInstance = NULL;
+}
+
+//=============================================================================
+// GameEngine::GetInstance
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: GameEngine
+//
+//=============================================================================
+GameEngine* GameEngine::GetInstance()
+{
+ return mInstance;
+}
+
+//=============================================================================
+// GameEngine::UpdateRailCam
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& railCam )
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::UpdateRailCam( MObject& railCamObj )
+{
+ MStatus status;
+
+ MFnDependencyNode fnDepNode ( railCamObj );
+
+ MPlug activePlug = fnDepNode.findPlug( RailCamLocatorNode::sActive, &status );
+ assert( status );
+
+ bool active = false;
+ activePlug.getValue( active );
+
+ //Test to see if this is active.
+ if ( active )
+ {
+ MString targetName;
+ fnDepNode.findPlug( RailCamLocatorNode::sTarget, &status ).getValue( targetName );
+ assert( status );
+
+ //Test to see if this has a target...
+ if ( targetName.length() != 0 )
+ {
+ MDagPath targetPath;
+ MObject targetObj;
+ if ( !MExt::FindDagNodeByName( &targetPath, targetName ) )
+ {
+ //The target does not exist...
+ return;
+ }
+
+ targetObj = targetPath.node();
+
+ RailCam* railCam = dynamic_cast<RailCamLocatorNode*>(fnDepNode.userNode())->GetRailCam();
+ assert( railCam );
+
+ WBCamTarget* target = dynamic_cast<RailCamLocatorNode*>(fnDepNode.userNode())->GetTarget();
+ assert( target );
+
+ target->SetTarget( targetObj );
+
+ rmt::Vector position;
+ target->GetPosition( &position );
+
+ //Get the spline locator (it has the triggers)
+ MPlug railPlug = fnDepNode.findPlug( MString( "message" ), &status );
+ assert( status );
+
+ MPlugArray targets;
+ railPlug.connectedTo( targets, false, true, &status );
+ assert( status );
+
+ assert( targets.length() == 1 );
+ if ( targets.length() != 1 )
+ {
+ return;
+ }
+
+ MObject splineLoc = targets[0].node();
+
+ MFnDependencyNode splineFNDepNode( splineLoc );
+ MPlug triggersPlug = splineFNDepNode.findPlug( SplineLocatorNode::sTriggers, &status );
+ assert( status );
+
+ MPlugArray sources;
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ //Test to see if the target is in a trigger volume for this
+ //Test against all triggers...
+ MFnDependencyNode triggerFNDepNode( sources[i].node() );
+ int type = 0;
+ triggerFNDepNode.findPlug( TriggerVolumeNode::sType, &status ).getValue( type );
+ assert( status );
+
+ bool inside = false;
+
+ tlMatrix mat;
+ tlPoint scale;
+ TriggerVolumeNode::GetScaleAndMatrix( sources[i].node(), mat, scale );
+
+ switch ( type )
+ {
+ case TriggerVolumeNode::RECTANGLE:
+ {
+ RectTriggerVolume* trigVol = new RectTriggerVolume( mat.GetRow( 3 ),
+ mat.GetRow( 0 ),
+ mat.GetRow( 1 ),
+ mat.GetRow( 2 ),
+ scale.x,
+ scale.y,
+ scale.z );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ case TriggerVolumeNode::SPHERE:
+ {
+ SphereTriggerVolume* trigVol = new SphereTriggerVolume( mat.GetRow( 3 ), scale.x );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ default:
+ assert( false );
+ }
+
+ if ( inside )
+ {
+ //If the object is in a trigger volume update the camera and set
+ //the new position of the railCam
+
+ //We need to give it the splinecurve.
+ MPlug splineCurvePlug = fnDepNode.findPlug( RailCamLocatorNode::sRail, &status );
+ assert( status );
+
+ MPlugArray splines;
+ splineCurvePlug.connectedTo( splines, true, false, &status );
+ assert( status );
+
+ assert( splines.length() == 1 );
+ if ( splines.length() != 1 )
+ {
+ //Something has deleted the spline.
+ return;
+ }
+
+ MFnDependencyNode splineCurveFNDepNode( splines[0].node() );
+
+ MDagPath splineCurvePath;
+ bool found = MExt::FindDagNodeByName( &splineCurvePath, splineCurveFNDepNode.name() );
+ assert( found );
+
+ MFnNurbsCurve fnNurbsCurve( splineCurvePath, &status );
+ assert( status );
+
+ MPointArray cvs;
+ fnNurbsCurve.getCVs( cvs, MSpace::kWorld );
+
+ railCam->SetNumCVs( cvs.length() );
+
+ unsigned int cvCount;
+ for ( cvCount = 0; cvCount < cvs.length(); ++cvCount )
+ {
+ float x, y, z;
+
+ x = cvs[cvCount].x / WBConstants::Scale;
+ y = cvs[cvCount].y / WBConstants::Scale;
+ z = -cvs[cvCount].z / WBConstants::Scale;
+
+ rmt::Vector point( x, y, z );
+
+ railCam->SetVertex( cvCount, point );
+ }
+
+ railCam->SetTarget( target );
+
+
+ //Test for FOV changes.
+ UpdateFOV( railCam, position );
+
+ UpdateRailSettings( railCam, railCamObj );
+
+ railCam->Update( 16 );
+
+ rmt::Vector newPos;
+ railCam->GetCamera()->GetPosition( &newPos );
+ rmt::Vector newTarg;
+ railCam->GetCamera()->GetTarget( &newTarg );
+ rmt::Vector newVUp;
+ railCam->GetCamera()->GetVUp( &newVUp );
+ float fov, aspect;
+ railCam->GetCamera()->GetFOV( &fov, &aspect );
+
+ mMayaCam->Set( newPos, newTarg, newVUp, rmt::RadianToDeg(fov) );
+
+ MPoint newPoint;
+ newPoint.x = newPos.x * WBConstants::Scale;
+ newPoint.y = newPos.y * WBConstants::Scale;
+ newPoint.z = -newPos.z * WBConstants::Scale;
+
+ MExt::SetWorldPosition( newPoint, railCamObj );
+
+ //Get out of the loop.
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+//=============================================================================
+// GameEngine::UpdateStaticCam
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& staticCam )
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::UpdateStaticCam( MObject& staticCamObj )
+{
+ MStatus status;
+
+ MFnDependencyNode fnDepNode ( staticCamObj );
+
+ MPlug activePlug = fnDepNode.findPlug( StaticCameraLocatorNode::sActive, &status );
+ assert( status );
+
+ bool active = false;
+ activePlug.getValue( active );
+
+ //Test to see if this is active.
+ if ( active )
+ {
+ bool tracking = false;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sTracking, &status ).getValue( tracking );
+ assert( status );
+
+ MString targetName;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sTarget, &status ).getValue( targetName );
+ assert( status );
+
+ //Test to see if this has a target...
+ if ( targetName.length() != 0 )
+ {
+ MDagPath targetPath;
+ MObject targetObj;
+ if ( !MExt::FindDagNodeByName( &targetPath, targetName ) )
+ {
+ //The target does not exist...
+ return;
+ }
+
+ //Now we have a target to test for being in the cameras trigger volume
+ targetObj = targetPath.node();
+
+ StaticCam* staticCam = reinterpret_cast<StaticCameraLocatorNode*>(fnDepNode.userNode())->GetStaticCam();
+ assert( staticCam );
+
+ WBCamTarget* target = reinterpret_cast<StaticCameraLocatorNode*>(fnDepNode.userNode())->GetTarget();
+ assert( target );
+
+ target->SetTarget( targetObj );
+
+ rmt::Vector position;
+ target->GetPosition( &position );
+
+ //Test the trigger volumes
+ MPlug triggersPlug = fnDepNode.findPlug( StaticCameraLocatorNode::sTriggers, &status );
+ assert( status );
+
+ MPlugArray sources, targets;
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ //Test to see if the target is in a trigger volume for this
+ //Test against all triggers...
+ MFnDependencyNode triggerFNDepNode( sources[i].node() );
+ int type = 0;
+ triggerFNDepNode.findPlug( TriggerVolumeNode::sType, &status ).getValue( type );
+ assert( status );
+
+ bool inside = false;
+
+ tlMatrix mat;
+ tlPoint scale;
+ TriggerVolumeNode::GetScaleAndMatrix( sources[i].node(), mat, scale );
+
+ switch ( type )
+ {
+ case TriggerVolumeNode::RECTANGLE:
+ {
+ RectTriggerVolume* trigVol = new RectTriggerVolume( mat.GetRow( 3 ),
+ mat.GetRow( 0 ),
+ mat.GetRow( 1 ),
+ mat.GetRow( 2 ),
+ scale.x,
+ scale.y,
+ scale.z );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ case TriggerVolumeNode::SPHERE:
+ {
+ SphereTriggerVolume* trigVol = new SphereTriggerVolume( mat.GetRow( 3 ), scale.x );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ default:
+ assert( false );
+ }
+
+ if ( inside )
+ {
+ //If the object is in a trigger volume update the camera and set
+ //the new position of the static cam
+
+ staticCam->SetTarget( target );
+
+
+ //Test for FOV changes.
+ UpdateFOV( staticCam, position );
+
+ UpdateStaticCamSettings( staticCam, staticCamObj );
+
+ staticCam->Update( 16 );
+
+ rmt::Vector newPos;
+ staticCam->GetCamera()->GetPosition( &newPos );
+ rmt::Vector newTarg;
+ staticCam->GetCamera()->GetTarget( &newTarg );
+ rmt::Vector newVUp;
+ staticCam->GetCamera()->GetVUp( &newVUp );
+ float fov, aspect;
+ staticCam->GetCamera()->GetFOV( &fov, &aspect );
+
+ mMayaCam->Set( newPos, newTarg, newVUp, rmt::RadianToDeg(fov) );
+
+ MPoint newPoint;
+ newPoint.x = newPos.x * WBConstants::Scale;
+ newPoint.y = newPos.y * WBConstants::Scale;
+ newPoint.z = -newPos.z * WBConstants::Scale;
+
+ MExt::SetWorldPosition( newPoint, staticCamObj );
+
+ //Get out of the loop.
+ break;
+ }
+ }
+ }
+ }
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// GameEngine::GameEngine
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+GameEngine::GameEngine() :
+ mTimeStart(0)
+{
+ mMayaCam = new MayaCamera();
+}
+
+//==============================================================================
+// GameEngine::~GameEngine
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+GameEngine::~GameEngine()
+{
+ Init();
+
+ delete mMayaCam;
+}
+
+void GameEngine::Init()
+{
+}
+
+//=============================================================================
+// GameEngine::UpdateRailSettings
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( RailCam* railCam, MObject obj )
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::UpdateRailSettings( RailCam* railCam, MObject obj )
+{
+ MFnDependencyNode fnDepNode( obj );
+
+ int behav;
+ fnDepNode.findPlug( RailCamLocatorNode::sBehaviour).getValue( behav );
+ railCam->SetBehaviour( (RailCam::Behaviour)(behav) );
+
+ float minRad;
+ fnDepNode.findPlug( RailCamLocatorNode::sMinRadius ).getValue( minRad );
+ railCam->SetMinRadius( minRad );
+
+ float maxRad;
+ fnDepNode.findPlug( RailCamLocatorNode::sMaxRadius ).getValue( maxRad );
+ railCam->SetMaxRadius( maxRad );
+
+ bool trackRail;
+ fnDepNode.findPlug( RailCamLocatorNode::sTrackRail ).getValue( trackRail );
+ railCam->SetTrackRail( trackRail );
+
+ float trackDist;
+ fnDepNode.findPlug( RailCamLocatorNode::sTrackDist ).getValue( trackDist );
+ railCam->SetTrackDist( trackDist );
+
+ bool reverse;
+ fnDepNode.findPlug( RailCamLocatorNode::sReverseSense ).getValue( reverse );
+ railCam->SetReverseSense( reverse );
+
+ float fov;
+ fnDepNode.findPlug( RailCamLocatorNode::sFOV ).getValue( fov );
+ railCam->SetFOV( rmt::DegToRadian(fov) );
+
+ float x, y, z;
+ fnDepNode.findPlug( RailCamLocatorNode::sFacingOffset ).child(0).getValue( x );
+ fnDepNode.findPlug( RailCamLocatorNode::sFacingOffset ).child(1).getValue( y );
+ fnDepNode.findPlug( RailCamLocatorNode::sFacingOffset ).child(2).getValue( z );
+ railCam->SetTargetOffset( rmt::Vector( x, y, z ) );
+
+ //Same with axis play... TODO
+
+ float posLag;
+ fnDepNode.findPlug( RailCamLocatorNode::sPositionLag ).getValue( posLag );
+ railCam->SetPositionLag( posLag );
+
+ float targLag;
+ fnDepNode.findPlug( RailCamLocatorNode::sTargetLag ).getValue( targLag );
+ railCam->SetTargetLag( targLag );
+}
+
+//=============================================================================
+// GameEngine::UpdateStaticCamSettings
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( StaticCam* staticCam, MObject obj )
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::UpdateStaticCamSettings( StaticCam* staticCam, MObject obj )
+{
+ MFnDependencyNode fnDepNode( obj );
+
+ float fov;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sFOV ).getValue( fov );
+ staticCam->SetFOV( rmt::DegToRadian(fov) );
+
+ float targLag;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sTargetLag ).getValue( targLag );
+ staticCam->SetTargetLag( targLag );
+
+ MPoint worldPos;
+ MExt::GetWorldPosition( &worldPos, obj );
+
+ rmt::Vector pos;
+ pos.x = worldPos.x / WBConstants::Scale;
+ pos.y = worldPos.y / WBConstants::Scale;
+ pos.z = -worldPos.z / WBConstants::Scale;
+
+ staticCam->SetPosition( pos );
+
+ bool tracking = false;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sTracking ).getValue( tracking );
+ staticCam->SetTracking( tracking );
+
+ float x, y, z;
+ fnDepNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(0).getValue( x );
+ fnDepNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(1).getValue( y );
+ fnDepNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(2).getValue( z );
+
+ if ( tracking )
+ {
+ staticCam->SetTargetOffset( rmt::Vector( x, y, z ) );
+ }
+ else
+ {
+ //Figure out the transformation on the locator node and apply it to the offset.
+ MObject transform;
+ MFnDagNode fnDAGNode( obj );
+ transform = fnDAGNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0];
+ hmatrix.element[3][1];
+ hmatrix.element[3][2];
+
+ if ( x == 0 && y == 0 && z == 0 )
+ {
+ z = 1.0f;
+ }
+
+ tlPoint offset( x, y, z );
+ offset = VectorTransform( hmatrix, offset );
+
+ rmt::Vector targPos = pos;
+ targPos.Add( offset );
+ staticCam->SetTargetOffset( targPos );
+ }
+}
+
+//=============================================================================
+// GameEngine::UpdateFOV
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( SuperCam* cam, const rmt::Vector position )
+//
+// Return: void
+//
+//=============================================================================
+void GameEngine::UpdateFOV( SuperCam* cam, const rmt::Vector position )
+{
+ MStatus status;
+ MItDag dagIt( MItDag::kDepthFirst, MFn::kLocator );
+
+ bool inside = false;
+
+ while ( !dagIt.isDone() )
+ {
+ MFnDependencyNode fnNode( dagIt.item() );
+ if ( fnNode.typeId() == FOVLocatorNode::id )
+ {
+ //This is a FOV locator, let's see if we're in it's trigger volume.
+
+ MPlug triggersPlug = fnNode.findPlug( FOVLocatorNode::sTriggers, &status );
+ assert( status );
+
+ MPlugArray sources, targets;
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ //Test to see if the target is in a trigger volume for this
+ //Test against all triggers...
+ MFnDependencyNode triggerFNDepNode( sources[i].node() );
+ int type = 0;
+ triggerFNDepNode.findPlug( TriggerVolumeNode::sType, &status ).getValue( type );
+ assert( status );
+
+ tlMatrix mat;
+ tlPoint scale;
+ TriggerVolumeNode::GetScaleAndMatrix( sources[i].node(), mat, scale );
+
+ switch ( type )
+ {
+ case TriggerVolumeNode::RECTANGLE:
+ {
+ RectTriggerVolume* trigVol = new RectTriggerVolume( mat.GetRow( 3 ),
+ mat.GetRow( 0 ),
+ mat.GetRow( 1 ),
+ mat.GetRow( 2 ),
+ scale.x,
+ scale.y,
+ scale.z );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ case TriggerVolumeNode::SPHERE:
+ {
+ SphereTriggerVolume* trigVol = new SphereTriggerVolume( mat.GetRow( 3 ), scale.x );
+
+ inside = trigVol->Contains( position );
+
+ trigVol->Release();
+ }
+ break;
+ default:
+ assert( false );
+ }
+
+ if ( inside )
+ {
+ float fov;
+ float time;
+ float rate;
+ fnNode.findPlug( FOVLocatorNode::sFOV ).getValue( fov );
+ fnNode.findPlug( FOVLocatorNode::sTime ).getValue( time );
+ fnNode.findPlug( FOVLocatorNode::sRate ).getValue( rate );
+
+ cam->SetFOVOverride( rmt::DegToRadian( fov ) );
+ cam->OverrideFOV( true, time, rate );
+
+ break;
+ }
+ }
+ }
+
+ dagIt.next();
+ }
+
+ if ( !inside )
+ {
+ cam->OverrideFOV( false, 2000, 0.04f );
+ }
+}
diff --git a/tools/worldbuilder/code/gameengine/gameengine.h b/tools/worldbuilder/code/gameengine/gameengine.h
new file mode 100644
index 0000000..b3b3fa0
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/gameengine.h
@@ -0,0 +1,85 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: gameengine.h
+//
+// Description: Blahblahblah
+//
+// History: 19/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef GAMEENGINE_H
+#define GAMEENGINE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "main/toolhack.h"
+
+#include "precompiled/PCH.h"
+
+#include "mayacamera.h"
+
+//========================================
+// Forward References
+//========================================
+class RailCam;
+class SuperCam;
+class WBCamTarget;
+class StaticCam;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class GameEngine
+{
+public:
+ static void CreateInstance();
+ static void DestroyInstance();
+
+ static GameEngine* GetInstance();
+
+ void UpdateRailCam( MObject& railCam );
+ void UpdateStaticCam( MObject& staticCam );
+
+ MayaCamera& GetMayaCam();
+
+private:
+ void UpdateRailSettings( RailCam* railCam, MObject obj );
+ void UpdateStaticCamSettings( StaticCam* staticCam, MObject obj );
+
+ static GameEngine* mInstance;
+ MayaCamera* mMayaCam;
+
+ unsigned int mTimeStart;
+
+ GameEngine();
+ virtual ~GameEngine();
+ void Init();
+ void UpdateFOV( SuperCam* cam, const rmt::Vector position );
+
+ //Prevent wasteful constructor creation.
+ GameEngine( const GameEngine& gameengine );
+ GameEngine& operator=( const GameEngine& gameengine );
+};
+
+//=============================================================================
+// GameEngine::GetMayaCam
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline MayaCamera& GameEngine::GetMayaCam()
+{
+ return *mMayaCam;
+}
+
+#endif //GAMEENGINE_H
diff --git a/tools/worldbuilder/code/gameengine/mayacamera.cpp b/tools/worldbuilder/code/gameengine/mayacamera.cpp
new file mode 100644
index 0000000..6104cd5
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/mayacamera.cpp
@@ -0,0 +1,151 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: MayaCamera.cpp
+//
+// Description: Implement MayaCamera
+//
+// History: 22/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+// Foundation Tech
+#include <raddebug.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "MayaCamera.h"
+#include "main/constants.h"
+#include "utility/mext.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+const MString WB_CAM_NAME( "WorldBuilderCam" );
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// MayaCamera::MayaCamera
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+MayaCamera::MayaCamera()
+{
+ EnsureCamExists();
+}
+
+//==============================================================================
+// MayaCamera::~MayaCamera
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+MayaCamera::~MayaCamera()
+{
+}
+
+//=============================================================================
+// MayaCamera::EnsureCamExists
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void MayaCamera::EnsureCamExists()
+{
+ MStatus status;
+ MFnCamera fnCamera;
+
+ MDagPath path;
+
+ if ( !MExt::FindDagNodeByName( &path, WB_CAM_NAME ) )
+ {
+ fnCamera.create( &status );
+ assert( status );
+
+ fnCamera.setName( WB_CAM_NAME + MString( "Camera" ) );
+
+ MFnDependencyNode transform( fnCamera.parent( 0 ) );
+
+ MString transName = WB_CAM_NAME;
+ transform.setName( transName );
+ }
+}
+
+//=============================================================================
+// MayaCamera::Set
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const rmt::Vector& position, const rmt::Vector& target, const rmt::Vector& vup, float fov )
+//
+// Return: void
+//
+//=============================================================================
+void MayaCamera::Set( const rmt::Vector& position, const rmt::Vector& target, const rmt::Vector& vup, float fov )
+{
+ MStatus status;
+
+ EnsureCamExists();
+
+ MDagPath path;
+ bool found = MExt::FindDagNodeByName( &path, WB_CAM_NAME );
+ assert( found );
+
+ MFnCamera fnCamera( path, &status );
+ assert( status );
+
+
+ //Scale it so you can see it.
+ MFnTransform fnTransform( fnCamera.parent( 0 ) );
+ const double scale[3] = { 200, 200, 200 } ;
+ fnTransform.setScale( scale );
+
+ MPoint eyePosition;
+ eyePosition.x = position.x * WBConstants::Scale;
+ eyePosition.y = position.y * WBConstants::Scale;
+ eyePosition.z = -position.z * WBConstants::Scale;
+
+ MVector viewDirection;
+ viewDirection.x = (target.x - position.x) * WBConstants::Scale;
+ viewDirection.y = (target.y - position.y) * WBConstants::Scale;
+ viewDirection.z = -(target.z - position.z) * WBConstants::Scale;
+
+ MVector viewUp;
+ viewUp.x = vup.x;
+ viewUp.y = vup.y;
+ viewUp.z = -vup.z;
+
+ status = fnCamera.set( eyePosition, viewDirection, viewUp, rmt::DegToRadian(fov), 4/3 );
+ assert( status );
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/gameengine/mayacamera.h b/tools/worldbuilder/code/gameengine/mayacamera.h
new file mode 100644
index 0000000..a013366
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/mayacamera.h
@@ -0,0 +1,49 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: mayacamera.h
+//
+// Description: Blahblahblah
+//
+// History: 22/07/2002 + Created -- CaryBrisebois
+//
+//=============================================================================
+
+#ifndef MAYACAMERA_H
+#define MAYACAMERA_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+#include <radmath/radmath.hpp>
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class MayaCamera
+{
+public:
+ MayaCamera();
+ virtual ~MayaCamera();
+
+ void EnsureCamExists();
+ void Set( const rmt::Vector& position, const rmt::Vector& target, const rmt::Vector& vup, float fov );
+
+private:
+
+ //Prevent wasteful constructor creation.
+ MayaCamera( const MayaCamera& mayacamera );
+ MayaCamera& operator=( const MayaCamera& mayacamera );
+};
+
+
+#endif //MAYACAMERA_H
diff --git a/tools/worldbuilder/code/gameengine/wbcamtarget.cpp b/tools/worldbuilder/code/gameengine/wbcamtarget.cpp
new file mode 100644
index 0000000..add8eb4
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/wbcamtarget.cpp
@@ -0,0 +1,296 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: WBCamTarget.cpp
+//
+// Description: Implement WBCamTarget
+//
+// History: 19/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+
+//========================================
+// Project Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+#include "WBCamTarget.h"
+#include "utility/transformmatrix.h"
+#include "main/constants.h"
+
+#include "utility/mext.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+
+void GetMatrix( MObject& obj, tlMatrix& hmatrix )
+{
+ MFnDagNode fnNode( obj );
+
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, fnTransform.name() ) )
+ {
+ TransformMatrix tm( dagPath );
+
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ }
+ else
+ {
+ MExt::DisplayError( "Target matrix is screwy!" );
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// WBCamTarget::WBCamTarget
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+WBCamTarget::WBCamTarget() :
+ mTarget( MObject::kNullObj )
+{
+}
+
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: MObject& target.
+//
+// Return: N/A.
+//
+//==============================================================================
+WBCamTarget::WBCamTarget( MObject& target ) :
+ mTarget( target )
+{
+}
+
+//==============================================================================
+// WBCamTarget::~WBCamTarget
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+WBCamTarget::~WBCamTarget()
+{
+}
+
+//=============================================================================
+// WBCamTarget::GetPosition
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( rmt::Vector* position )
+//
+// Return: void
+//
+//=============================================================================
+void WBCamTarget::GetPosition( rmt::Vector* position )
+{
+ tlMatrix hmatrix;
+ GetMatrix( mTarget, hmatrix );
+
+ tlPoint point = hmatrix.GetRow( 3 );
+
+ *position = point;
+
+ *position /= WBConstants::Scale;
+}
+
+//=============================================================================
+// WBCamTarget::GetHeading
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( rmt::Vector* heading )
+//
+// Return: void
+//
+//=============================================================================
+void WBCamTarget::GetHeading( rmt::Vector* heading )
+{
+ tlMatrix hmatrix;
+ GetMatrix( mTarget, hmatrix );
+
+ tlPoint point = hmatrix.GetRow( 2 );
+
+ *heading = point;
+
+ *heading /= WBConstants::Scale;
+}
+
+//=============================================================================
+// WBCamTarget::GetVUP
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( rmt::Vector* vup )
+//
+// Return: void
+//
+//=============================================================================
+void WBCamTarget::GetVUP( rmt::Vector* vup )
+{
+ tlMatrix hmatrix;
+ GetMatrix( mTarget, hmatrix );
+
+ tlPoint point = hmatrix.GetRow( 1 );
+
+ *vup = point;
+
+ *vup /= WBConstants::Scale;
+}
+
+//=============================================================================
+// WBCamTarget::GetVelocity
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( rmt::Vector* velocity )
+//
+// Return: void
+//
+//=============================================================================
+void WBCamTarget::GetVelocity( rmt::Vector* velocity )
+{
+}
+
+//=============================================================================
+// WBCamTarget::GetID
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: unsigned
+//
+//=============================================================================
+unsigned int WBCamTarget::GetID()
+{
+ return 1;
+}
+
+//=============================================================================
+// WBCamTarget::IsCar
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool WBCamTarget::IsCar()
+{
+ return false;
+}
+
+//=============================================================================
+// WBCamTarget::IsAirborn
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool WBCamTarget::IsAirborn()
+{
+ return false;
+}
+
+//=============================================================================
+// WBCamTarget::IsUnstable
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool WBCamTarget::IsUnstable()
+{
+ return false;
+}
+
+//=============================================================================
+// WBCamTarget::IsQuickTurn
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool WBCamTarget::IsQuickTurn()
+{
+ return false;
+}
+
+//=============================================================================
+// WBCamTarget::GetFirstPersonPosition
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( rmt::Vector* position )
+//
+// Return: void
+//
+//=============================================================================
+void WBCamTarget::GetFirstPersonPosition( rmt::Vector* position )
+{
+ return;
+}
+
+//=============================================================================
+// WBCamTarget::GetName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const
+//
+//=============================================================================
+const char* const WBCamTarget::GetName()
+{
+ MFnDependencyNode fnDepNode( mTarget );
+
+ return fnDepNode.name().asChar();
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/gameengine/wbcamtarget.h b/tools/worldbuilder/code/gameengine/wbcamtarget.h
new file mode 100644
index 0000000..21a629c
--- /dev/null
+++ b/tools/worldbuilder/code/gameengine/wbcamtarget.h
@@ -0,0 +1,90 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: wbcamtarget.h
+//
+// Description: Blahblahblah
+//
+// History: 19/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef WBCAMTARGET_H
+#define WBCAMTARGET_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+#include "..\..\..\game\code\camera\isupercamtarget.h"
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class WBCamTarget : public ISuperCamTarget
+{
+public:
+ WBCamTarget();
+ WBCamTarget( MObject& target );
+ virtual ~WBCamTarget();
+
+ virtual void GetPosition( rmt::Vector* position );
+ virtual void GetHeading( rmt::Vector* heading );
+ virtual void GetVUP( rmt::Vector* vup );
+ virtual void GetVelocity( rmt::Vector* velocity );
+ virtual unsigned int GetID();
+ virtual bool IsCar();
+ virtual bool IsAirborn();
+ virtual bool IsUnstable();
+ virtual bool IsQuickTurn();
+ virtual bool IsInReverse() { return false; };
+ virtual void GetFirstPersonPosition( rmt::Vector* position );
+
+ virtual const char* const GetName();
+
+ void SetTarget( MObject& target );
+ const MObject& GetTarget() const;
+
+private:
+ MObject& mTarget;
+};
+
+//=============================================================================
+// WBCamTarget::SetTarget
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& target )
+//
+// Return: void
+//
+//=============================================================================
+inline void WBCamTarget::SetTarget( MObject& target )
+{
+ mTarget = target;
+}
+
+//=============================================================================
+// WBCamTarget::GetTarget
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MObject
+//
+//=============================================================================
+inline const MObject& WBCamTarget::GetTarget() const
+{
+ return mTarget;
+}
+
+#endif //WBCAMTARGET_H
diff --git a/tools/worldbuilder/code/main/constants.h b/tools/worldbuilder/code/main/constants.h
new file mode 100644
index 0000000..fbdc641
--- /dev/null
+++ b/tools/worldbuilder/code/main/constants.h
@@ -0,0 +1,31 @@
+#ifndef WB_CONSTANTS
+#define WB_CONSTANTS
+
+namespace WBConstants
+{
+ const unsigned int TypeIDPrefix = 0x00040201;
+ const float Scale = 100.0f;
+
+ namespace NodeIDs
+ {
+ const unsigned int EventLocator = 0xd0;
+ const unsigned int ScriptLocator = 0xd1;
+ const unsigned int GenericLocator = 0xd2;
+ const unsigned int CarStartLocator = 0xd3;
+ const unsigned int SplineLocator = 0xd4;
+ const unsigned int ZoneEventLocator = 0xd5;
+ const unsigned int OcclusionLocator = 0xd6;
+ const unsigned int RailCamLocator = 0xd7;
+ const unsigned int InteriorEntranceLocator = 0xd8;
+ const unsigned int DirectionalLocator = 0xd9;
+ const unsigned int ActionEventLocator = 0xda;
+ const unsigned int FOVLocator = 0xdb;
+ const unsigned int BreakableCameraLocator = 0xdc;
+ const unsigned int StaticCameraLocator = 0xdd;
+ const unsigned int PedGroupLocator = 0xde;
+
+ const unsigned int TriggerVolume = 0xe0;
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/tools/worldbuilder/code/main/pluginMain.cpp b/tools/worldbuilder/code/main/pluginMain.cpp
new file mode 100644
index 0000000..220f8e6
--- /dev/null
+++ b/tools/worldbuilder/code/main/pluginMain.cpp
@@ -0,0 +1,193 @@
+//
+// Copyright (C) 2002 Radical Entertainment
+//
+// File: pluginMain.cpp
+//
+// Author: Maya SDK Wizard
+//
+
+#include <maya/MFnPlugin.h>
+
+//This is a warning provided by the STL... It seems that toollib gets whacky when there
+//is other templates made... Sigh...
+#pragma warning(disable:4786)
+
+#include "pluginmain.h"
+#include "worldbuilder.h"
+
+#include "utility/mayahandles.h"
+#include "utility/mext.h"
+
+#include "gameengine/gameengine.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+
+//Nodes
+#include "nodes/eventlocatornode.h"
+#include "nodes/scriptlocatornode.h"
+#include "nodes/genericlocatornode.h"
+#include "nodes/carstartlocatornode.h"
+#include "nodes/splinelocatornode.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/zoneeventlocatornode.h"
+#include "nodes/occlusionlocatornode.h"
+#include "nodes/railcamlocatornode.h"
+#include "nodes/interiorentrancelocatornode.h"
+#include "nodes/directionallocatornode.h"
+#include "nodes/actioneventlocatornode.h"
+#include "nodes/fovlocatornode.h"
+#include "nodes/BreakableCameraLocatorNode.h"
+#include "nodes/staticcameralocatornode.h"
+#include "nodes/pedgrouplocator.h"
+
+
+//Contexts
+#include "contexts/LocatorContext.h"
+#include "contexts/TriggerContext.h"
+
+//Commands
+#include "commands/worldbuildercommands.h"
+#include "commands/export.h"
+
+#include <radtime.hpp>
+#include <radmemory.hpp>
+#include <radthread.hpp>
+
+WorldBuilder* gWB;
+
+MStatus initializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is loaded into Maya. It
+// registers all of the services that this plug-in provides with
+// Maya.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+
+
+ MayaHandles::SetHInstance( (void*)(MhInstPlugin) );
+
+ MFnPlugin plugin( obj, "Radical Entertainment", "4.0.1", "Any", &status );
+ assert( status );
+
+ radTimeInitialize();
+ radMemoryInitialize();
+ radThreadInitialize();
+
+ // Add plug-in feature registration here
+ //
+
+ //This is a test due to changes in the SRR stuff.
+ bool test = LocatorEvent::TestEvents();
+ assert( test );
+
+
+ //Register Nodes
+ REGISTER_LOCATOR( plugin, ScriptLocatorNode );
+ REGISTER_LOCATOR( plugin, GenericLocatorNode );
+ REGISTER_LOCATOR( plugin, CarStartLocatorNode );
+ REGISTER_LOCATOR( plugin, SplineLocatorNode );
+ REGISTER_LOCATOR( plugin, TriggerVolumeNode );
+ REGISTER_LOCATOR( plugin, EventLocatorNode );
+ REGISTER_LOCATOR( plugin, ZoneEventLocatorNode );
+ REGISTER_LOCATOR( plugin, OcclusionLocatorNode );
+ REGISTER_LOCATOR( plugin, RailCamLocatorNode );
+ REGISTER_LOCATOR( plugin, InteriorEntranceLocatorNode );
+ REGISTER_LOCATOR( plugin, DirectionalLocatorNode );
+ REGISTER_LOCATOR( plugin, ActionEventLocatorNode );
+ REGISTER_LOCATOR( plugin, FOVLocatorNode );
+ REGISTER_LOCATOR( plugin, BreakableCameraLocatorNode );
+ REGISTER_LOCATOR( plugin, StaticCameraLocatorNode );
+ REGISTER_LOCATOR( plugin, PedGroupLocatorNode );
+
+ //Register Contexts
+ REGISTER_CONTEXT( plugin, LocatorContext );
+ REGISTER_CONTEXT( plugin, TriggerContext );
+
+ //Register Commands
+ REGISTER_COMMAND( plugin, WBChangeDisplayCommand );
+ REGISTER_COMMAND( plugin, WBSetLocatorTypeCmd );
+ REGISTER_COMMAND( plugin, WBSetPrefixCmd );
+ REGISTER_COMMAND( plugin, WBSnapLocatorCmd );
+ REGISTER_COMMAND( plugin, ExportCommand );
+ REGISTER_COMMAND( plugin, WBSplineCompleteCmd );
+ REGISTER_COMMAND( plugin, WBCoinSplineCompleteCmd );
+ REGISTER_COMMAND( plugin, WBSelectObjectCmd );
+
+ gWB = new WorldBuilder();
+
+ //Run any startup scripts.
+ MGlobal::sourceFile( MString( "wb_main.mel" ) );
+
+ GameEngine::CreateInstance();
+
+ return status;
+}
+
+MStatus uninitializePlugin( MObject obj )
+//
+// Description:
+// this method is called when the plug-in is unloaded from Maya. It
+// deregisters all of the services that it was providing.
+//
+// Arguments:
+// obj - a handle to the plug-in object (use MFnPlugin to access it)
+//
+{
+ MStatus status;
+ MFnPlugin plugin( obj );
+
+ // Add plug-in feature deregistration here
+ //
+
+ //Run any cleanup scripts.
+ MGlobal::sourceFile( MString( "wb_cleanup.mel" ) );
+
+ if ( gWB )
+ {
+ delete gWB;
+ }
+
+ //Deregister Commands
+ DEREGISTER_COMMAND( plugin, WBSelectObjectCmd );
+ DEREGISTER_COMMAND( plugin, WBSplineCompleteCmd );
+ DEREGISTER_COMMAND( plugin, WBCoinSplineCompleteCmd );
+ DEREGISTER_COMMAND( plugin, ExportCommand );
+ DEREGISTER_COMMAND( plugin, WBSnapLocatorCmd );
+ DEREGISTER_COMMAND( plugin, WBSetPrefixCmd );
+ DEREGISTER_COMMAND( plugin, WBChangeDisplayCommand );
+ DEREGISTER_COMMAND( plugin, WBSetLocatorTypeCmd );
+
+ //Deregister Contexts
+ DEREGISTER_CONTEXT( plugin, TriggerContext );
+ DEREGISTER_CONTEXT( plugin, LocatorContext );
+
+ //Deregister Nodes
+ DEREGISTER_NODE( plugin, SplineLocatorNode );
+ DEREGISTER_NODE( plugin, TriggerVolumeNode );
+ DEREGISTER_NODE( plugin, CarStartLocatorNode);
+ DEREGISTER_NODE( plugin, GenericLocatorNode );
+ DEREGISTER_NODE( plugin, ScriptLocatorNode );
+ DEREGISTER_NODE( plugin, EventLocatorNode );
+ DEREGISTER_NODE( plugin, ZoneEventLocatorNode );
+ DEREGISTER_NODE( plugin, OcclusionLocatorNode );
+ DEREGISTER_NODE( plugin, RailCamLocatorNode );
+ DEREGISTER_NODE( plugin, InteriorEntranceLocatorNode );
+ DEREGISTER_NODE( plugin, DirectionalLocatorNode );
+ DEREGISTER_NODE( plugin, ActionEventLocatorNode );
+ DEREGISTER_NODE( plugin, FOVLocatorNode );
+ DEREGISTER_NODE( plugin, BreakableCameraLocatorNode );
+ DEREGISTER_NODE( plugin, StaticCameraLocatorNode );
+ DEREGISTER_NODE( plugin, PedGroupLocatorNode );
+
+ GameEngine::DestroyInstance();
+
+ radTimeTerminate();
+
+ return status;
+}
+ \ No newline at end of file
diff --git a/tools/worldbuilder/code/main/pluginMain.h b/tools/worldbuilder/code/main/pluginMain.h
new file mode 100644
index 0000000..3645a0d
--- /dev/null
+++ b/tools/worldbuilder/code/main/pluginMain.h
@@ -0,0 +1,38 @@
+//----------------------------------------
+// MACROS
+//----------------------------------------
+
+#define REGISTER_COMMAND( p, c ) if ( ! ( ( p ).registerCommand( c##::stringId, \
+ c##::creator ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_CONTEXT( p, c ) if ( ! ( ( p ).registerContextCommand( c##::stringId, \
+ c##Cmd::creator ) \
+ ) \
+ ) return MS::kFailure
+
+
+#define REGISTER_LOCATOR( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize, \
+ MPxNode::kLocatorNode ) \
+ ) \
+ ) return MS::kFailure
+
+#define REGISTER_NODE( p, n ) if ( ! ( ( p ).registerNode( n##::stringId, \
+ n##::id, \
+ n##::creator, \
+ n##::initialize ) \
+ ) \
+ ) return MS::kFailure
+
+#define DEREGISTER_COMMAND( p, c ) ( p ).deregisterCommand( c##::stringId )
+
+#define DEREGISTER_CONTEXT( p, c ) ( p ).deregisterContextCommand( c##::stringId )
+
+//#define DEREGISTER_NODE( p, n ) n##::Unload();\
+// ( p ).deregisterNode( n##::id )
+
+#define DEREGISTER_NODE( p, n ) ( p ).deregisterNode( n##::id )
diff --git a/tools/worldbuilder/code/main/toolhack.h b/tools/worldbuilder/code/main/toolhack.h
new file mode 100644
index 0000000..633195c
--- /dev/null
+++ b/tools/worldbuilder/code/main/toolhack.h
@@ -0,0 +1,8 @@
+#ifndef TOOL_HACK
+#define TOOL_HACK
+
+//FUCKING HACK!
+enum tLoadStatus { LOAD_OK, LOAD_ERROR };
+typedef enum tLoadStatus tlLoadStatus;
+
+#endif \ No newline at end of file
diff --git a/tools/worldbuilder/code/main/worldbuilder.cpp b/tools/worldbuilder/code/main/worldbuilder.cpp
new file mode 100644
index 0000000..8a0d034
--- /dev/null
+++ b/tools/worldbuilder/code/main/worldbuilder.cpp
@@ -0,0 +1,267 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: WorldBuilder.cpp
+//
+// Description: Implement WorldBuilder
+//
+// History: 16/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+// Foundation Tech
+
+//========================================
+// Project Includes
+//========================================
+#include "WorldBuilder.h"
+#include "utility/mext.h"
+
+#include "nodes/eventlocatornode.h"
+#include "nodes/scriptlocatornode.h"
+#include "nodes/genericlocatornode.h"
+#include "nodes/carstartlocatornode.h"
+#include "nodes/splinelocatornode.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/zoneeventlocatornode.h"
+#include "nodes/occlusionlocatornode.h"
+#include "nodes/railcamlocatornode.h"
+#include "nodes/interiorentrancelocatornode.h"
+#include "nodes/directionallocatornode.h"
+#include "nodes/actioneventlocatornode.h"
+#include "nodes/fovlocatornode.h"
+#include "nodes/BreakableCameraLocatorNode.h"
+#include "nodes/staticcameralocatornode.h"
+#include "nodes/pedgrouplocator.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+unsigned int WorldBuilder::sDisplayLevel = ALL;
+LocatorType::Type WorldBuilder::sLocatorType = LocatorType::EVENT;
+
+const char* WorldBuilder::sName = "WORLD_BUILDER_NAME";
+
+char WorldBuilder::sPrefix[MAX_PREFIX_LENGTH + 1];
+char WorldBuilder::sSelectedLocator[MAX_NAME_LENGTH + 1];
+
+//==============================================================================
+// WorldBuilder::WorldBuilder
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+WorldBuilder::WorldBuilder()
+{
+ sPrefix[0] = '\0';
+ sPrefix[MAX_PREFIX_LENGTH] = '\0';
+}
+
+//==============================================================================
+// WorldBuilder::~WorldBuilder
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+WorldBuilder::~WorldBuilder()
+{
+}
+
+//=============================================================================
+// WorldBuilder::Exists
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: bool
+//
+//=============================================================================
+bool WorldBuilder::Exists()
+{
+ MDagPath pathToWorldBuilder;
+ return MExt::FindDagNodeByName( &pathToWorldBuilder, MString( WorldBuilder::sName ) );
+}
+
+//=============================================================================
+// WorldBuilder::AddChild
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& obj )
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus WorldBuilder::AddChild( MObject& obj )
+{
+ //Make sure this exists.
+ CreateWorldBuilderNode();
+
+ MDagPath pathToWorldBuilder;
+
+ bool good = false;
+
+ if ( MExt::FindDagNodeByName( &pathToWorldBuilder, MString( WorldBuilder::sName ) ) )
+ {
+ good = true;
+ }
+
+ if ( good )
+ {
+ MFnDagNode fnDagNodeWB;
+
+ //Which type?
+ MFnDagNode fnDagNodeObj( obj );
+
+ if ( fnDagNodeObj.typeId() == EventLocatorNode::id ||
+ fnDagNodeObj.typeId() == ScriptLocatorNode::id ||
+ fnDagNodeObj.typeId() == CarStartLocatorNode::id ||
+ fnDagNodeObj.typeId() == SplineLocatorNode::id ||
+ fnDagNodeObj.typeId() == ZoneEventLocatorNode::id ||
+ fnDagNodeObj.typeId() == GenericLocatorNode::id ||
+ fnDagNodeObj.typeId() == RailCamLocatorNode::id ||
+ fnDagNodeObj.typeId() == ActionEventLocatorNode::id ||
+ fnDagNodeObj.typeId() == DirectionalLocatorNode::id ||
+ fnDagNodeObj.typeId() == InteriorEntranceLocatorNode::id ||
+ fnDagNodeObj.typeId() == FOVLocatorNode::id ||
+ fnDagNodeObj.typeId() == BreakableCameraLocatorNode::id ||
+ fnDagNodeObj.typeId() == StaticCameraLocatorNode::id ||
+ fnDagNodeObj.typeId() == OcclusionLocatorNode::id ||
+ fnDagNodeObj.typeId() == PedGroupLocatorNode::id )
+ {
+ //This is a locator, parent to the "Locator" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString(LOCATORS_NAME), pathToWorldBuilder.node() ) )
+ {
+ fnDagNodeWB.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted World Builder nodes!!" );
+ }
+ }
+ else if ( fnDagNodeObj.typeId() == TriggerVolumeNode::id )
+ {
+ //This is a locator, parent to the "TriggerVolumes" node.
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString(TRIGGER_VOLUMES_NAME), pathToWorldBuilder.node() ) )
+ {
+ fnDagNodeWB.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted World Builder nodes!!" );
+ }
+ }
+ else
+ {
+ MStatus status;
+ MFnNurbsCurve fnNurbs( obj, &status );
+ if ( status )
+ {
+ MDagPath dagPath;
+ if ( MExt::FindDagNodeByName( &dagPath, MString(SPLINES_NAME), pathToWorldBuilder.node() ) )
+ {
+ fnDagNodeWB.setObject( dagPath.node() );
+ }
+ else
+ {
+ MExt::DisplayError( "Someone has deleted World Builder nodes!!" );
+ }
+ }
+ else
+ {
+ fnDagNodeWB.setObject( pathToWorldBuilder.node() );
+ }
+ }
+
+ MObject objT = fnDagNodeObj.parent( 0 );
+
+ return fnDagNodeWB.addChild( objT );
+ }
+
+ return MS::kFailure;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// WorldBuilder::CreateWorldBuilderNode
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void WorldBuilder::CreateWorldBuilderNode()
+{
+ MStatus status;
+
+ MFnTransform transform;
+ MObject wb, loc, tv, sp;
+
+ MDagPath pathToWorldBuilder, testPath;
+
+ if ( !MExt::FindDagNodeByName( &pathToWorldBuilder, MString( WorldBuilder::sName ) ) )
+ {
+ //Create the worldbuilder transform.
+ wb = transform.create( MObject::kNullObj, &status );
+ assert( status );
+ transform.setName( MString( WorldBuilder::sName ) );
+ }
+ else
+ {
+ wb = pathToWorldBuilder.node();
+ }
+
+ if ( !MExt::FindDagNodeByName( &pathToWorldBuilder, MString( LOCATORS_NAME ) ) )
+ {
+ loc = transform.create( wb, &status );
+ assert( status );
+ transform.setName( MString( LOCATORS_NAME ) );
+ }
+
+ if ( !MExt::FindDagNodeByName( &pathToWorldBuilder, MString( TRIGGER_VOLUMES_NAME ) ) )
+ {
+ tv = transform.create( wb, &status );
+ assert( status );
+ transform.setName( MString( TRIGGER_VOLUMES_NAME ) );
+ }
+
+ if ( !MExt::FindDagNodeByName( &pathToWorldBuilder, MString( SPLINES_NAME ) ) )
+ {
+ sp = transform.create( wb, &status );
+ assert( status );
+ transform.setName( MString( SPLINES_NAME ) );
+ }
+
+ MGlobal::executeCommand( "wb_Create_WorldBuilderNode()" );
+} \ No newline at end of file
diff --git a/tools/worldbuilder/code/main/worldbuilder.h b/tools/worldbuilder/code/main/worldbuilder.h
new file mode 100644
index 0000000..846247a
--- /dev/null
+++ b/tools/worldbuilder/code/main/worldbuilder.h
@@ -0,0 +1,260 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: worldbuilder.h
+//
+// Description: Blahblahblah
+//
+// History: 16/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef WORLDBUILDER_H
+#define WORLDBUILDER_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+#include <assert.h>
+
+#include <..\..\..\game\code\meta\locatortypes.h>
+
+//========================================
+// Forward References
+//========================================
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+const char* const WORLD_BUILDER_NAME = "WBWorldBuilder";
+const char* const LOCATORS_NAME = "WBLocators";
+const char* const TRIGGER_VOLUMES_NAME = "WBTriggerVolumes";
+const char* const SPLINES_NAME = "WBSplines";
+
+class WorldBuilder
+{
+public:
+
+ enum { MAX_PREFIX_LENGTH = 24, MAX_NAME_LENGTH = 256 };
+
+ enum DisplayLevel
+ {
+ EVENT_LOCATORS = ( 1 << 0 ),
+ SCRIPT_LOCATORS = ( 1 << 1 ),
+ GENERIC_LOCATORS = ( 1 << 2 ),
+ CARSTART_LOCATORS = ( 1 << 3 ),
+ ZONE_EVENT_LOCATORS = ( 1 << 4 ),
+ OCCLUSION_LOCATORS = ( 1 << 5 ),
+ RAILCAM_LOCATORS = ( 1 << 6 ),
+ INTERIOR_LOCATORS = ( 1 << 7 ),
+ DIRECTIONAL_LOCATORS = ( 1 << 8 ),
+ ACTION_EVENT_LOCATORS = ( 1 << 9 ),
+ FOV_LOCATORS = ( 1 << 10 ),
+ BREAKABLE_CAMERA_LOCATORS = ( 1 << 11 ),
+ STATIC_CAMERA_LOCATORS = ( 1 << 12 ),
+ PED_GROUP_LOCATORS = ( 1 << 13 ),
+
+
+ LOCATORS = EVENT_LOCATORS | SCRIPT_LOCATORS |
+ GENERIC_LOCATORS | ZONE_EVENT_LOCATORS |
+ OCCLUSION_LOCATORS | RAILCAM_LOCATORS |
+ INTERIOR_LOCATORS | DIRECTIONAL_LOCATORS |
+ ACTION_EVENT_LOCATORS | FOV_LOCATORS |
+ BREAKABLE_CAMERA_LOCATORS | STATIC_CAMERA_LOCATORS |
+ PED_GROUP_LOCATORS,
+
+ TRIGGER_VOLUMES = ( 1 << 20 ),
+
+ ALL = ~0,
+
+ TOTAL_LEVELS = 6
+ };
+
+ WorldBuilder();
+ virtual ~WorldBuilder();
+
+ static unsigned int GetDisplayLevel();
+ static LocatorType::Type GetLocatorType();
+
+ static void SetPrefix( const char* prefix );
+ static const char* const GetPrefix();
+
+ static bool Exists();
+ static MStatus AddChild( MObject& obj );
+
+ static void SetSelectedLocator( const char* name );
+ static const char* GetSelectedLocator();
+
+ static const char* sName;
+
+protected:
+
+ friend class WBChangeDisplayCommand;
+ static unsigned int sDisplayLevel;
+
+ friend class WBSetLocatorTypeCmd;
+ static LocatorType::Type sLocatorType;
+
+ static char sPrefix[MAX_PREFIX_LENGTH + 1]; //+ 1 for the \n
+ static char sSelectedLocator[MAX_NAME_LENGTH + 1];
+
+ static void SetDisplayLevel( unsigned int level, bool on );
+ static void SetLocatorType( LocatorType::Type type );
+
+private:
+
+ static void CreateWorldBuilderNode();
+
+ //Prevent wasteful constructor creation.
+ WorldBuilder( const WorldBuilder& worldbuilder );
+ WorldBuilder& operator=( const WorldBuilder& worldbuilder );
+};
+
+//*****************************************************************************
+//
+// Inline Public Methods
+//
+//*****************************************************************************
+
+//=============================================================================
+// WorldBuilder::GetDisplayLevel
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: DisplayLevel
+//
+//=============================================================================
+inline unsigned int WorldBuilder::GetDisplayLevel()
+{
+ return sDisplayLevel;
+}
+
+//=============================================================================
+// WorldBuilder::GetLocatorType
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: LocatorType
+//
+//=============================================================================
+inline LocatorType::Type WorldBuilder::GetLocatorType()
+{
+ return sLocatorType;
+}
+
+//=============================================================================
+// WorldBuilder::SetLocatorType
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( LocatorType::Type type )
+//
+// Return: void
+//
+//=============================================================================
+inline void WorldBuilder::SetLocatorType( LocatorType::Type type )
+{
+ sLocatorType = type;
+}
+
+//=============================================================================
+// WorldBuilder::GetPrefix
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const WorldBuilder::GetPrefix()
+{
+ return sPrefix;
+}
+
+//=============================================================================
+// WorldBuilder::SetPrefix
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* prefix )
+//
+// Return: void
+//
+//=============================================================================
+inline void WorldBuilder::SetPrefix( const char* prefix )
+{
+ strcpy( sPrefix, prefix );
+ sPrefix[MAX_PREFIX_LENGTH] = '\0';
+}
+
+//=============================================================================
+// WorldBuilder::SetSelectedLocator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void WorldBuilder::SetSelectedLocator( const char* name )
+{
+ strcpy( sSelectedLocator, name );
+ sSelectedLocator[MAX_NAME_LENGTH] = '\0';
+}
+
+//=============================================================================
+// WorldBuilder::GetSelectedLocator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const
+//
+//=============================================================================
+inline const char* WorldBuilder::GetSelectedLocator()
+{
+ return sSelectedLocator;
+}
+
+//*****************************************************************************
+//
+// Inline Protected Methods
+//
+//*****************************************************************************
+
+//=============================================================================
+// WorldBuilder::SetDisplayLevel
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( unsigned int level, bool on )
+//
+// Return: inline
+//
+//=============================================================================
+inline void WorldBuilder::SetDisplayLevel( unsigned int level, bool on )
+{
+ assert( level <= TOTAL_LEVELS );
+
+ on ? sDisplayLevel |= ( 1 << level ) : sDisplayLevel &= ~( 1 << level );
+}
+
+//*****************************************************************************
+//
+// Inline Private Methods
+//
+//*****************************************************************************
+
+#endif //WORLDBUILDER_H
diff --git a/tools/worldbuilder/code/nodes/actioneventlocatornode.cpp b/tools/worldbuilder/code/nodes/actioneventlocatornode.cpp
new file mode 100644
index 0000000..5d6b577
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/actioneventlocatornode.cpp
@@ -0,0 +1,651 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: ActionEventLocatorNode.cpp
+//
+// Description: Implement ActionEventLocatorNode
+//
+// History: 30/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include <afxwin.h>
+
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/ActionEventLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "utility/transformmatrix.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+#include "../../../game/code/ai/actionnames.h"
+#include "../../../game/code/worldsim/character/charactercontroller.h"
+
+int SortFunc( const void* pName1, const void* pName2 )
+{
+ return stricmp( *(char**)pName1, *(char**)pName2 );
+}
+
+void UpdateJoints( HWND hWnd, MObject& root )
+{
+ CWnd* wnd = CWnd::FromHandle( GetDlgItem( hWnd, IDC_COMBO2 ) );
+ CComboBox* jointList = (CComboBox*)( wnd );
+
+ assert( jointList );
+
+ jointList->ResetContent();
+
+ MObjectArray jointArray;
+ if ( MExt::FindAllTransforms( &jointArray, root ) )
+ {
+ unsigned int i;
+ for ( i = 0; i < jointArray.length(); ++i )
+ {
+ MFnDependencyNode fnNode( jointArray[i] );
+
+ jointList->AddString( fnNode.name().asChar() );
+ }
+ }
+ else
+ {
+ jointList->AddString( "NO JOINTS!" );
+ }
+
+ jointList->SetCurSel( 0 );
+}
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId ActionEventLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::ActionEventLocator );
+const char* ActionEventLocatorNode::stringId = "ActionEventLocatorNode";
+
+const int ActionEventLocatorNode::ACTIVE_COLOUR = 15;
+const int ActionEventLocatorNode::INACTIVE_COLOUR = 12;
+const float ActionEventLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* ActionEventLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* ActionEventLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject ActionEventLocatorNode::sTriggers;
+
+const char* ActionEventLocatorNode::OBJECT_NAME_SHORT = "acnobjt";
+const char* ActionEventLocatorNode::OBJECT_NAME_LONG = "actionObject";
+MObject ActionEventLocatorNode::sObject;
+
+const char* ActionEventLocatorNode::JOINT_NAME_SHORT = "jnt";
+const char* ActionEventLocatorNode::JOINT_NAME_LONG = "joint";
+MObject ActionEventLocatorNode::sJoint;
+
+const char* ActionEventLocatorNode::ACTION_NAME_SHORT = "actn";
+const char* ActionEventLocatorNode::ACTION_NAME_LONG = "action";
+MObject ActionEventLocatorNode::sActionType;
+
+const char* ActionEventLocatorNode::BUTTON_NAME_SHORT = "btninpt";
+const char* ActionEventLocatorNode::BUTTON_NAME_LONG = "buttonInput";
+MObject ActionEventLocatorNode::sButtonInput;
+
+const char* ActionEventLocatorNode::TRANSFORM_NAME_SHORT = "st";
+const char* ActionEventLocatorNode::TRANSFORM_NAME_LONG = "shouldTransform";
+MObject ActionEventLocatorNode::sTransform;
+
+const char* ActionEventLocatorNode::EXPORT_TRANSFORM_NAME_SHORT = "exptTrans";
+const char* ActionEventLocatorNode::EXPORT_TRANSFORM_NAME_LONG = "exportTransform";
+MObject ActionEventLocatorNode::sExportTransform;
+
+char ActionEventLocatorNode::sNewName[MAX_NAME_LEN];
+char ActionEventLocatorNode::sNewObj[MAX_NAME_LEN];
+char ActionEventLocatorNode::sNewJoint[MAX_NAME_LEN];
+
+const char* ActionEventLocatorNode::names[ActionButton::ActionNameSize];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK ActionEventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ SetDlgItemText( hWnd, IDC_EDIT3, "" );
+
+ CWnd* wnd = CWnd::FromHandle( GetDlgItem( hWnd, IDC_COMBO1 ) );
+ CComboBox* objectList = (CComboBox*)( wnd );
+
+ assert( objectList );
+
+ objectList->ResetContent();
+
+ bool foundSkeletonRoots = false;
+ MObjectArray skeletonRoots;
+
+ if ( MExt::FindAllSkeletonRoots( &skeletonRoots ) )
+ {
+ //Fill up with all the roots.
+ unsigned int i;
+ for ( i = 0; i < skeletonRoots.length(); ++i )
+ {
+ MFnDependencyNode fnNode( skeletonRoots[i] );
+
+ objectList->AddString( fnNode.name().asChar() );
+ }
+
+ foundSkeletonRoots = true;
+ }
+ else
+ {
+ objectList->AddString( "NO SKELETON ROOTS!" );
+ }
+
+ objectList->SetCurSel( 0 );
+
+ char objName[256];
+ GetDlgItemText( hWnd, IDC_COMBO1, objName, 256 );
+
+ MDagPath path;
+ MExt::FindDagNodeByName( &path, MString( objName ) );
+
+ UpdateJoints( hWnd, path.node() );
+
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[ActionEventLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, ActionEventLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Action Event Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ ActionEventLocatorNode::SetNewName( newName.asChar() );
+
+ //Do the Object name too...
+ GetDlgItemText( hWnd, IDC_COMBO1, name, ActionEventLocatorNode::MAX_NAME_LEN );
+
+ MString possibleName( name );
+ MString corrected = possibleName;
+ int index = possibleName.index( ':' );
+ if ( index != -1 )
+ {
+ corrected = possibleName.substring( index + 1, possibleName.length() - 1 );
+ }
+ else
+
+ if ( strcmp(corrected.asChar(), "") == 0 )
+ {
+ MExt::DisplayWarning("You must input an object name!");
+ return false;
+ }
+
+ ActionEventLocatorNode::SetNewObj( corrected.asChar() );
+
+ //Do the Object name too...
+ GetDlgItemText( hWnd, IDC_COMBO2, name, ActionEventLocatorNode::MAX_NAME_LEN );
+
+ possibleName = MString( name );
+ corrected = possibleName;
+ index = possibleName.index( ':' );
+ if ( index != -1 )
+ {
+ corrected = possibleName.substring( index + 1, possibleName.length() - 1 );
+ }
+
+ if ( strcmp(corrected.asChar(), "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a joint name!");
+ return false;
+ }
+
+ ActionEventLocatorNode::SetNewJoint( corrected.asChar() );
+
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ ActionEventLocatorNode::SetNewName( "" );
+ ActionEventLocatorNode::SetNewObj( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if ( LOWORD(wParam) == IDC_COMBO1 )
+ {
+ DWORD hiWord = HIWORD(wParam);
+
+ if ( hiWord == CBN_SELCHANGE )
+ {
+ char objName[256];
+ GetDlgItemText( hWnd, IDC_COMBO1, objName, 256 );
+
+ MDagPath path;
+ MExt::FindDagNodeByName( &path, MString( objName ) );
+
+ UpdateJoints( hWnd, path.node() );
+ }
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// ActionEventLocatorNode::ActionEventLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ActionEventLocatorNode::ActionEventLocatorNode()
+{
+ unsigned int i;
+ for ( i = 0; i < MAX_NAME_LEN; ++i )
+ {
+ sNewJoint[i] = '\0';
+ }
+}
+
+//==============================================================================
+// ActionEventLocatorNode::~ActionEventLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ActionEventLocatorNode::~ActionEventLocatorNode()
+{
+}
+
+//=============================================================================
+// ActionEventLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* ActionEventLocatorNode::creator()
+{
+ return new ActionEventLocatorNode();
+}
+
+//=============================================================================
+// ActionEventLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void ActionEventLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::ACTION_EVENT_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MPoint triggerWP, thisWP;
+
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ //MExt::GetWorldPosition( &thisWP, thisMObject() );
+ MMatrix mat = MExt::GetWorldMatrix( thisMObject() );
+ MMatrix invMat = mat.inverse();
+
+ MPoint triggerLP;
+ //triggerLP = triggerWP - thisWP;
+ triggerLP = triggerWP * invMat;
+
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawA( SCALE, 0,1,0, 5.0 );
+ GLExt::drawArrow( MPoint( 0, 0, 0 ), MPoint( 0, 0, -1 * WBConstants::Scale ), 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// ActionEventLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus ActionEventLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnTypedAttribute typedAttr;
+ sObject = typedAttr.create( OBJECT_NAME_LONG, OBJECT_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sObject ) );
+
+ sJoint = typedAttr.create( JOINT_NAME_LONG, JOINT_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sJoint ) );
+
+ MFnEnumAttribute enumAttr;
+ sActionType = enumAttr.create( ACTION_NAME_LONG, ACTION_NAME_SHORT, 0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
+
+ unsigned int i;
+ for ( i = 0; i < ActionButton::ActionNameSize; ++i )
+ {
+ names[i] = ActionButton::ActionName[i];
+ }
+
+ // Sorting seems to make a mess of things.
+ // commenting out for now.
+ // TBJ [8/9/2002]
+ //
+ //qsort( names, ActionButton::ActionNameSize, sizeof( char* ), SortFunc );
+
+ for ( i = 0; i < ActionButton::ActionNameSize; ++i )
+ {
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( names[i] ), i ) );
+ }
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sActionType ) );
+
+ sButtonInput = enumAttr.create( BUTTON_NAME_LONG, BUTTON_NAME_SHORT, CharacterController::DoAction, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
+ for ( i = 0; i < ActionButton::ButtonNameListSize; ++i )
+ {
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( ActionButton::ButtonName[i] ), i ) );
+ }
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sButtonInput ) );
+
+ MFnNumericAttribute numericAttr;
+ sTransform = numericAttr.create( TRANSFORM_NAME_LONG, TRANSFORM_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTransform ) );
+
+ sExportTransform = numericAttr.create( EXPORT_TRANSFORM_NAME_LONG, EXPORT_TRANSFORM_NAME_SHORT, MFnNumericData::kBoolean, true, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sExportTransform ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// ActionEventLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void ActionEventLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// ActionEventLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& actionEventLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* ActionEventLocatorNode::Export( MObject& actionEventLocatorNode )
+{
+ MFnDagNode fnNode( actionEventLocatorNode );
+
+ if ( fnNode.typeId() == ActionEventLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::ACTION );
+
+ MString objName;
+ MString jointName;
+ int actionInt;
+ MString actionName;
+ int button;
+ bool shouldTransform;
+
+ //Get the data
+ fnNode.findPlug( ActionEventLocatorNode::sObject ).getValue( objName );
+ if ( objName.length() == 0 )
+ {
+ objName.set( "<null>" );
+ }
+
+ fnNode.findPlug( ActionEventLocatorNode::sJoint ).getValue( jointName );
+ if ( jointName.length() == 0 )
+ {
+ jointName.set( "<null>" );
+ }
+ fnNode.findPlug( ActionEventLocatorNode::sActionType ).getValue( actionInt );
+
+ actionName = MString( names[actionInt] );
+
+ fnNode.findPlug( ActionEventLocatorNode::sButtonInput ).getValue( button );
+ fnNode.findPlug( ActionEventLocatorNode::sTransform ).getValue( shouldTransform );
+
+ //Save it out.
+ unsigned int length = (objName.length() / 4 + 1) +
+ (jointName.length() / 4 + 1) +
+ (actionName.length() / 4 + 1) +
+ 2; //button and shouldTransform
+
+ unsigned long* data = new unsigned long[length];
+
+ unsigned int i;
+ for ( i = 0; i < length; ++i )
+ {
+ data[i] = 0;
+ }
+
+ unsigned int next = 0;
+ memcpy( data, objName.asChar(), objName.length() );
+ next = objName.length() / 4 + 1;
+
+ memcpy( &data[next], jointName.asChar(), jointName.length() );
+ next += jointName.length() / 4 + 1;
+
+ memcpy( &data[next], actionName.asChar(), actionName.length() );
+ next += actionName.length() / 4 + 1;
+
+ memcpy( &data[next], &button, sizeof(int) );
+ next++;
+
+ memcpy( &data[next], &shouldTransform, sizeof(bool) );
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ delete data;
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, actionEventLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ //Add the matrix if we're supposed to.
+ bool exportTrans = false;
+ fnNode.findPlug( sExportTransform ).getValue( exportTrans );
+ if ( exportTrans )
+ {
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+ tlExtraMatrixChunk* emChunk = new tlExtraMatrixChunk();
+ emChunk->SetMatrix( hmatrix );
+
+ locator->AppendSubChunk( emChunk );
+ }
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/actioneventlocatornode.h b/tools/worldbuilder/code/nodes/actioneventlocatornode.h
new file mode 100644
index 0000000..0019a9b
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/actioneventlocatornode.h
@@ -0,0 +1,205 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: actioneventlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef ACTIONEVENTLOCATORNODE_H
+#define ACTIONEVENTLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+#include "../../../game/code/ai/actionnames.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK ActionEventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class ActionEventLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ ActionEventLocatorNode();
+ virtual ~ActionEventLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+ static void SetNewObj( const char* name );
+ static const char* const GetNewObj();
+ static void SetNewJoint( const char* name );
+ static const char* const GetNewJoint();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* OBJECT_NAME_SHORT;
+ static const char* OBJECT_NAME_LONG;
+ static MObject sObject;
+
+ static const char* JOINT_NAME_SHORT;
+ static const char* JOINT_NAME_LONG;
+ static MObject sJoint;
+
+ static const char* ACTION_NAME_SHORT;
+ static const char* ACTION_NAME_LONG;
+ static MObject sActionType;
+
+ static const char* BUTTON_NAME_SHORT;
+ static const char* BUTTON_NAME_LONG;
+ static MObject sButtonInput;
+
+ static const char* TRANSFORM_NAME_SHORT;
+ static const char* TRANSFORM_NAME_LONG;
+ static MObject sTransform;
+
+ static const char* EXPORT_TRANSFORM_NAME_SHORT;
+ static const char* EXPORT_TRANSFORM_NAME_LONG;
+ static MObject sExportTransform;
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+ static char sNewObj[MAX_NAME_LEN];
+ static char sNewJoint[MAX_NAME_LEN];
+
+ //We want the names in alphapetical order.
+ static const char* names[ActionButton::ActionNameSize];
+
+ //Prevent wasteful constructor creation.
+ ActionEventLocatorNode( const ActionEventLocatorNode& actioneventlocatornode );
+ ActionEventLocatorNode& operator=( const ActionEventLocatorNode& actioneventlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// ActionEventLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ActionEventLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ActionEventLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ActionEventLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// ActionEventLocatorNode::SetNewObj
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ActionEventLocatorNode::SetNewObj( const char* name )
+{
+ strncpy( sNewObj, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ActionEventLocatorNode::GetNewObj
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ActionEventLocatorNode::GetNewObj()
+{
+ return sNewObj;
+}
+
+//=============================================================================
+// ActionEventLocatorNode::SetNewJoint
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ActionEventLocatorNode::SetNewJoint( const char* name )
+{
+ strncpy( sNewJoint, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ActionEventLocatorNode::GetNewJoint
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ActionEventLocatorNode::GetNewJoint()
+{
+ return sNewJoint;
+}
+
+#endif //ACTIONEVENTLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/breakablecameralocatornode.cpp b/tools/worldbuilder/code/nodes/breakablecameralocatornode.cpp
new file mode 100644
index 0000000..0b0cd5c
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/breakablecameralocatornode.cpp
@@ -0,0 +1,327 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: BreakableCameraLocatorNode.cpp
+//
+// Description: Implement BreakableCameraLocatorNode
+//
+// History: 9/17/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+// Foundation Tech
+#include <raddebug.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "BreakableCameraLocatorNode.h"
+
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "utility/transformmatrix.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId BreakableCameraLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::BreakableCameraLocator );
+const char* BreakableCameraLocatorNode::stringId = "BreakableCameraLocatorNode";
+
+const int BreakableCameraLocatorNode::ACTIVE_COLOUR = 15;
+const int BreakableCameraLocatorNode::INACTIVE_COLOUR = 12;
+const float BreakableCameraLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char BreakableCameraLocatorNode::sNewName[MAX_NAME_LEN];
+
+const char* BreakableCameraLocatorNode::FOV_NAME_SHORT = "fov";
+const char* BreakableCameraLocatorNode::FOV_NAME_LONG = "fieldOfView";
+MObject BreakableCameraLocatorNode::sFOV;
+
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK BreakableCameraLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[BreakableCameraLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, BreakableCameraLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Breakable Camera Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ BreakableCameraLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ BreakableCameraLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// BreakableCameraLocatorNode::BreakableCameraLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+BreakableCameraLocatorNode::BreakableCameraLocatorNode()
+{
+}
+
+//==============================================================================
+// BreakableCameraLocatorNode::~BreakableCameraLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+BreakableCameraLocatorNode::~BreakableCameraLocatorNode()
+{
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* BreakableCameraLocatorNode::creator()
+{
+ return new BreakableCameraLocatorNode();
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void BreakableCameraLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::DIRECTIONAL_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE * 0.15f, 0,0,0, 5.0f );
+ GLExt::drawCamera3D( SCALE * 0.3f, 0,0.5f,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus BreakableCameraLocatorNode::initialize()
+{
+ MStatus status;
+ MFnNumericAttribute numAttr;
+ sFOV = numAttr.create( FOV_NAME_LONG, FOV_NAME_SHORT, MFnNumericData::kFloat, 90.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.1f) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(180.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFOV ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void BreakableCameraLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& breakableCameraLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* BreakableCameraLocatorNode::Export( MObject& breakableCameraLocatorNode )
+{
+ MFnDagNode fnNode( breakableCameraLocatorNode );
+
+ if ( fnNode.typeId() == BreakableCameraLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::BREAKABLE_CAMERA );
+
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+ unsigned int length = (3 * 3) + 1; //3 vectors + 1 float
+
+ unsigned long* data;
+
+ data = new unsigned long[ length ];
+
+ unsigned int row;
+ for ( row = 0; row < 3; ++row )
+ {
+ tlPoint point = hmatrix.GetRow( row );
+
+ memcpy( &data[row * 3], &point.x, sizeof(float) * 3 );
+ }
+
+ float fov = 90.0f;
+ fnNode.findPlug( sFOV ).getValue( fov );
+ memcpy( &data[row * 3], &fov, sizeof(float) );
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, breakableCameraLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ return locator;
+ }
+
+ return NULL;
+}
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/breakablecameralocatornode.h b/tools/worldbuilder/code/nodes/breakablecameralocatornode.h
new file mode 100644
index 0000000..84a4cea
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/breakablecameralocatornode.h
@@ -0,0 +1,113 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: breakablecameralocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 9/17/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef BREAKABLECAMERALOCATORNODE_H
+#define BREAKABLECAMERALOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK BreakableCameraLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class BreakableCameraLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ BreakableCameraLocatorNode();
+ virtual ~BreakableCameraLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& interiorEntranceLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* FOV_NAME_SHORT;
+ static const char* FOV_NAME_LONG;
+ static MObject sFOV;
+
+private:
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ BreakableCameraLocatorNode( const BreakableCameraLocatorNode& breakablecameralocatornode );
+ BreakableCameraLocatorNode& operator=( const BreakableCameraLocatorNode& breakablecameralocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// BreakableCameraLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void BreakableCameraLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// BreakableCameraLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const BreakableCameraLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+
+#endif //BREAKABLECAMERALOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/carstartlocatornode.cpp b/tools/worldbuilder/code/nodes/carstartlocatornode.cpp
new file mode 100644
index 0000000..2b7dfff
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/carstartlocatornode.cpp
@@ -0,0 +1,347 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: CarStartLocatorNode.cpp
+//
+// Description: Implement CarStartLocatorNode
+//
+// History: 28/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/CarStartLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+#include "../../../game/code/meta/locatortypes.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId CarStartLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::CarStartLocator );
+const char* CarStartLocatorNode::stringId = "CarStartLocatorNode";
+
+const int CarStartLocatorNode::ACTIVE_COLOUR = 15;
+const int CarStartLocatorNode::INACTIVE_COLOUR = 12;
+const float CarStartLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char CarStartLocatorNode::sNewName[MAX_NAME_LEN];
+
+const char* CarStartLocatorNode::ISPARKED_NAME_SHORT = "ip";
+const char* CarStartLocatorNode::ISPARKED_NAME_LONG = "isParked";
+MObject CarStartLocatorNode::sIsParked;
+
+const char* CarStartLocatorNode::SPECIAL_NAME_SHORT = "spc";
+const char* CarStartLocatorNode::SPECIAL_NAME_LONG = "specialName";
+MObject CarStartLocatorNode::sSpecialCarName;
+
+
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK CarStartLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[CarStartLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, CarStartLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Car Start Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ CarStartLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ CarStartLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// CarStartLocatorNode::CarStartLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+CarStartLocatorNode::CarStartLocatorNode()
+{
+}
+
+//==============================================================================
+// CarStartLocatorNode::~CarStartLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+CarStartLocatorNode::~CarStartLocatorNode()
+{
+}
+
+//=============================================================================
+// CarStartLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* CarStartLocatorNode::creator()
+{
+ return new CarStartLocatorNode();
+}
+
+//=============================================================================
+// CarStartLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void CarStartLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::CARSTART_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawCar( SCALE, 0,1,0, 5.0 );
+ GLExt::drawArrow( MPoint( 0, 0, 0 ), MPoint( 0, 0, 1 * WBConstants::Scale ), 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// CarStartLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus CarStartLocatorNode::initialize()
+{
+ MStatus status;
+
+ MFnNumericAttribute numericAttr;
+ sIsParked = numericAttr.create( ISPARKED_NAME_LONG, ISPARKED_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sIsParked ) );
+
+ MFnTypedAttribute typedAttr;
+ sSpecialCarName = typedAttr.create( SPECIAL_NAME_LONG, SPECIAL_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sSpecialCarName ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// CarStartLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void CarStartLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// CarStartLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& CarStartLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* CarStartLocatorNode::Export( MObject& carStartLocatorNode )
+{
+ MFnDagNode fnNode( carStartLocatorNode );
+
+ if ( fnNode.typeId() == CarStartLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::CAR_START );
+
+ unsigned int numDataElements = 2;
+
+ MString specialName;
+ fnNode.findPlug( sSpecialCarName ).getValue( specialName );
+ if ( specialName.length() > 0 )
+ {
+ //Add the length of the string + 1 to the num of
+ //elements.
+ numDataElements += specialName.length() / 4 + 1;
+ }
+
+ unsigned long* data = new unsigned long[numDataElements]; //1 (rotation) + 1 (isParked) + special name len + 1
+ memset( data, 0, numDataElements * 4 );
+
+ //The data here is the Y rotation associated with this locator.
+ double rotationDouble;
+ MObject transform = fnNode.parent( 0 );
+ MFnDependencyNode fnDepNode( transform );
+ fnDepNode.findPlug( MString("ry") ).getValue( rotationDouble );
+
+ //This is for p3d!
+ rotationDouble *= -1;
+
+ float rotationFloat = (float)rotationDouble;
+
+ memcpy( &data[0], &rotationFloat, sizeof(float) );
+
+
+ //Do the is Parked Car
+ bool isParked = false;
+ fnNode.findPlug( sIsParked ).getValue( isParked );
+ data[1] = isParked ? 1 : 0;
+
+ if ( specialName.length() > 0 )
+ {
+ //Add the name
+ memcpy( &data[2], specialName.asChar(), specialName.length() );
+ }
+
+ locator->SetDataElements( data, numDataElements );
+ locator->SetNumDataElements( numDataElements );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, carStartLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/carstartlocatornode.h b/tools/worldbuilder/code/nodes/carstartlocatornode.h
new file mode 100644
index 0000000..6ffa52c
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/carstartlocatornode.h
@@ -0,0 +1,117 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: carstartlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 28/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef CARSTARTLOCATORNODE_H
+#define CARSTARTLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK CarStartLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+
+class CarStartLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ CarStartLocatorNode();
+ virtual ~CarStartLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* ISPARKED_NAME_SHORT;
+ static const char* ISPARKED_NAME_LONG;
+ static MObject sIsParked;
+
+ static const char* SPECIAL_NAME_SHORT;
+ static const char* SPECIAL_NAME_LONG;
+ static MObject sSpecialCarName;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ CarStartLocatorNode( const CarStartLocatorNode& carstartlocatornode );
+ CarStartLocatorNode& operator=( const CarStartLocatorNode& carstartlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// CarStartLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void CarStartLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// CarStartLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const CarStartLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //CARSTARTLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/directionallocatornode.cpp b/tools/worldbuilder/code/nodes/directionallocatornode.cpp
new file mode 100644
index 0000000..483df4b
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/directionallocatornode.cpp
@@ -0,0 +1,312 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: DirectionalLocatorNode.cpp
+//
+// Description: Implement DirectionalLocatorNode
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/DirectionalLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "utility/transformmatrix.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId DirectionalLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::DirectionalLocator );
+const char* DirectionalLocatorNode::stringId = "DirectionalLocatorNode";
+
+const int DirectionalLocatorNode::ACTIVE_COLOUR = 15;
+const int DirectionalLocatorNode::INACTIVE_COLOUR = 12;
+const float DirectionalLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char DirectionalLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK DirectionalLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[DirectionalLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, DirectionalLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Driectional Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ DirectionalLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ DirectionalLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// DirectionalLocatorNode::DirectionalLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+DirectionalLocatorNode::DirectionalLocatorNode()
+{
+}
+
+//==============================================================================
+// DirectionalLocatorNode::~DirectionalLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+DirectionalLocatorNode::~DirectionalLocatorNode()
+{
+}
+
+//=============================================================================
+// DirectionalLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* DirectionalLocatorNode::creator()
+{
+ return new DirectionalLocatorNode();
+}
+
+//=============================================================================
+// DirectionalLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void DirectionalLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::DIRECTIONAL_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawArrow( MPoint( 0, 0, 0 ), MPoint( 0, 0, -1 * WBConstants::Scale ), 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// DirectionalLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus DirectionalLocatorNode::initialize()
+{
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// DirectionalLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void DirectionalLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// DirectionalLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& directionalLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* DirectionalLocatorNode::Export( MObject& directionalLocatorNode )
+{
+ MFnDagNode fnNode( directionalLocatorNode );
+
+ if ( fnNode.typeId() == DirectionalLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::DIRECTIONAL );
+
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+ unsigned int length = 3 * 3; //3 vectors
+
+ unsigned long* data;
+
+ data = new unsigned long[ length ];
+
+ unsigned int row;
+ for ( row = 0; row < 3; ++row )
+ {
+ tlPoint point = hmatrix.GetRow( row );
+
+ memcpy( &data[row * 3], &point.x, sizeof(float) * 3 );
+ }
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, directionalLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/directionallocatornode.h b/tools/worldbuilder/code/nodes/directionallocatornode.h
new file mode 100644
index 0000000..766d83a
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/directionallocatornode.h
@@ -0,0 +1,107 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: directionallocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef DIRECTIONALLOCATORNODE_H
+#define DIRECTIONALLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK DirectionalLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class DirectionalLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ DirectionalLocatorNode();
+ virtual ~DirectionalLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& interiorEntranceLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+private:
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ DirectionalLocatorNode( const DirectionalLocatorNode& directionallocatornode );
+ DirectionalLocatorNode& operator=( const DirectionalLocatorNode& directionallocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// DirectionalLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void DirectionalLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// DirectionalLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const DirectionalLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //DIRECTIONALLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/eventlocatornode.cpp b/tools/worldbuilder/code/nodes/eventlocatornode.cpp
new file mode 100644
index 0000000..ff2c620
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/eventlocatornode.cpp
@@ -0,0 +1,460 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: EventLocatorNode.cpp
+//
+// Description: Implement EventLocatorNode
+//
+// History: 16/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "EventLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+#include "../../../game/code/meta/locatortypes.h"
+
+#include "utility/transformmatrix.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId EventLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::EventLocator );
+const char* EventLocatorNode::stringId = "EventLocatorNode";
+
+const int EventLocatorNode::ACTIVE_COLOUR = 15;
+const int EventLocatorNode::INACTIVE_COLOUR = 12;
+const float EventLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* EventLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* EventLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject EventLocatorNode::sTriggers;
+
+const char* EventLocatorNode::EVENT_NAME_SHORT = "e";
+const char* EventLocatorNode::EVENT_NAME_LONG = "event";
+MObject EventLocatorNode::sEvent;
+
+const char* EventLocatorNode::EXTRA_NAME_SHORT = "ex";
+const char* EventLocatorNode::EXTRA_NAME_LONG = "extraData";
+MObject EventLocatorNode::sExtraData;
+
+char EventLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK EventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[EventLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, EventLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Event Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ EventLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ EventLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// EventLocatorNode::EventLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+EventLocatorNode::EventLocatorNode()
+{
+}
+
+//==============================================================================
+// EventLocatorNode::~EventLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+EventLocatorNode::~EventLocatorNode()
+{
+}
+
+//=============================================================================
+// EventLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* EventLocatorNode::creator()
+{
+ return new EventLocatorNode();
+}
+
+//=============================================================================
+// EventLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void EventLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::EVENT_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ //Need to undo funny transformations...
+ MMatrix mat;
+ mat.setToIdentity();
+
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnDependencyNode transNode( transform );
+ MDagPath transPath;
+ MExt::FindDagNodeByName( &transPath, transNode.name() );
+ MFnTransform fnTransform( transPath );
+
+ mat = fnTransform.transformationMatrix();
+
+ mat = mat.inverse();
+
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP; // - thisWP;
+
+ triggerLP *= mat;
+
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawE( SCALE, 0,1,0, 5.0 );
+
+ MFnDagNode fnNode( thisMObject() );
+ int event;
+ fnNode.findPlug( sEvent ).getValue( event );
+
+ if ( event == LocatorEvent::DEATH ||
+ event == LocatorEvent::WHACKY_GRAVITY ||
+ event == LocatorEvent::CHECK_POINT )
+ {
+ GLExt::drawArrow( MPoint( 0, 0, 0 ), MPoint( 0, 0, -1 * WBConstants::Scale ), 5.0 );
+ }
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// EventLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus EventLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnEnumAttribute enumAttr;
+ sEvent = enumAttr.create( EVENT_NAME_LONG, EVENT_NAME_SHORT, LocatorEvent::CHECK_POINT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
+
+ unsigned int i;
+ for ( i = 0; i < LocatorEvent::SPECIAL; ++i ) //This is the part in the
+ //enum where the regular
+ //events end.
+ {
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( LocatorEvent::Name[i] ), i ) );
+ }
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sEvent ) );
+
+ MFnTypedAttribute typAttr;
+ sExtraData = typAttr.create( EXTRA_NAME_LONG, EXTRA_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sExtraData ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// EventLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void EventLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// EventLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& eventLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* EventLocatorNode::Export( MObject& eventLocatorNode )
+{
+ MFnDagNode fnNode( eventLocatorNode );
+
+ if ( fnNode.typeId() == EventLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::EVENT );
+
+ //The data here is the event associated with this locator.
+ int event;
+ fnNode.findPlug( sEvent ).getValue( event );
+
+ if ( event == static_cast<int>( LocatorEvent::FAR_PLANE ) ||
+ event == static_cast<int>( LocatorEvent::GOO_DAMAGE ) ||
+ event == static_cast<int>( LocatorEvent::COIN_ZONE ) ||
+ event == static_cast<int>( LocatorEvent::CHECK_POINT ) ||
+ event == static_cast<int>( LocatorEvent::TRAP ) ||
+ event == static_cast<int>( LocatorEvent::LIGHT_CHANGE ) )
+ {
+ //Add some extra data.
+ unsigned long data[2];
+ data[0] = event;
+
+ MString extraData;
+ fnNode.findPlug( sExtraData ).getValue( extraData );
+ assert( extraData.isInt() );
+ if ( extraData.isInt() )
+ {
+ int extra = extraData.asInt();
+ memcpy( &data[1], &extra, sizeof(int) );
+ }
+ else
+ {
+ MExt::DisplayWarning( "Event locator: %s has bad extra data, it is probably an old version.(defaulting to 0)", fnNode.name().asChar() );
+ data[1] = 0;
+ }
+
+ locator->SetDataElements( data, 2 );
+ locator->SetNumDataElements( 2 );
+ }
+ else
+ {
+ //Do the old way.
+ unsigned long data = event;
+ locator->SetDataElements( &data, 1 );
+ locator->SetNumDataElements( 1 );
+ }
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, eventLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ if ( event == LocatorEvent::DEATH ||
+ event == LocatorEvent::WHACKY_GRAVITY ||
+ event == LocatorEvent::CHECK_POINT )
+ {
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+ tlExtraMatrixChunk* emChunk = new tlExtraMatrixChunk();
+ emChunk->SetMatrix( hmatrix );
+
+ locator->AppendSubChunk( emChunk );
+ }
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/eventlocatornode.h b/tools/worldbuilder/code/nodes/eventlocatornode.h
new file mode 100644
index 0000000..901dd8c
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/eventlocatornode.h
@@ -0,0 +1,121 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: eventlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 16/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef EVENTLOCATORNODE_H
+#define EVENTLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK EventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class EventLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ EventLocatorNode();
+ virtual ~EventLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* EVENT_NAME_SHORT;
+ static const char* EVENT_NAME_LONG;
+ static MObject sEvent;
+
+ static const char* EXTRA_NAME_SHORT;
+ static const char* EXTRA_NAME_LONG;
+ static MObject sExtraData;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ EventLocatorNode( const EventLocatorNode& eventlocatornode );
+ EventLocatorNode& operator=( const EventLocatorNode& eventlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// EventLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void EventLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// EventLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const EventLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //EVENTLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/fovlocatornode.cpp b/tools/worldbuilder/code/nodes/fovlocatornode.cpp
new file mode 100644
index 0000000..90f9301
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/fovlocatornode.cpp
@@ -0,0 +1,361 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: FOVLocatorNode.cpp
+//
+// Description: Implement FOVLocatorNode
+//
+// History: 03/08/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/FOVLocatorNode.h"
+
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId FOVLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::FOVLocator );
+const char* FOVLocatorNode::stringId = "FOVLocatorNode";
+
+const char* FOVLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* FOVLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject FOVLocatorNode::sTriggers;
+
+const char* FOVLocatorNode::FOV_NAME_SHORT = "f";
+const char* FOVLocatorNode::FOV_NAME_LONG = "fov";
+MObject FOVLocatorNode::sFOV;
+
+const char* FOVLocatorNode::TIME_NAME_SHORT = "tm";
+const char* FOVLocatorNode::TIME_NAME_LONG = "time";
+MObject FOVLocatorNode::sTime;
+
+const char* FOVLocatorNode::RATE_NAME_SHORT = "ra";
+const char* FOVLocatorNode::RATE_NAME_LONG = "rate";
+MObject FOVLocatorNode::sRate;
+
+const int FOVLocatorNode::ACTIVE_COLOUR = 15;
+const int FOVLocatorNode::INACTIVE_COLOUR = 12;
+const float FOVLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char FOVLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK FOVLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[FOVLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, FOVLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the FOV Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ FOVLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ FOVLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// FOVLocatorNode::FOVLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+FOVLocatorNode::FOVLocatorNode()
+{
+}
+
+//==============================================================================
+// FOVLocatorNode::~FOVLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+FOVLocatorNode::~FOVLocatorNode()
+{
+}
+
+//=============================================================================
+// FOVLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* FOVLocatorNode::creator()
+{
+ return new FOVLocatorNode();
+}
+
+//=============================================================================
+// FOVLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void FOVLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::CARSTART_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// FOVLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus FOVLocatorNode::initialize()
+{
+ MStatus status;
+
+ MFnMessageAttribute msgAttr;
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnNumericAttribute numAttr;
+ sFOV = numAttr.create( FOV_NAME_LONG, FOV_NAME_SHORT, MFnNumericData::kFloat, 90.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.1f) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(180.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFOV ) );
+
+ sTime = numAttr.create( TIME_NAME_LONG, TIME_NAME_SHORT, MFnNumericData::kFloat, 2.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(10.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTime ) );
+
+ sRate = numAttr.create( RATE_NAME_LONG, RATE_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sRate ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// FOVLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void FOVLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// FOVLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& FOVLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* FOVLocatorNode::Export( MObject& fovLocatorNode )
+{
+ MFnDagNode fnNode( fovLocatorNode );
+
+ if ( fnNode.typeId() == FOVLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::FOV );
+
+ float fov = 90.0f;
+ float time = 2.0f;
+ float rate = 0.04f;
+
+ fnNode.findPlug( sFOV ).getValue( fov );
+ fnNode.findPlug( sTime ).getValue( time );
+ fnNode.findPlug( sRate ).getValue( rate );
+
+ unsigned long data[3];
+ memcpy( data, &fov, sizeof(float) );
+ memcpy( &(data[1]), &time, sizeof(float) );
+ memcpy( &(data[2]), &rate, sizeof(float) );
+
+ locator->SetDataElements( data, 3 );
+ locator->SetNumDataElements( 3 );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, fovLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/fovlocatornode.h b/tools/worldbuilder/code/nodes/fovlocatornode.h
new file mode 100644
index 0000000..ac531a3
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/fovlocatornode.h
@@ -0,0 +1,124 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: fovlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 03/08/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef FOVLOCATORNODE_H
+#define FOVLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK FOVLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class FOVLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ FOVLocatorNode();
+ virtual ~FOVLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* FOV_NAME_SHORT;
+ static const char* FOV_NAME_LONG;
+ static MObject sFOV;
+
+ static const char* TIME_NAME_SHORT;
+ static const char* TIME_NAME_LONG;
+ static MObject sTime;
+
+ static const char* RATE_NAME_SHORT;
+ static const char* RATE_NAME_LONG;
+ static MObject sRate;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ FOVLocatorNode( const FOVLocatorNode& fovlocatornode );
+ FOVLocatorNode& operator=( const FOVLocatorNode& fovlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// FOVLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void FOVLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// FOVLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const FOVLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //FOVLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/genericlocatornode.cpp b/tools/worldbuilder/code/nodes/genericlocatornode.cpp
new file mode 100644
index 0000000..ef81a26
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/genericlocatornode.cpp
@@ -0,0 +1,287 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: GenericLocatorNode.cpp
+//
+// Description: Implement GenericLocatorNode
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/GenericLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+#include "../../../game/code/meta/locatortypes.h"
+
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId GenericLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::GenericLocator );
+const char* GenericLocatorNode::stringId = "GenericLocatorNode";
+
+const int GenericLocatorNode::ACTIVE_COLOUR = 15;
+const int GenericLocatorNode::INACTIVE_COLOUR = 12;
+const float GenericLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char GenericLocatorNode::sNewName[MAX_NAME_LEN];
+
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK GenericLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[GenericLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, GenericLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Generic Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ GenericLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ GenericLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// GenericLocatorNode::GenericLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+GenericLocatorNode::GenericLocatorNode()
+{
+}
+
+//==============================================================================
+// GenericLocatorNode::~GenericLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+GenericLocatorNode::~GenericLocatorNode()
+{
+}
+
+//=============================================================================
+// GenericLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* GenericLocatorNode::creator()
+{
+ return new GenericLocatorNode();
+}
+
+//=============================================================================
+// GenericLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void GenericLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::GENERIC_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// GenericLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus GenericLocatorNode::initialize()
+{
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// GenericLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void GenericLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// GenericLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& GenericLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* GenericLocatorNode::Export( MObject& genericLocatorNode )
+{
+ MFnDagNode fnNode( genericLocatorNode );
+
+ if ( fnNode.typeId() == GenericLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ if ( fnNode.name().substring(0, 3) == MString("coin") )
+ {
+ locator->SetType( LocatorType::COIN );
+ }
+ else
+ {
+ locator->SetType( LocatorType::GENERIC );
+ }
+
+ locator->SetNumDataElements( 0 );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, genericLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/genericlocatornode.h b/tools/worldbuilder/code/nodes/genericlocatornode.h
new file mode 100644
index 0000000..6a69682
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/genericlocatornode.h
@@ -0,0 +1,108 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: genericlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef GENERICLOCATORNODE_H
+#define GENERICLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK GenericLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class GenericLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ GenericLocatorNode();
+ virtual ~GenericLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& GenericLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ GenericLocatorNode( const GenericLocatorNode& genericlocatornode );
+ GenericLocatorNode& operator=( const GenericLocatorNode& genericlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// GenericLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void GenericLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// GenericLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const GenericLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //GENERICLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/interiorentrancelocatornode.cpp b/tools/worldbuilder/code/nodes/interiorentrancelocatornode.cpp
new file mode 100644
index 0000000..1765423
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/interiorentrancelocatornode.cpp
@@ -0,0 +1,409 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: InteriorEntranceLocatorNode.cpp
+//
+// Description: Implement InteriorEntranceLocatorNode
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/InteriorEntranceLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "utility/transformmatrix.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId InteriorEntranceLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::InteriorEntranceLocator );
+const char* InteriorEntranceLocatorNode::stringId = "InteriorEntranceLocatorNode";
+
+const int InteriorEntranceLocatorNode::ACTIVE_COLOUR = 15;
+const int InteriorEntranceLocatorNode::INACTIVE_COLOUR = 12;
+const float InteriorEntranceLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* InteriorEntranceLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* InteriorEntranceLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject InteriorEntranceLocatorNode::sTriggers;
+
+const char* InteriorEntranceLocatorNode::ZONE_NAME_SHORT = "z";
+const char* InteriorEntranceLocatorNode::ZONE_NAME_LONG = "zone";
+MObject InteriorEntranceLocatorNode::sZone;
+
+char InteriorEntranceLocatorNode::sNewName[MAX_NAME_LEN];
+char InteriorEntranceLocatorNode::sZoneName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK InteriorEntranceLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ SetDlgItemText( hWnd, IDC_EDIT3, "" );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[InteriorEntranceLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, InteriorEntranceLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Interior Entrance Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ InteriorEntranceLocatorNode::SetNewName( newName.asChar() );
+
+ //Do the zone name too...
+ GetDlgItemText( hWnd, IDC_EDIT3, name, InteriorEntranceLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a file name for the zone!");
+ return false;
+ }
+
+ InteriorEntranceLocatorNode::SetZoneName( name );
+
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ InteriorEntranceLocatorNode::SetNewName( "" );
+ InteriorEntranceLocatorNode::SetZoneName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// InteriorEntranceLocatorNode::InteriorEntranceLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+InteriorEntranceLocatorNode::InteriorEntranceLocatorNode()
+{
+}
+
+//==============================================================================
+// InteriorEntranceLocatorNode::~InteriorEntranceLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+InteriorEntranceLocatorNode::~InteriorEntranceLocatorNode()
+{
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* InteriorEntranceLocatorNode::creator()
+{
+ return new InteriorEntranceLocatorNode();
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void InteriorEntranceLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::INTERIOR_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP - thisWP;
+
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawArrow( MPoint( 0, 0, 0 ), MPoint( 0, 0, -1 * WBConstants::Scale ), 5.0 );
+ GLExt::drawD( SCALE, 0,1,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus InteriorEntranceLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnTypedAttribute typAttr;
+ sZone = typAttr.create( ZONE_NAME_LONG, ZONE_NAME_SHORT, MFnData::kString, MObject::kNullObj, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sZone ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void InteriorEntranceLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& interiorEntranceLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* InteriorEntranceLocatorNode::Export( MObject& interiorEntranceLocatorNode )
+{
+ MFnDagNode fnNode( interiorEntranceLocatorNode );
+
+ if ( fnNode.typeId() == InteriorEntranceLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::INTERIOR_ENTRANCE );
+
+ //The data here is the zone associated with this locator.
+ MString zone;
+ fnNode.findPlug( sZone ).getValue( zone );
+
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+
+ unsigned int length = (zone.length() / 4 + 1) + 3 * 3; //string + 3 vectors
+
+ unsigned long* data;
+
+ data = new unsigned long[ length ];
+ unsigned int i;
+ for ( i = 0; i < length; ++i )
+ {
+ data[i] = 0;
+ }
+
+ memcpy( data, zone.asChar(), zone.length() );
+ ((char*)(data))[zone.length()] = '\0';
+
+ unsigned int row;
+ for ( row = 0; row < 3; ++row )
+ {
+ tlPoint point = hmatrix.GetRow( row );
+
+ memcpy( &data[(zone.length() / 4 + 1) + row * 3], &point.x, sizeof(float) * 3 );
+ }
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, interiorEntranceLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ delete data;
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/interiorentrancelocatornode.h b/tools/worldbuilder/code/nodes/interiorentrancelocatornode.h
new file mode 100644
index 0000000..c338e85
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/interiorentrancelocatornode.h
@@ -0,0 +1,151 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: interiorentrancelocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef INTERIORENTRANCELOCATORNODE_H
+#define INTERIORENTRANCELOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK InteriorEntranceLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+
+class InteriorEntranceLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ InteriorEntranceLocatorNode();
+ virtual ~InteriorEntranceLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& interiorEntranceLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+ static void SetZoneName( const char* name );
+ static const char* const GetZoneName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* ZONE_NAME_SHORT;
+ static const char* ZONE_NAME_LONG;
+ static MObject sZone;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+ static char sZoneName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ InteriorEntranceLocatorNode( const InteriorEntranceLocatorNode& interiorentrancelocatornode );
+ InteriorEntranceLocatorNode& operator=( const InteriorEntranceLocatorNode& interiorentrancelocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// InteriorEntranceLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void InteriorEntranceLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const InteriorEntranceLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::SetZoneName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void InteriorEntranceLocatorNode::SetZoneName( const char* name )
+{
+ strncpy( sZoneName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// InteriorEntranceLocatorNode::GetZoneName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const InteriorEntranceLocatorNode::GetZoneName()
+{
+ return sZoneName;
+}
+
+
+#endif //INTERIORENTRANCELOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/occlusionlocatornode.cpp b/tools/worldbuilder/code/nodes/occlusionlocatornode.cpp
new file mode 100644
index 0000000..2e93554
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/occlusionlocatornode.cpp
@@ -0,0 +1,374 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: OcclusionLocatorNode.cpp
+//
+// Description: Implement OcclusionLocatorNode
+//
+// History: 28/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/OcclusionLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId OcclusionLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::OcclusionLocator );
+const char* OcclusionLocatorNode::stringId = "OcclusionLocatorNode";
+
+const int OcclusionLocatorNode::ACTIVE_COLOUR = 15;
+const int OcclusionLocatorNode::INACTIVE_COLOUR = 12;
+const float OcclusionLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* OcclusionLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* OcclusionLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject OcclusionLocatorNode::sTriggers;
+
+char OcclusionLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK OcclusionLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[OcclusionLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, OcclusionLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Occlusion Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ OcclusionLocatorNode::SetNewName( newName.asChar() );
+
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ OcclusionLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// OcclusionLocatorNode::OcclusionLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+OcclusionLocatorNode::OcclusionLocatorNode()
+{
+}
+
+//==============================================================================
+// OcclusionLocatorNode::~OcclusionLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+OcclusionLocatorNode::~OcclusionLocatorNode()
+{
+}
+
+//=============================================================================
+// OcclusionLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* OcclusionLocatorNode::creator()
+{
+ return new OcclusionLocatorNode();
+}
+
+//=============================================================================
+// OcclusionLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void OcclusionLocatorNode::draw( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::OCCLUSION_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP - thisWP;
+
+ if ( i == 0 )
+ {
+ //This is the triggering volume
+ view.setDrawColor( 3, M3dView::kActiveColors );
+ }
+ else
+ {
+ //These are the occluding volumes.
+ view.setDrawColor( 8, M3dView::kActiveColors );
+ }
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawO( SCALE, 0,1,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// OcclusionLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus OcclusionLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// OcclusionLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void OcclusionLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// OcclusionLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& occlusionLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* OcclusionLocatorNode::Export( MObject& occlusionLocatorNode )
+{
+ MFnDagNode fnNode( occlusionLocatorNode );
+
+ if ( fnNode.typeId() == OcclusionLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::OCCLUSION );
+
+ locator->SetNumDataElements( 0 );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, occlusionLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+
+ //Hold onto the visiblers until the end.
+ tlDataChunk* visiblers = new tlDataChunk;
+ unsigned long numVisiblers = 0;
+ unsigned long numRegular = 0;
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ MFnDagNode fnTrigNode( sources[ i ].node() );
+
+ if ( fnTrigNode.name().substring( 0, 0 ) == MString("V") )
+ {
+ visiblers->AppendSubChunk( trigger, 0 );
+ ++numVisiblers;
+ }
+ else
+ {
+ locator->AppendSubChunk( trigger );
+ ++numRegular;
+ }
+
+ }
+
+
+ //Subtract one from the num regular to not cound the primary trigger.
+ numRegular--;
+
+ //Now add the visiblers to the end of the list.
+ if ( numVisiblers )
+ {
+ visiblers->TransferSubChunks( locator );
+
+ //Record how many of these triggers are regular.
+ locator->SetDataElements( &numRegular, 1 );
+ locator->SetNumDataElements( 1 );
+ }
+
+ locator->SetNumTriggers( i );
+
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/occlusionlocatornode.h b/tools/worldbuilder/code/nodes/occlusionlocatornode.h
new file mode 100644
index 0000000..0c3d21e
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/occlusionlocatornode.h
@@ -0,0 +1,112 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: occlusionlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 28/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef OCCLUSIONLOCATORNODE_H
+#define OCCLUSIONLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK OcclusionLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class OcclusionLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ OcclusionLocatorNode();
+ virtual ~OcclusionLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& occlusionLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ OcclusionLocatorNode( const OcclusionLocatorNode& occlusionlocatornode );
+ OcclusionLocatorNode& operator=( const OcclusionLocatorNode& occlusionlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// OcclusionLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void OcclusionLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// OcclusionLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const OcclusionLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //OCCLUSIONLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/pedgrouplocator.cpp b/tools/worldbuilder/code/nodes/pedgrouplocator.cpp
new file mode 100644
index 0000000..3ec6477
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/pedgrouplocator.cpp
@@ -0,0 +1,371 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: PedGroupLocatorNode.cpp
+//
+// Description: Implement PedGroupLocatorNode
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/PedGroupLocator.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "utility/transformmatrix.h"
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId PedGroupLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::PedGroupLocator );
+const char* PedGroupLocatorNode::stringId = "PedGroupLocatorNode";
+
+const int PedGroupLocatorNode::ACTIVE_COLOUR = 15;
+const int PedGroupLocatorNode::INACTIVE_COLOUR = 12;
+const float PedGroupLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* PedGroupLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* PedGroupLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject PedGroupLocatorNode::sTriggers;
+
+const char* PedGroupLocatorNode::GROUP_NAME_SHORT = "grp";
+const char* PedGroupLocatorNode::GROUP_NAME_LONG = "group";
+MObject PedGroupLocatorNode::sGroup;
+
+char PedGroupLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK PedGroupLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[PedGroupLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, PedGroupLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Ped Group Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ PedGroupLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ PedGroupLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// PedGroupLocatorNode::PedGroupLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+PedGroupLocatorNode::PedGroupLocatorNode()
+{
+}
+
+//==============================================================================
+// PedGroupLocatorNode::~PedGroupLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+PedGroupLocatorNode::~PedGroupLocatorNode()
+{
+}
+
+//=============================================================================
+// PedGroupLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* PedGroupLocatorNode::creator()
+{
+ return new PedGroupLocatorNode();
+}
+
+//=============================================================================
+// PedGroupLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void PedGroupLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::DIRECTIONAL_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ //Need to undo funny transformations...
+ MMatrix mat;
+ mat.setToIdentity();
+
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnDependencyNode transNode( transform );
+ MDagPath transPath;
+ MExt::FindDagNodeByName( &transPath, transNode.name() );
+ MFnTransform fnTransform( transPath );
+
+ mat = fnTransform.transformationMatrix();
+
+ mat = mat.inverse();
+
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP; // - thisWP;
+
+ triggerLP *= mat;
+
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawStickMan( SCALE, 0, 1, 0, 5.0 );
+ GLExt::drawStickMan( SCALE, 0.25, 1, 0, 5.0 );
+ GLExt::drawStickMan( SCALE, -0.25, 1, 0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// PedGroupLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus PedGroupLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnNumericAttribute numericAttr;
+ sGroup = numericAttr.create( GROUP_NAME_LONG, GROUP_NAME_SHORT, MFnNumericData::kInt, 0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sGroup ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// PedGroupLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void PedGroupLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// PedGroupLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& directionalLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* PedGroupLocatorNode::Export( MObject& pedGroupLocatorNode )
+{
+ MFnDagNode fnNode( pedGroupLocatorNode );
+
+ if ( fnNode.typeId() == PedGroupLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::PED_GROUP );
+
+ //The data here is the event associated with this locator.
+ int group;
+ fnNode.findPlug( sGroup ).getValue( group );
+
+ unsigned long data = group;
+ locator->SetDataElements( &data, 1 );
+ locator->SetNumDataElements( 1 );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, pedGroupLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/pedgrouplocator.h b/tools/worldbuilder/code/nodes/pedgrouplocator.h
new file mode 100644
index 0000000..e70aded
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/pedgrouplocator.h
@@ -0,0 +1,115 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: pedgrouplocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 29/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef PEDGROUPLOCATORNODE_H
+#define PEDGROUPLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK PedGroupLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class PedGroupLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ PedGroupLocatorNode();
+ virtual ~PedGroupLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& interiorEntranceLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* GROUP_NAME_SHORT;
+ static const char* GROUP_NAME_LONG;
+ static MObject sGroup;
+
+private:
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ PedGroupLocatorNode( const PedGroupLocatorNode& pedgrouplocatornode );
+ PedGroupLocatorNode& operator=( const PedGroupLocatorNode& pedgrouplocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// PedGroupLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void PedGroupLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// PedGroupLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const PedGroupLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+#endif //PEDGROUPLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/railcamlocatornode.cpp b/tools/worldbuilder/code/nodes/railcamlocatornode.cpp
new file mode 100644
index 0000000..63beaf1
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/railcamlocatornode.cpp
@@ -0,0 +1,584 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: RailCamLocatorNode.cpp
+//
+// Description: Implement RailCamLocatorNode
+//
+// History: 18/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+#include <p3d/pointcamera.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "RailCamLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "nodes/triggervolumenode.h"
+#include "utility/nodehelper.h"
+
+#include "gameengine/gameengine.h"
+#include "gameengine/wbcamtarget.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/camera/railcam.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId RailCamLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::RailCamLocator );
+const char* RailCamLocatorNode::stringId = "RailCamLocatorNode";
+
+const int RailCamLocatorNode::ACTIVE_COLOUR = 15;
+const int RailCamLocatorNode::INACTIVE_COLOUR = 12;
+const float RailCamLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* RailCamLocatorNode::RAIL_NAME_SHORT = "rail";
+const char* RailCamLocatorNode::RAIL_NAME_LONG = "camRail";
+MObject RailCamLocatorNode::sRail;
+
+const char* RailCamLocatorNode::BEHAVIOUR_NAME_SHORT = "behav";
+const char* RailCamLocatorNode::BEHAVIOUR_NAME_LONG = "behaviour";
+MObject RailCamLocatorNode::sBehaviour;
+
+const char* RailCamLocatorNode::MIN_RADIUS_NAME_SHORT = "minR";
+const char* RailCamLocatorNode::MIN_RADIUS_NAME_LONG = "minRadius";
+MObject RailCamLocatorNode::sMinRadius;
+
+const char* RailCamLocatorNode::MAX_RADIUS_NAME_SHORT = "maxR";
+const char* RailCamLocatorNode::MAX_RADIUS_NAME_LONG = "maxRadius";
+MObject RailCamLocatorNode::sMaxRadius;
+
+const char* RailCamLocatorNode::TRACK_RAIL_NAME_SHORT = "trkRl";
+const char* RailCamLocatorNode::TRACK_RAIL_NAME_LONG = "trackRail";
+MObject RailCamLocatorNode::sTrackRail;
+
+const char* RailCamLocatorNode::TRACK_DIST_NAME_SHORT = "tDst";
+const char* RailCamLocatorNode::TRACK_DIST_NAME_LONG = "trackDist";
+MObject RailCamLocatorNode::sTrackDist;
+
+const char* RailCamLocatorNode::REVERSE_SENSE_NAME_SHORT ="rvsns";
+const char* RailCamLocatorNode::REVERSE_SENSE_NAME_LONG = "reverseSense";
+MObject RailCamLocatorNode::sReverseSense;
+
+
+const char* RailCamLocatorNode::FOV_NAME_SHORT = "fov";
+const char* RailCamLocatorNode::FOV_NAME_LONG = "fieldOfView";
+MObject RailCamLocatorNode::sFOV;
+
+const char* RailCamLocatorNode::FACING_OFFSET_NAME_SHORT = "facoff";
+const char* RailCamLocatorNode::FACING_OFFSET_NAME_LONG = "facingOffset";
+MObject RailCamLocatorNode::sFacingOffset;
+
+const char* RailCamLocatorNode::AXIS_PLAY_NAME_SHORT = "axsply";
+const char* RailCamLocatorNode::AXIS_PLAY_NAME_LONG = "axisPlay";
+MObject RailCamLocatorNode::sAxisPlay;
+
+const char* RailCamLocatorNode::ACTIVE_NAME_SHORT = "act";
+const char* RailCamLocatorNode::ACTIVE_NAME_LONG = "active";
+MObject RailCamLocatorNode::sActive;
+
+const char* RailCamLocatorNode::TARGET_NAME_SHORT = "trg";
+const char* RailCamLocatorNode::TARGET_NAME_LONG = "target";
+MObject RailCamLocatorNode::sTarget;
+
+const char* RailCamLocatorNode::POS_LAG_NAME_SHORT = "plg";
+const char* RailCamLocatorNode::POS_LAG_NAME_LONG = "positionLag";
+MObject RailCamLocatorNode::sPositionLag;
+
+const char* RailCamLocatorNode::TARGET_LAG_NAME_SHORT = "trglg";
+const char* RailCamLocatorNode::TARGET_LAG_NAME_LONG = "targetLag";
+MObject RailCamLocatorNode::sTargetLag;
+
+const char* RailCamLocatorNode::TRANSITION_TO_RATE_NAME_LONG = "transitionTo";
+const char* RailCamLocatorNode::TRANSITION_TO_RATE_NAME_SHORT = "trnto";
+MObject RailCamLocatorNode::sTransitionToRate;
+
+const char* RailCamLocatorNode::NOFOV_NAME_LONG = "noFOV";
+const char* RailCamLocatorNode::NOFOV_NAME_SHORT = "nf";
+MObject RailCamLocatorNode::sNoFOV;
+
+const char* RailCamLocatorNode::CAR_ONLY_NAME_LONG = "carOnly";
+const char* RailCamLocatorNode::CAR_ONLY_NAME_SHORT = "co";
+MObject RailCamLocatorNode::sCarOnly;
+
+const char* RailCamLocatorNode::ON_FOOT_ONLY_NAME_LONG = "onFootOnly";
+const char* RailCamLocatorNode::ON_FOOT_ONLY_NAME_SHORT = "ofo";
+MObject RailCamLocatorNode::sOnFootOnly;
+
+const char* RailCamLocatorNode::CUTALL_NAME_LONG = "cutInOut";
+const char* RailCamLocatorNode::CUTALL_NAME_SHORT = "cin";
+MObject RailCamLocatorNode::sCutAll;
+
+const char* RailCamLocatorNode::RESET_NAME_LONG = "reset";
+const char* RailCamLocatorNode::RESET_NAME_SHORT = "rst";
+MObject RailCamLocatorNode::sReset;
+
+char RailCamLocatorNode::sNewName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK RailCamLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[RailCamLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, RailCamLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the RailCam Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ RailCamLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ RailCamLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//*****************************************************************************
+//
+// Public Member Functions
+//
+//*****************************************************************************
+
+//=============================================================================
+// RailCamLocatorNode::RailCamLocatorNode
+//=============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//=============================================================================
+RailCamLocatorNode::RailCamLocatorNode()
+{
+ mRailCam = new RailCam();
+ mRailCam->AddRef();
+ mRailCam->SetPlayerID( 0 );
+
+ mRailCam->SetCamera( new tPointCamera() );
+
+ mCamTarget = new WBCamTarget();
+}
+
+//=============================================================================
+// RailCamLocatorNode::~RailCamLocatorNode
+//=============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//=============================================================================
+RailCamLocatorNode::~RailCamLocatorNode()
+{
+ mRailCam->Release();
+ mRailCam = NULL;
+
+ if ( mCamTarget )
+ {
+ delete mCamTarget;
+ }
+}
+
+//=============================================================================
+// RailCamLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* RailCamLocatorNode::creator()
+{
+ return new RailCamLocatorNode();
+}
+
+//=============================================================================
+// RailCamLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void RailCamLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::RAILCAM_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ GameEngine::GetInstance()->UpdateRailCam( thisMObject() );
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// RailCamLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus RailCamLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sRail = msgAttr.create( RAIL_NAME_LONG, RAIL_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sRail ) );
+
+ MFnEnumAttribute enumAttr;
+ sBehaviour = enumAttr.create( BEHAVIOUR_NAME_LONG, BEHAVIOUR_NAME_SHORT, RailCam::PROJECTION, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
+
+ unsigned int i;
+ for ( i = 1; i < RailCam::NUM_BEHAVIOUR; ++i )
+ {
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( RailCam::BehaviourNames[i-1] ), i ) );
+ }
+ RETURN_STATUS_ON_FAILURE( addAttribute( sBehaviour ) );
+
+ MFnNumericAttribute numericAttr;
+ sMinRadius = numericAttr.create( MIN_RADIUS_NAME_LONG, MIN_RADIUS_NAME_SHORT, MFnNumericData::kFloat, 1.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(30.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sMinRadius ) );
+
+ sMaxRadius = numericAttr.create( MAX_RADIUS_NAME_LONG, MAX_RADIUS_NAME_SHORT, MFnNumericData::kFloat, 2.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(30.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sMaxRadius ) );
+
+ sTrackRail = numericAttr.create( TRACK_RAIL_NAME_LONG, TRACK_RAIL_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTrackRail ) );
+
+ sTrackDist = numericAttr.create( TRACK_DIST_NAME_LONG, TRACK_DIST_NAME_SHORT, MFnNumericData::kFloat, 0.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(-5.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(5.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setDefault( 0.0f ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTrackDist ) );
+
+ sReverseSense = numericAttr.create( REVERSE_SENSE_NAME_LONG, REVERSE_SENSE_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sReverseSense ) );
+
+ sFOV = numericAttr.create( FOV_NAME_LONG, FOV_NAME_SHORT, MFnNumericData::kInt, 90, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(180.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFOV ) );
+
+ sFacingOffset = numericAttr.create( FACING_OFFSET_NAME_LONG, FACING_OFFSET_NAME_SHORT, MFnNumericData::k3Float, 0.0f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFacingOffset ) );
+
+ sAxisPlay = numericAttr.create( AXIS_PLAY_NAME_LONG, AXIS_PLAY_NAME_SHORT, MFnNumericData::k3Float, 0.0f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sAxisPlay ) );
+
+ sActive = numericAttr.create( ACTIVE_NAME_LONG, ACTIVE_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sActive ) );
+
+ MFnTypedAttribute typedAttr;
+ sTarget = typedAttr.create( TARGET_NAME_LONG, TARGET_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTarget ) );
+
+ sPositionLag = numericAttr.create( POS_LAG_NAME_LONG, POS_LAG_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sPositionLag ) );
+
+ sTargetLag = numericAttr.create( TARGET_LAG_NAME_LONG, TARGET_LAG_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTargetLag ) );
+
+ sTransitionToRate = numericAttr.create( TRANSITION_TO_RATE_NAME_LONG, TRANSITION_TO_RATE_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTransitionToRate ) );
+
+ sNoFOV = numericAttr.create( NOFOV_NAME_LONG, NOFOV_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sNoFOV ) );
+
+ sCarOnly = numericAttr.create( CAR_ONLY_NAME_LONG, CAR_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sCarOnly ) );
+
+ sOnFootOnly = numericAttr.create( ON_FOOT_ONLY_NAME_LONG, ON_FOOT_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sOnFootOnly ) );
+
+ sCutAll = numericAttr.create( CUTALL_NAME_LONG, CUTALL_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sCutAll ) );
+
+ sReset = numericAttr.create( RESET_NAME_LONG, RESET_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sReset ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// RailCamLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void RailCamLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// RailCamLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& railCamLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* RailCamLocatorNode::Export( MObject& railCamLocatorNode )
+{
+ MFnDagNode fnNode( railCamLocatorNode );
+
+ if ( fnNode.typeId() == RailCamLocatorNode::id )
+ {
+ tlWBRailCamChunk* railChunk = new tlWBRailCamChunk();
+ assert( railChunk );
+
+ railChunk->SetName( fnNode.name().asChar() );
+
+ int behaviour;
+ fnNode.findPlug( sBehaviour ).getValue( behaviour );
+ railChunk->SetBehaviour( (RailCam::Behaviour)(behaviour) );
+
+ float minRad;
+ fnNode.findPlug( sMinRadius ).getValue( minRad );
+ railChunk->SetMinRadius( minRad );
+
+ float maxRad;
+ fnNode.findPlug( sMaxRadius ).getValue( maxRad );
+ railChunk->SetMaxRadius( maxRad );
+
+ bool trackRail;
+ fnNode.findPlug( sTrackRail ).getValue( trackRail );
+ railChunk->SetTrackRail( trackRail ? 1 : 0 );
+
+ float trackDist;
+ fnNode.findPlug( sTrackDist ).getValue( trackDist );
+ railChunk->SetTrackDist( trackDist );
+
+ bool reverseSense;
+ fnNode.findPlug( sReverseSense ).getValue( reverseSense );
+ railChunk->SetReverseSense( reverseSense ? 1 : 0 );
+
+ float fov;
+ fnNode.findPlug( sFOV ).getValue( fov );
+ railChunk->SetFOV( fov );
+
+ float x, y, z;
+ fnNode.findPlug( sFacingOffset ).child( 0 ).getValue( x );
+ fnNode.findPlug( sFacingOffset ).child( 1 ).getValue( y );
+ fnNode.findPlug( sFacingOffset ).child( 2 ).getValue( z );
+ railChunk->SetTargetOffset( tlPoint( x, y, z ) );
+
+ // THIS IS A HACK. Since we're not going to support axis play. We're
+ // going to hide the transition rate in the data. Sorry.
+// fnNode.findPlug( sAxisPlay ).child( 0 ).getValue( x );
+// fnNode.findPlug( sAxisPlay ).child( 1 ).getValue( y );
+// fnNode.findPlug( sAxisPlay ).child( 2 ).getValue( z );
+ fnNode.findPlug( sTransitionToRate ).getValue( x ); //transition rate.
+
+ //Now we're hiding the flags in the y.. THIS SUCKS!
+ bool noF = false;
+ fnNode.findPlug( sNoFOV ).getValue( noF );
+ y = (float)( noF ? 1 : 0 );
+
+ //This just GETS WORSE!
+ int values = 0;
+
+ bool carOnly = false;
+ fnNode.findPlug( sCarOnly ).getValue( carOnly );
+ values |= ( carOnly ? 0x00000001 : 0 );
+
+ bool cut = false;
+ fnNode.findPlug( sCutAll ).getValue( cut );
+ values |= ( cut ? 0x00000002 : 0 );
+
+ bool reset = false;
+ fnNode.findPlug( sReset ).getValue( reset );
+ values |= ( reset ? 0x00000004 : 0 );
+
+ bool onFootOnly = false;
+ fnNode.findPlug( sOnFootOnly ).getValue( onFootOnly );
+ values |= ( onFootOnly ? 0x00000008 : 0 );
+
+ if( carOnly && onFootOnly )
+ {
+ MExt::DisplayError( "Rail Camera: %s has onFootOnly and carOnly flags set!\n", fnNode.name().asChar() );
+ }
+
+ z = (float)values;
+ railChunk->SetAxisPlay( tlPoint( x, y, z ) );
+
+ float posLag;
+ fnNode.findPlug( sPositionLag ).getValue( posLag );
+ railChunk->SetPositionLag( posLag );
+
+ float targLag;
+ fnNode.findPlug( sTargetLag ).getValue( targLag );
+ railChunk->SetTargetLag( targLag );
+
+ return railChunk;
+ }
+
+ return NULL;
+}
+
+//*****************************************************************************
+//
+// Private Member Functions
+//
+//*****************************************************************************
diff --git a/tools/worldbuilder/code/nodes/railcamlocatornode.h b/tools/worldbuilder/code/nodes/railcamlocatornode.h
new file mode 100644
index 0000000..ce89b03
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/railcamlocatornode.h
@@ -0,0 +1,232 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: railcamlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 18/07/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef RAILCAMLOCATORNODE_H
+#define RAILCAMLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+class RailCam;
+class WBCamTarget;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK RailCamLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class RailCamLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ RailCamLocatorNode();
+ virtual ~RailCamLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& railCamLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* RAIL_NAME_SHORT;
+ static const char* RAIL_NAME_LONG;
+ static MObject sRail;
+
+ static const char* BEHAVIOUR_NAME_SHORT;
+ static const char* BEHAVIOUR_NAME_LONG;
+ static MObject sBehaviour;
+
+ static const char* MIN_RADIUS_NAME_SHORT;
+ static const char* MIN_RADIUS_NAME_LONG;
+ static MObject sMinRadius;
+
+ static const char* MAX_RADIUS_NAME_SHORT;
+ static const char* MAX_RADIUS_NAME_LONG;
+ static MObject sMaxRadius;
+
+ static const char* TRACK_RAIL_NAME_SHORT;
+ static const char* TRACK_RAIL_NAME_LONG;
+ static MObject sTrackRail;
+
+ static const char* TRACK_DIST_NAME_SHORT;
+ static const char* TRACK_DIST_NAME_LONG;
+ static MObject sTrackDist;
+
+ static const char* REVERSE_SENSE_NAME_SHORT;
+ static const char* REVERSE_SENSE_NAME_LONG;
+ static MObject sReverseSense;
+
+
+ static const char* FOV_NAME_SHORT;
+ static const char* FOV_NAME_LONG;
+ static MObject sFOV;
+
+ static const char* FACING_OFFSET_NAME_SHORT;
+ static const char* FACING_OFFSET_NAME_LONG;
+ static MObject sFacingOffset;
+
+ static const char* AXIS_PLAY_NAME_SHORT;
+ static const char* AXIS_PLAY_NAME_LONG;
+ static MObject sAxisPlay;
+
+ static const char* ACTIVE_NAME_SHORT;
+ static const char* ACTIVE_NAME_LONG;
+ static MObject sActive;
+
+ static const char* TARGET_NAME_SHORT;
+ static const char* TARGET_NAME_LONG;
+ static MObject sTarget;
+
+ static const char* POS_LAG_NAME_SHORT;
+ static const char* POS_LAG_NAME_LONG;
+ static MObject sPositionLag;
+
+ static const char* TARGET_LAG_NAME_SHORT;
+ static const char* TARGET_LAG_NAME_LONG;
+ static MObject sTargetLag;
+
+ static const char* TRANSITION_TO_RATE_NAME_LONG;
+ static const char* TRANSITION_TO_RATE_NAME_SHORT;
+ static MObject sTransitionToRate;
+
+ static const char* NOFOV_NAME_LONG;
+ static const char* NOFOV_NAME_SHORT;
+ static MObject sNoFOV;
+
+ static const char* CAR_ONLY_NAME_LONG;
+ static const char* CAR_ONLY_NAME_SHORT;
+ static MObject sCarOnly;
+
+ static const char* ON_FOOT_ONLY_NAME_LONG;
+ static const char* ON_FOOT_ONLY_NAME_SHORT;
+ static MObject sOnFootOnly;
+
+ static const char* CUTALL_NAME_LONG;
+ static const char* CUTALL_NAME_SHORT;
+ static MObject sCutAll;
+
+ static const char* RESET_NAME_LONG;
+ static const char* RESET_NAME_SHORT;
+ static MObject sReset;
+
+ //MPxNode stuff...
+ RailCam* GetRailCam();
+ WBCamTarget* GetTarget();
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ RailCam* mRailCam;
+ WBCamTarget* mCamTarget;
+
+ //Prevent wasteful constructor creation.
+ RailCamLocatorNode( const RailCamLocatorNode& eventlocatornode );
+ RailCamLocatorNode& operator=( const RailCamLocatorNode& railCamlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// RailCamLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void RailCamLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// RailCamLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const RailCamLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// RailCamLocatorNode::GetRailCam
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: RailCam
+//
+//=============================================================================
+inline RailCam* RailCamLocatorNode::GetRailCam()
+{
+ return mRailCam;
+}
+
+//=============================================================================
+// RailCamLocatorNode::GetTarget
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: WBCamTarget
+//
+//=============================================================================
+inline WBCamTarget* RailCamLocatorNode::GetTarget()
+{
+ return mCamTarget;
+}
+
+#endif //RAILCAMLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/scriptlocatornode.cpp b/tools/worldbuilder/code/nodes/scriptlocatornode.cpp
new file mode 100644
index 0000000..93d5c67
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/scriptlocatornode.cpp
@@ -0,0 +1,377 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: ScriptLocatorNode.cpp
+//
+// Description: Implement ScriptLocatorNode
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/ScriptLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+#include "../../../game/code/meta/locatortypes.h"
+
+#define HIINT(x) (((int)((x)>>32) & 0xFFFFFFFF))
+#define LOINT(x) ((int)x)
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId ScriptLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::ScriptLocator );
+const char* ScriptLocatorNode::stringId = "ScriptLocatorNode";
+
+const int ScriptLocatorNode::ACTIVE_COLOUR = 15;
+const int ScriptLocatorNode::INACTIVE_COLOUR = 12;
+const float ScriptLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* ScriptLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* ScriptLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject ScriptLocatorNode::sTriggers;
+
+const char* ScriptLocatorNode::SCRIPT_NAME_SHORT = "s";
+const char* ScriptLocatorNode::SCRIPT_NAME_LONG = "script";
+MObject ScriptLocatorNode::sScript;
+
+char ScriptLocatorNode::sNewName[MAX_NAME_LEN];
+char ScriptLocatorNode::sScriptName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK ScriptLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ SetDlgItemText( hWnd, IDC_EDIT3, "" );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[ScriptLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, ScriptLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Script Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ ScriptLocatorNode::SetNewName( newName.asChar() );
+
+ //Do the scripte name too...
+ GetDlgItemText( hWnd, IDC_EDIT3, name, ScriptLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a script name!");
+ return false;
+ }
+
+ ScriptLocatorNode::SetScriptName( name );
+
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ ScriptLocatorNode::SetNewName( "" );
+ ScriptLocatorNode::SetScriptName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// ScriptLocatorNode::ScriptLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ScriptLocatorNode::ScriptLocatorNode()
+{
+}
+
+//==============================================================================
+// ScriptLocatorNode::~ScriptLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ScriptLocatorNode::~ScriptLocatorNode()
+{
+}
+
+//=============================================================================
+// ScriptLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* ScriptLocatorNode::creator()
+{
+ return new ScriptLocatorNode();
+}
+
+//=============================================================================
+// ScriptLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void ScriptLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::SCRIPT_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP - thisWP;
+
+ //TEMP
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawS( SCALE, 0,1,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// ScriptLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus ScriptLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnTypedAttribute typedAttr;
+ sScript = typedAttr.create( SCRIPT_NAME_LONG, SCRIPT_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sScript ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// ScriptLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void ScriptLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// ScriptLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& ScriptLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* ScriptLocatorNode::Export( MObject& scriptLocatorNode )
+{
+ MFnDagNode fnNode( scriptLocatorNode );
+
+ if ( fnNode.typeId() == ScriptLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::SCRIPT );
+
+ //The data here is the event associated with this locator.
+ MString script;
+ fnNode.findPlug( sScript ).getValue( script );
+
+ unsigned int length = (script.length() / 4 + 1);
+
+ unsigned long* data = new unsigned long[length];
+ memset(data, 0, length * 4);
+ memcpy( data, script.asChar(), script.length() );
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ delete[] data;
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, scriptLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/scriptlocatornode.h b/tools/worldbuilder/code/nodes/scriptlocatornode.h
new file mode 100644
index 0000000..b7586ba
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/scriptlocatornode.h
@@ -0,0 +1,149 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: scriptlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 27/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef SCRIPTLOCATORNODE_H
+#define SCRIPTLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK ScriptLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class ScriptLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ ScriptLocatorNode();
+ virtual ~ScriptLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static void SetScriptName( const char* name );
+ static const char* const GetScriptName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* SCRIPT_NAME_SHORT;
+ static const char* SCRIPT_NAME_LONG;
+ static MObject sScript;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+ static char sScriptName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ ScriptLocatorNode( const ScriptLocatorNode& scriptlocatornode );
+ ScriptLocatorNode& operator=( const ScriptLocatorNode& scriptlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// ScriptLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ScriptLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ScriptLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ScriptLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// ScriptLocatorNode::SetScriptName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ScriptLocatorNode::SetScriptName( const char* name )
+{
+ strncpy( sScriptName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ScriptLocatorNode::GetScriptName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ScriptLocatorNode::GetScriptName()
+{
+ return sScriptName;
+}
+#endif //SCRIPTLOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/splinelocatornode.cpp b/tools/worldbuilder/code/nodes/splinelocatornode.cpp
new file mode 100644
index 0000000..14765be
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/splinelocatornode.cpp
@@ -0,0 +1,439 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: SplineLocatorNode.cpp
+//
+// Description: Implement SplineLocatorNode
+//
+// History: 05/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/SplineLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/mext.h"
+#include "utility/glext.h"
+#include "nodes/triggervolumenode.h"
+#include "nodes/wbspline.h"
+#include "nodes/railcamlocatornode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+const char* SplineLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* SplineLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject SplineLocatorNode::sTriggers;
+
+const char* SplineLocatorNode::SPLINE_NAME_LONG = "spline";
+const char* SplineLocatorNode::SPLINE_NAME_SHORT = "spl";
+MObject SplineLocatorNode::sSpline;
+
+const char* SplineLocatorNode::CAMERA_NAME_LONG = "camera";
+const char* SplineLocatorNode::CAMERA_NAME_SHORT = "cam";
+MObject SplineLocatorNode::sCamera;
+
+const char* SplineLocatorNode::IS_COIN_SHORT = "ic";
+const char* SplineLocatorNode::IS_COIN_LONG = "isCoin";
+MObject SplineLocatorNode::sIsCoin;
+
+
+const char* SplineLocatorNode::stringId = "SplineLocatorNode";
+MTypeId SplineLocatorNode::id = WBConstants::NodeIDs::SplineLocator;
+
+
+MPointArray GetCoinPoints( MObject& nurbsCurve, MObject& locator, bool justWP )
+{
+ MFnDagNode fnDagNode( nurbsCurve );
+ MDagPath dagPath;
+ fnDagNode.getPath( dagPath );
+
+ MStatus status;
+
+ MFnNurbsCurve fnNurbs( dagPath, &status );
+ assert( status );
+
+ const char* name = fnNurbs.name().asChar();
+
+ MPointArray points;
+
+ if ( status )
+ {
+ int numCVs = fnNurbs.numCVs( &status );
+ assert( status );
+
+ //Get the number of coins
+ int numCoins = 0;
+ fnDagNode.findPlug( MString("numCoins") ).getValue( numCoins );
+ assert( numCoins );
+
+ if ( numCoins == 0 )
+ {
+ MExt::DisplayError( "Coin spline: %s has no coins!", fnDagNode.name().asChar() );
+ }
+ else
+ {
+ //Need to undo funny transformations...
+ MMatrix mat;
+ mat.setToIdentity();
+
+ MObject transform;
+ MFnDependencyNode locDepNode( locator );
+ MDagPath locatorDagPath;
+ MExt::FindDagNodeByName( &locatorDagPath, locDepNode.name() );
+ MFnDagNode locDagNode( locatorDagPath );
+
+ const char* otherName = locDagNode.name().asChar();
+
+ transform = locDagNode.parent( 0 );
+ MFnDependencyNode transNode( transform );
+ MDagPath transPath;
+ MExt::FindDagNodeByName( &transPath, transNode.name() );
+ MFnTransform fnTransform( transPath );
+
+ const char* nameHere = fnTransform.name().asChar();
+
+ MFnTransform splineTrans( dagPath ); //This is the splines transform.
+ MPoint splinePos( splineTrans.translation( MSpace::kWorld ) );
+
+
+ mat = fnTransform.transformationMatrix();
+
+ mat = mat.inverse();
+
+ double numCoinSpans = fnNurbs.numSpans();
+
+ double coinsPerFullSpan = (double)numCoins / numCoinSpans;
+
+ //Draw a coin at even intervals.
+ double interval = 1.0 / coinsPerFullSpan;
+
+ double i;
+ for ( i = 0; i < numCoins; ++i )
+ {
+ MPoint point;
+ fnNurbs.getPointAtParam( interval * i, point, MSpace::kWorld );
+
+ if ( !justWP )
+ {
+ //Put in world space
+ point *= mat;
+ point += splinePos;
+ }
+
+ points.append( point );
+ }
+ }
+ }
+
+ return points;
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// SplineLocatorNode::SplineLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SplineLocatorNode::SplineLocatorNode()
+{
+}
+
+//==============================================================================
+// SplineLocatorNode::~SplineLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+SplineLocatorNode::~SplineLocatorNode()
+{
+}
+
+//=============================================================================
+// SplineLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void SplineLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ MStatus status;
+ MFnDependencyNode fnNode( thisMObject() );
+ bool isCoins = false;
+ fnNode.findPlug( sIsCoin ).getValue( isCoins );
+ if ( isCoins )
+ {
+
+ const char* name = fnNode.name().asChar();
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ //Get the attached Maya spline.
+ MPlugArray sources, targets;
+ //Get the spline associated with this bad-boy.
+ MPlug splinePlug = fnNode.findPlug( sSpline );
+ MExt::ResolveConnections( &sources, &targets, splinePlug, true, false );
+ assert( sources.length() == 1 );
+
+ MPointArray points = GetCoinPoints( sources[0].node(), thisMObject(), false );
+ unsigned int i;
+ for ( i = 0; i < points.length(); ++i )
+ {
+ GLExt::drawO( 1.0 * WBConstants::Scale, points[i].x, points[i].y + 0.25, points[i].z, 3.0f );
+ }
+ }
+ }
+}
+
+//=============================================================================
+// SplineLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus SplineLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ sSpline = msgAttr.create( SPLINE_NAME_LONG, SPLINE_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sSpline ) );
+
+ sCamera = msgAttr.create( CAMERA_NAME_LONG, CAMERA_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sCamera ) );
+
+ MFnNumericAttribute numAttr;
+ sIsCoin = numAttr.create( IS_COIN_LONG, IS_COIN_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sIsCoin ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// SplineLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void SplineLocatorNode::postConstructor()
+{
+ setExistWithoutInConnections( false );
+ setExistWithoutOutConnections( false );
+}
+
+//=============================================================================
+// SplineLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& splineLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* SplineLocatorNode::Export( MObject& splineLocatorNode )
+{
+ MFnDagNode fnNode( splineLocatorNode );
+
+ if ( fnNode.typeId() == SplineLocatorNode::id )
+ {
+ bool isCoinSpline = false;
+ fnNode.findPlug( sIsCoin ).getValue( isCoinSpline );
+ if ( isCoinSpline )
+ {
+ //Export a coin spline.
+ MPlugArray sources, targets;
+ //Get the spline associated with this bad-boy.
+ MPlug splinePlug = fnNode.findPlug( sSpline );
+ MExt::ResolveConnections( &sources, &targets, splinePlug, true, false );
+ assert( sources.length() == 1 );
+
+ MPointArray points = GetCoinPoints( sources[0].node(), splineLocatorNode, true );
+
+ tlWBLocatorChunk* locator = NULL;
+
+ unsigned int coinCount = 0;
+
+ if ( points.length() > 0 )
+ {
+ locator = new tlWBLocatorChunk;
+
+ locator->SetType( LocatorType::GENERIC );
+
+ unsigned int i;
+ for ( i = 0; i < points.length(); ++i )
+ {
+ tlWBLocatorChunk* coinLoc = new tlWBLocatorChunk;
+ coinLoc->SetType( LocatorType::COIN );
+
+ tlPoint point;
+ point.x = points[i].x / WBConstants::Scale;
+ point.y = points[i].y / WBConstants::Scale;
+ point.z = -points[i].z / WBConstants::Scale;
+
+ coinLoc->SetPosition( point );
+
+ char name[256];
+ sprintf( name, "%sCoin%d", fnNode.name().asChar(), coinCount );
+ coinLoc->SetName( name );
+ ++coinCount;
+
+
+ locator->AppendSubChunk( coinLoc );
+ }
+ }
+
+ return locator;
+
+ }
+ else
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::SPLINE );
+
+ //The data here is the event associated with this locator.
+ locator->SetNumDataElements( 0 );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, splineLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ MPlugArray sources, targets;
+ //Get the spline associated with this bad-boy.
+ MPlug splinePlug = fnNode.findPlug( sSpline );
+ MExt::ResolveConnections( &sources, &targets, splinePlug, true, false );
+ assert( sources.length() == 1 );
+
+ tlDataChunk* splineChunk = WBSpline::Export( sources[ 0 ].node() );
+ assert( splineChunk );
+
+ if ( splineChunk )
+ {
+ //Get the camera and append it here.
+ MPlug railCamPlug = fnNode.findPlug( sCamera );
+ MExt::ResolveConnections( &sources, &targets, railCamPlug, true, false );
+ assert( targets.length() == 1 );
+
+ tlDataChunk* railCamChunk = RailCamLocatorNode::Export( sources[0].node() );
+ assert( railCamChunk );
+ splineChunk->AppendSubChunk( railCamChunk );
+
+ locator->AppendSubChunk( splineChunk );
+ }
+ else
+ {
+ MExt::DisplayError( "No spline attached to: %s!", fnNode.name().asChar() );
+ }
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ return locator;
+ }
+
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/splinelocatornode.h b/tools/worldbuilder/code/nodes/splinelocatornode.h
new file mode 100644
index 0000000..4473d05
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/splinelocatornode.h
@@ -0,0 +1,101 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: scriptlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 16/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef SPLINELOCATORNODE_H
+#define SPLINELOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class SplineLocatorNode : public MPxLocatorNode
+{
+public:
+ SplineLocatorNode();
+ virtual ~SplineLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* SPLINE_NAME_SHORT;
+ static const char* SPLINE_NAME_LONG;
+ static MObject sSpline;
+
+ static const char* CAMERA_NAME_SHORT;
+ static const char* CAMERA_NAME_LONG;
+ static MObject sCamera;
+
+ static const char* IS_COIN_SHORT;
+ static const char* IS_COIN_LONG;
+ static MObject sIsCoin;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ //Prevent wasteful constructor creation.
+ SplineLocatorNode( const SplineLocatorNode& eventlocatornode );
+ SplineLocatorNode& operator=( const SplineLocatorNode& eventlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// SplineLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+inline void* SplineLocatorNode::creator()
+{
+ return new SplineLocatorNode();
+}
+
+#endif //SPLINELOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/staticcameralocatornode.cpp b/tools/worldbuilder/code/nodes/staticcameralocatornode.cpp
new file mode 100644
index 0000000..c922d0f
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/staticcameralocatornode.cpp
@@ -0,0 +1,573 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: StaticCameraLocatorNode.cpp
+//
+// Description: Implement StaticCameraLocatorNode
+//
+// History: 9/17/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+// Foundation Tech
+#include "main/toolhack.h"
+#include <raddebug.hpp>
+#include <p3d/pointcamera.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "StaticCameraLocatorNode.h"
+
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+#include "utility/transformmatrix.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatortypes.h"
+#include "../../../game/code/camera/staticcam.h"
+
+#include "nodes/triggervolumenode.h"
+
+#include "gameengine/gameengine.h"
+#include "gameengine/wbcamtarget.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId StaticCameraLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::StaticCameraLocator );
+const char* StaticCameraLocatorNode::stringId = "StaticCameraLocatorNode";
+
+const int StaticCameraLocatorNode::ACTIVE_COLOUR = 15;
+const int StaticCameraLocatorNode::INACTIVE_COLOUR = 12;
+const float StaticCameraLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+char StaticCameraLocatorNode::sNewName[MAX_NAME_LEN];
+
+const char* StaticCameraLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* StaticCameraLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject StaticCameraLocatorNode::sTriggers;
+
+const char* StaticCameraLocatorNode::FOV_NAME_SHORT = "fov";
+const char* StaticCameraLocatorNode::FOV_NAME_LONG = "fieldOfView";
+MObject StaticCameraLocatorNode::sFOV;
+
+const char* StaticCameraLocatorNode::TARGET_NAME_SHORT = "trg";
+const char* StaticCameraLocatorNode::TARGET_NAME_LONG = "target";
+MObject StaticCameraLocatorNode::sTarget;
+
+const char* StaticCameraLocatorNode::FACING_OFFSET_NAME_SHORT = "facoff";
+const char* StaticCameraLocatorNode::FACING_OFFSET_NAME_LONG = "facingOffset";
+MObject StaticCameraLocatorNode::sFacingOffset;
+
+const char* StaticCameraLocatorNode::TRACKING_NAME_SHORT = "trkng";
+const char* StaticCameraLocatorNode::TRACKING_NAME_LONG = "tracking";
+MObject StaticCameraLocatorNode::sTracking;
+
+const char* StaticCameraLocatorNode::TARGET_LAG_NAME_SHORT = "trglg";
+const char* StaticCameraLocatorNode::TARGET_LAG_NAME_LONG = "targetLag";
+MObject StaticCameraLocatorNode::sTargetLag;
+
+const char* StaticCameraLocatorNode::ACTIVE_NAME_SHORT = "act";
+const char* StaticCameraLocatorNode::ACTIVE_NAME_LONG = "active";
+MObject StaticCameraLocatorNode::sActive;
+
+const char* StaticCameraLocatorNode::TRANSITION_TO_RATE_NAME_LONG = "transitionTo";
+const char* StaticCameraLocatorNode::TRANSITION_TO_RATE_NAME_SHORT = "trnto";
+MObject StaticCameraLocatorNode::sTransitionToRate;
+
+const char* StaticCameraLocatorNode::ONESHOT_NAME_LONG = "oneShot";
+const char* StaticCameraLocatorNode::ONESHOT_NAME_SHORT = "oShot";
+MObject StaticCameraLocatorNode::sOneShot;
+
+const char* StaticCameraLocatorNode::NOFOV_NAME_LONG = "noFOV";
+const char* StaticCameraLocatorNode::NOFOV_NAME_SHORT = "nf";
+MObject StaticCameraLocatorNode::sNoFOV;
+
+const char* StaticCameraLocatorNode::CUTALL_NAME_LONG = "cutInOut";
+const char* StaticCameraLocatorNode::CUTALL_NAME_SHORT = "cin";
+MObject StaticCameraLocatorNode::sCutAll;
+
+const char* StaticCameraLocatorNode::CAR_ONLY_NAME_LONG = "carOnly";
+const char* StaticCameraLocatorNode::CAR_ONLY_NAME_SHORT = "co";
+MObject StaticCameraLocatorNode::sCarOnly;
+
+const char* StaticCameraLocatorNode::ON_FOOT_ONLY_NAME_LONG = "onFootOnly";
+const char* StaticCameraLocatorNode::ON_FOOT_ONLY_NAME_SHORT = "ofo";
+MObject StaticCameraLocatorNode::sOnFootOnly;
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK StaticCameraLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[StaticCameraLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, StaticCameraLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Static Camera Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ StaticCameraLocatorNode::SetNewName( newName.asChar() );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ StaticCameraLocatorNode::SetNewName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// BreakableCameraLocatorNode::StaticCameraLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+StaticCameraLocatorNode::StaticCameraLocatorNode()
+{
+ mStaticCam = new StaticCam();
+ mStaticCam->AddRef();
+ mStaticCam->SetPlayerID( 0 );
+
+ mStaticCam->SetCamera( new tPointCamera() );
+
+ mCamTarget = new WBCamTarget();
+}
+
+//==============================================================================
+// StaticCameraLocatorNode::~StaticCameraLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+StaticCameraLocatorNode::~StaticCameraLocatorNode()
+{
+ mStaticCam->Release();
+ mStaticCam = NULL;
+
+ if ( mCamTarget )
+ {
+ delete mCamTarget;
+ }
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* StaticCameraLocatorNode::creator()
+{
+ return new StaticCameraLocatorNode();
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void StaticCameraLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::DIRECTIONAL_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ GameEngine::GetInstance()->UpdateStaticCam( thisMObject() );
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0f );
+ GLExt::drawCamera3D( SCALE, 0,0,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus StaticCameraLocatorNode::initialize()
+{
+ MStatus status;
+ MFnMessageAttribute msgAttr;
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnNumericAttribute numericAttr;
+ sFOV = numericAttr.create( FOV_NAME_LONG, FOV_NAME_SHORT, MFnNumericData::kFloat, 90.0f, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.1f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(180.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFOV ) );
+
+ MFnTypedAttribute typedAttr;
+ sTarget = typedAttr.create( TARGET_NAME_LONG, TARGET_NAME_SHORT, MFnData::kString, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTarget ) );
+
+ sFacingOffset = numericAttr.create( FACING_OFFSET_NAME_LONG, FACING_OFFSET_NAME_SHORT, MFnNumericData::k3Float, 0.0f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sFacingOffset ) );
+
+ sTracking = numericAttr.create( TRACKING_NAME_LONG, TRACKING_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTracking ) );
+
+ sTargetLag = numericAttr.create( TARGET_LAG_NAME_LONG, TARGET_LAG_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTargetLag ) );
+
+ sActive = numericAttr.create( ACTIVE_NAME_LONG, ACTIVE_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sActive ) );
+
+ sTransitionToRate = numericAttr.create( TRANSITION_TO_RATE_NAME_LONG, TRANSITION_TO_RATE_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTransitionToRate ) );
+
+ sOneShot = numericAttr.create( ONESHOT_NAME_LONG, ONESHOT_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sOneShot ) );
+
+ sNoFOV = numericAttr.create( NOFOV_NAME_LONG, NOFOV_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sNoFOV ) );
+
+ sCutAll = numericAttr.create( CUTALL_NAME_LONG, CUTALL_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sCutAll ) );
+
+ sCarOnly = numericAttr.create( CAR_ONLY_NAME_LONG, CAR_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sCarOnly ) );
+
+ sOnFootOnly = numericAttr.create( ON_FOOT_ONLY_NAME_LONG, ON_FOOT_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( addAttribute( sOnFootOnly ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void StaticCameraLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& staticCameraLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* StaticCameraLocatorNode::Export( MObject& staticCameraLocatorNode )
+{
+ MFnDagNode fnNode( staticCameraLocatorNode );
+
+ if ( fnNode.typeId() == StaticCameraLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::STATIC_CAMERA );
+
+ //Set the position
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, staticCameraLocatorNode );
+
+ //Set the values.
+ tlPoint position;
+
+ position[0] = thisPosition[0] / WBConstants::Scale;
+ position[1] = thisPosition[1] / WBConstants::Scale;
+ position[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( position );
+
+ //Also get the direction.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ unsigned int length = (1 * 3) + 2 + 1 + 1 + 1 + 1 + 1; //1 vector + 2 floats + 1 bool + transition rate (offset + fov & lag + tracking + trate) + one shot + CUT_ALL + CarOnly/OnFootOnly
+
+ unsigned long* data;
+
+ data = new unsigned long[ length ];
+
+ rmt::Vector offset;
+
+ float x = 0.0f;
+ float y = 0.0f;
+ float z = 0.0f;
+
+ fnNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(0).getValue( x );
+ fnNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(1).getValue( y );
+ fnNode.findPlug( StaticCameraLocatorNode::sFacingOffset ).child(2).getValue( z );
+
+ bool tracking = false;
+ fnNode.findPlug( StaticCameraLocatorNode::sTracking ).getValue( tracking );
+
+ if ( tracking )
+ {
+ offset = rmt::Vector( x, y, z );
+ }
+ else
+ {
+ //Figure out the transformation on the locator node and apply it to the offset.
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0];
+ hmatrix.element[3][1];
+ hmatrix.element[3][2];
+
+ tlPoint point( 0.0f, 0.0f, 10.0f );
+ point = VectorTransform( hmatrix, point );
+
+ offset = position;
+ offset.Add( point );
+ }
+
+ //Copy the offset to the locator
+ memcpy( &data[0], &offset.x, 3 * sizeof(float) );
+
+ float fov = 90.0f;
+ fnNode.findPlug( sFOV ).getValue( fov );
+ memcpy( &data[3], &fov, sizeof(float) );
+
+ float lag = 0.04f;
+ fnNode.findPlug( sTargetLag ).getValue( lag );
+ memcpy( &data[4], &lag, sizeof(float) );
+
+ //Also tracking
+ if ( tracking )
+ {
+ data[5] = 1;
+ }
+ else
+ {
+ data[5] = 0;
+ }
+
+ float tRate = 0.04f;
+ fnNode.findPlug( sTransitionToRate ).getValue( tRate );
+ memcpy( &data[6], &tRate, sizeof(float) );
+
+ bool oneShot = false;
+ fnNode.findPlug( sOneShot ).getValue( oneShot );
+ if ( oneShot )
+ {
+ data[7] = 1;
+ }
+ else
+ {
+ data[7] = 0;
+ }
+
+ bool noFOV = false;
+ fnNode.findPlug( sNoFOV ).getValue( noFOV );
+ data[7] |= ( (noFOV ? 1 : 0 ) << 1 );
+
+ bool cutInOut = false;
+ fnNode.findPlug( sCutAll ).getValue( cutInOut );
+ data[8] = ( (cutInOut ? 1 : 0 ) );
+
+ bool carOnly = false;
+ fnNode.findPlug( sCarOnly ).getValue( carOnly );
+ data[9] = ( (carOnly ? 1 : 0 ) );
+
+ bool onFootOnly = false;
+ fnNode.findPlug( sOnFootOnly ).getValue( onFootOnly );
+ data[9] |= ( (onFootOnly ? 1 << 1 : 0 ) );
+
+ if( carOnly && onFootOnly )
+ {
+ MExt::DisplayError( "Static Camera: %s has onFootOnly and carOnly flags set!\n", fnNode.name().asChar() );
+ }
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ return locator;
+ }
+
+ return NULL;
+}
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/staticcameralocatornode.h b/tools/worldbuilder/code/nodes/staticcameralocatornode.h
new file mode 100644
index 0000000..88f0a64
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/staticcameralocatornode.h
@@ -0,0 +1,198 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: staticcameralocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 9/17/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef STATICCAMERALOCATORNODE_H
+#define STATICCAMERALOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+class StaticCam;
+class WBCamTarget;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK StaticCameraLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class StaticCameraLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ StaticCameraLocatorNode();
+ virtual ~StaticCameraLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& staticCameraLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* FOV_NAME_SHORT;
+ static const char* FOV_NAME_LONG;
+ static MObject sFOV;
+
+ static const char* TARGET_NAME_SHORT;
+ static const char* TARGET_NAME_LONG;
+ static MObject sTarget;
+
+ static const char* FACING_OFFSET_NAME_SHORT;
+ static const char* FACING_OFFSET_NAME_LONG;
+ static MObject sFacingOffset;
+
+ static const char* TRACKING_NAME_SHORT;
+ static const char* TRACKING_NAME_LONG;
+ static MObject sTracking;
+
+ static const char* TARGET_LAG_NAME_SHORT;
+ static const char* TARGET_LAG_NAME_LONG;
+ static MObject sTargetLag;
+
+ static const char* ACTIVE_NAME_SHORT;
+ static const char* ACTIVE_NAME_LONG;
+ static MObject sActive;
+
+ static const char* TRANSITION_TO_RATE_NAME_LONG;
+ static const char* TRANSITION_TO_RATE_NAME_SHORT;
+ static MObject sTransitionToRate;
+
+ static const char* ONESHOT_NAME_LONG;
+ static const char* ONESHOT_NAME_SHORT;
+ static MObject sOneShot;
+
+ static const char* NOFOV_NAME_LONG;
+ static const char* NOFOV_NAME_SHORT;
+ static MObject sNoFOV;
+
+ static const char* CUTALL_NAME_LONG;
+ static const char* CUTALL_NAME_SHORT;
+ static MObject sCutAll;
+
+ static const char* CAR_ONLY_NAME_LONG;
+ static const char* CAR_ONLY_NAME_SHORT;
+ static MObject sCarOnly;
+
+ static const char* ON_FOOT_ONLY_NAME_LONG;
+ static const char* ON_FOOT_ONLY_NAME_SHORT;
+ static MObject sOnFootOnly;
+
+ //MPxNode stuff...
+ StaticCam* GetStaticCam();
+ WBCamTarget* GetTarget();
+
+private:
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+
+ StaticCam* mStaticCam;
+ WBCamTarget* mCamTarget;
+
+ //Prevent wasteful constructor creation.
+ StaticCameraLocatorNode( const StaticCameraLocatorNode& staticcameralocatornode );
+ StaticCameraLocatorNode& operator=( const StaticCameraLocatorNode& staticcameralocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// StaticCameraLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void StaticCameraLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const StaticCameraLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::GetStaticCam
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: StaticCam
+//
+//=============================================================================
+inline StaticCam* StaticCameraLocatorNode::GetStaticCam()
+{
+ return mStaticCam;
+}
+
+//=============================================================================
+// StaticCameraLocatorNode::GetTarget
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: WBCamTarget
+//
+//=============================================================================
+inline WBCamTarget* StaticCameraLocatorNode::GetTarget()
+{
+ return mCamTarget;
+}
+
+#endif //STATICCAMERALOCATORNODE_H
diff --git a/tools/worldbuilder/code/nodes/triggertypes.h b/tools/worldbuilder/code/nodes/triggertypes.h
new file mode 100644
index 0000000..4393649
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/triggertypes.h
@@ -0,0 +1,10 @@
+#ifndef TRIGGER_TYPES
+#define TRIGGER_TYPES
+
+ enum TriggerType
+ {
+ SPHERE,
+ RECTANGLE
+ };
+
+#endif \ No newline at end of file
diff --git a/tools/worldbuilder/code/nodes/triggervolumenode.cpp b/tools/worldbuilder/code/nodes/triggervolumenode.cpp
new file mode 100644
index 0000000..6aa31dd
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/triggervolumenode.cpp
@@ -0,0 +1,435 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: TriggerVolumeNode.cpp
+//
+// Description: Implement TriggerVolumeNode
+//
+// History: 23/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include <windows.h>
+#include <GL/glu.h>
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/TriggerVolumeNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "utility/transformmatrix.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId TriggerVolumeNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::TriggerVolume );
+const char* TriggerVolumeNode::stringId = "TriggerVolumeNode";
+
+const int TriggerVolumeNode::ACTIVE_COLOUR = 15;
+const int TriggerVolumeNode::INACTIVE_COLOUR = 22;
+const float TriggerVolumeNode::SCALE = 1.0f * WBConstants::Scale;
+const float TriggerVolumeNode::LINE_WIDTH = 5.0f;
+
+const char* TriggerVolumeNode::LOCATOR_NAME_SHORT = "l";
+const char* TriggerVolumeNode::LOCATOR_NAME_LONG = "locator";
+MObject TriggerVolumeNode::sLocator;
+
+const char* TriggerVolumeNode::TYPE_NAME_SHORT = "typ";
+const char* TriggerVolumeNode::TYPE_NAME_LONG = "type";
+MObject TriggerVolumeNode::sType;
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// TriggerVolumeNode::TriggerVolumeNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+TriggerVolumeNode::TriggerVolumeNode() :
+ mType( SPHERE )
+{
+}
+
+//==============================================================================
+// TriggerVolumeNode::~TriggerVolumeNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+TriggerVolumeNode::~TriggerVolumeNode()
+{
+}
+
+//=============================================================================
+// TriggerVolumeNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* TriggerVolumeNode::creator()
+{
+ return new TriggerVolumeNode();
+}
+
+//=============================================================================
+// TriggerVolumeNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void TriggerVolumeNode::draw( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::TRIGGER_VOLUMES )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ // view.setDrawColor( INACTIVE_COLOUR, M3dView::kDormantColors );
+ // GLExt::drawLine( localOrigin, localPosNN );
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+
+ //Determine the type of trigger volume.
+ MFnDagNode fnDag( thisMObject() );
+
+ MStatus status;
+ MPlug typePlug = fnDag.findPlug( sType, &status );
+ assert( status );
+
+ int type;
+ typePlug.getValue( type );
+
+ //Test to see if there was a change.
+ if( (Type)type != mType )
+ {
+ //Hmm, changing trigger volume types...
+
+ if ( (Type)type == SPHERE )
+ {
+ //Becoming a sphere.
+ MObject transform;
+
+ transform = fnDag.parent( 0 );
+ assert( !transform.isNull() );
+
+ MFnDagNode fnTransDag( transform );
+
+ //Test the scaling factors. If one is larger than
+ //another, set them all to the same value.
+ MPlug scaleX, scaleY, scaleZ;
+ double x, y, z;
+
+ scaleX = fnTransDag.findPlug( MString("sx"), &status );
+ assert( status );
+ scaleX.getValue( x );
+ assert( status );
+
+ scaleY = fnTransDag.findPlug( MString("sy"), &status );
+ assert( status );
+ scaleY.getValue( y );
+ assert( status );
+
+ scaleZ = fnTransDag.findPlug( MString("sz"), &status );
+ assert( status );
+ scaleZ.getValue( z );
+ assert( status );
+
+ //which is larger?
+ double largest = 0;
+ if ( x > largest )
+ {
+ largest = x;
+ }
+ if ( y > largest )
+ {
+ largest = y;
+ }
+ if ( z > largest )
+ {
+ largest = z;
+ }
+
+ x = largest;
+ y = largest;
+ z = largest;
+
+ scaleX.setValue( x );
+ scaleY.setValue( y );
+ scaleZ.setValue( z );
+
+ mType = SPHERE;
+ }
+ else if ( (Type)type == RECTANGLE )
+ {
+ //Becoming a rectangle.
+
+ mType = RECTANGLE;
+ }
+ else
+ {
+ //Don't know what this is!
+ assert( false );
+ }
+ }
+ else
+ {
+ if ( mType == SPHERE )
+ {
+ MObject transform;
+
+ transform = fnDag.parent( 0 );
+ assert( !transform.isNull() );
+
+ MFnDagNode fnTransDag( transform );
+
+ //Test the scaling factors. If one is larger than
+ //another, set them all to the same value.
+ MPlug scaleX, scaleY, scaleZ;
+ double x;
+
+ scaleX = fnTransDag.findPlug( MString("sx"), &status );
+ assert( status );
+ scaleX.getValue( x );
+ assert( status );
+
+ scaleY = fnTransDag.findPlug( MString("sy"), &status );
+ assert( status );
+
+ scaleZ = fnTransDag.findPlug( MString("sz"), &status );
+ assert( status );
+
+ scaleY.setValue( x );
+ scaleZ.setValue( x );
+
+ GLExt::drawSphere( SCALE, 0,0,0, 5.0 );
+
+ }
+ else if ( mType == RECTANGLE )
+ {
+ MPoint p1( SCALE, SCALE, -SCALE );
+ MPoint p2( -SCALE, -SCALE, SCALE );
+
+ GLExt::drawBox( p1, p2, 5.0 );
+ }
+ else
+ {
+ assert( false );
+ }
+ }
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+
+//=============================================================================
+// TriggerVolumeNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus TriggerVolumeNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sLocator = msgAttr.create( LOCATOR_NAME_LONG, LOCATOR_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sLocator ) );
+
+ MFnEnumAttribute enumAttr;
+ //Default to a SPHERE!
+ sType = enumAttr.create( TYPE_NAME_LONG, TYPE_NAME_SHORT, 0, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( "sphere" ), SPHERE ) );
+ RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( "rectangle" ), RECTANGLE ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sType ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// TriggerVolumeNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void TriggerVolumeNode::postConstructor()
+{
+ //When my locator goes away, so do I.
+ setExistWithoutOutConnections( false );
+}
+
+//=============================================================================
+// TriggerVolumeNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& triggerVolumeNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* TriggerVolumeNode::Export( MObject& triggerVolumeNode )
+{
+ MFnDagNode fnNode( triggerVolumeNode );
+
+ if ( fnNode.typeId() == TriggerVolumeNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBTriggerVolumeChunk* trigger = new tlWBTriggerVolumeChunk;
+
+ trigger->SetName( fnNode.name().asChar() );
+
+ int type;
+ fnNode.findPlug( sType ).getValue( type );
+ trigger->SetType( type );
+
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( hmatrix );
+ //Make this p3d friendly...
+ hmatrix.element[3][0] /= WBConstants::Scale;
+ hmatrix.element[3][1] /= WBConstants::Scale;
+ hmatrix.element[3][2] /= WBConstants::Scale;
+
+ //This is the translation / rotation matrix
+ trigger->SetMatrix( hmatrix );
+
+ //This is the scale.
+ double scaleX, scaleY, scaleZ;
+ fnTransform.findPlug( MString( "sx" ) ).getValue( scaleX );
+ fnTransform.findPlug( MString( "sy" ) ).getValue( scaleY );
+ fnTransform.findPlug( MString( "sz" ) ).getValue( scaleZ );
+
+ trigger->SetScale( tlPoint( scaleX, scaleY, scaleZ ) );
+ return trigger;
+ }
+
+ return NULL;
+}
+
+//=============================================================================
+// TriggerVolumeNode::GetScaleAndMatrix
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& triggerVolumeNode, tlMatrix& mat, tlPoint& point)
+//
+// Return: void
+//
+//=============================================================================
+void TriggerVolumeNode::GetScaleAndMatrix( MObject& triggerVolumeNode, tlMatrix& mat, tlPoint& point)
+{
+ MFnDagNode fnNode( triggerVolumeNode );
+
+ if ( fnNode.typeId() == TriggerVolumeNode::id )
+ {
+ int type;
+ fnNode.findPlug( sType ).getValue( type );
+
+ MObject transform;
+ transform = fnNode.parent( 0 );
+ MFnTransform fnTransform( transform );
+
+ MDagPath dagPath;
+ MExt::FindDagNodeByName( &dagPath, fnTransform.name() );
+ TransformMatrix tm( dagPath );
+
+ tlMatrix hmatrix;
+ tm.GetHierarchyMatrixLHS( mat );
+ //Make this p3d friendly...
+ mat.element[3][0] /= WBConstants::Scale;
+ mat.element[3][1] /= WBConstants::Scale;
+ mat.element[3][2] /= WBConstants::Scale;
+
+ //This is the scale.
+ double scaleX, scaleY, scaleZ;
+ fnTransform.findPlug( MString( "sx" ) ).getValue( scaleX );
+ fnTransform.findPlug( MString( "sy" ) ).getValue( scaleY );
+ fnTransform.findPlug( MString( "sz" ) ).getValue( scaleZ );
+
+ point = tlPoint( scaleX, scaleY, scaleZ );
+ }
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/triggervolumenode.h b/tools/worldbuilder/code/nodes/triggervolumenode.h
new file mode 100644
index 0000000..b083af2
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/triggervolumenode.h
@@ -0,0 +1,86 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: triggervolumenode.h
+//
+// Description: Blahblahblah
+//
+// History: 23/05/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef TRIGGERVOLUMENODE_H
+#define TRIGGERVOLUMENODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class TriggerVolumeNode : public MPxLocatorNode
+{
+public:
+
+ enum Type
+ {
+ SPHERE,
+ RECTANGLE
+ };
+
+ TriggerVolumeNode();
+ virtual ~TriggerVolumeNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& triggerVolumeNode );
+ static void GetScaleAndMatrix( MObject& triggerVolumeNode, tlMatrix& mat, tlPoint& point);
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* LOCATOR_NAME_SHORT;
+ static const char* LOCATOR_NAME_LONG;
+ static MObject sLocator;
+
+ static const char* TYPE_NAME_SHORT;
+ static const char* TYPE_NAME_LONG;
+ static MObject sType;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+ static const float LINE_WIDTH;
+
+ Type mType;
+
+ //Prevent wasteful constructor creation.
+ TriggerVolumeNode( const TriggerVolumeNode& triggervolumenode );
+ TriggerVolumeNode& operator=( const TriggerVolumeNode& triggervolumenode );
+};
+
+
+#endif //TRIGGERVOLUMENODE_H
diff --git a/tools/worldbuilder/code/nodes/wbspline.cpp b/tools/worldbuilder/code/nodes/wbspline.cpp
new file mode 100644
index 0000000..d0673f7
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/wbspline.cpp
@@ -0,0 +1,109 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: WBSpline.cpp
+//
+// Description: Implement WBSpline
+//
+// History: 05/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/WBSpline.h"
+#include "nodes/triggervolumenode.h"
+#include "main/constants.h"
+
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+char WBSpline::sName[MAX_NAME_LEN];
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+void WBSpline::SetName( const char* name )
+{
+ strncpy( sName, name, MAX_NAME_LEN );
+}
+
+const char* const WBSpline::GetName()
+{
+ return sName;
+}
+
+//=============================================================================
+// WBSpline::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& obj )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* WBSpline::Export( MObject& obj )
+{
+ MStatus status;
+
+ MFnDagNode fnDagNode( obj );
+ MDagPath dagPath;
+ fnDagNode.getPath( dagPath );
+
+ MFnNurbsCurve fnNurbs( dagPath, &status );
+ assert( status );
+
+ if ( status )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBSplineChunk* spline = new tlWBSplineChunk;
+
+ spline->SetName( fnNurbs.name().asChar() );
+
+ int numCVs = fnNurbs.numCVs( &status );
+ assert( status );
+
+ MPointArray cvs;
+ fnNurbs.getCVs( cvs, MSpace::kWorld );
+
+ tlPoint* tlCVs = new tlPoint[numCVs];
+
+ int i;
+ for ( i = 0; i < numCVs; ++i )
+ {
+ tlCVs[i].x = cvs[i].x / WBConstants::Scale;
+ tlCVs[i].y = cvs[i].y / WBConstants::Scale;
+ tlCVs[i].z = -cvs[i].z / WBConstants::Scale;
+ }
+
+ spline->SetCVs( tlCVs, numCVs );
+ spline->SetNumCVs( numCVs );
+
+ delete[] tlCVs;
+
+ return spline;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/wbspline.h b/tools/worldbuilder/code/nodes/wbspline.h
new file mode 100644
index 0000000..87caf6d
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/wbspline.h
@@ -0,0 +1,54 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: wbspline.h
+//
+// Description: Blahblahblah
+//
+// History: 05/06/2002 + Created -- NAME
+//
+//=============================================================================
+
+#ifndef WBSPLINE_H
+#define WBSPLINE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "main/toolhack.h"
+
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+
+class WBSpline
+{
+public:
+ static tlDataChunk* Export( MObject& obj );
+
+ enum { MAX_NAME_LEN = 256 };
+
+ static void SetName( const char* name );
+ static const char* const GetName();
+ static char sName[MAX_NAME_LEN];
+
+private:
+ WBSpline();
+ virtual ~WBSpline();
+
+ //Prevent wasteful constructor creation.
+ WBSpline( const WBSpline& wbspline );
+ WBSpline& operator=( const WBSpline& wbspline );
+};
+
+
+#endif //WBSPLINE_H
diff --git a/tools/worldbuilder/code/nodes/zoneeventlocatornode.cpp b/tools/worldbuilder/code/nodes/zoneeventlocatornode.cpp
new file mode 100644
index 0000000..60d84d8
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/zoneeventlocatornode.cpp
@@ -0,0 +1,377 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: ZoneEventLocatorNode.cpp
+//
+// Description: Implement ZoneEventLocatorNode
+//
+// History: 18/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include "main/toolhack.h"
+#include <toollib.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include "nodes/ZoneEventLocatorNode.h"
+#include "main/constants.h"
+#include "main/worldbuilder.h"
+#include "utility/glext.h"
+#include "utility/mext.h"
+#include "utility/nodehelper.h"
+
+#include "nodes/triggervolumenode.h"
+
+#include "resources/resource.h"
+
+#include "../../../game/code/meta/locatorevents.h"
+#include "../../../game/code/meta/locatortypes.h"
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+MTypeId ZoneEventLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::ZoneEventLocator );
+const char* ZoneEventLocatorNode::stringId = "ZoneEventLocatorNode";
+
+const int ZoneEventLocatorNode::ACTIVE_COLOUR = 15;
+const int ZoneEventLocatorNode::INACTIVE_COLOUR = 12;
+const float ZoneEventLocatorNode::SCALE = 1.0f * WBConstants::Scale;
+
+const char* ZoneEventLocatorNode::TRIGGERS_NAME_SHORT = "trigs";
+const char* ZoneEventLocatorNode::TRIGGERS_NAME_LONG = "triggers";
+MObject ZoneEventLocatorNode::sTriggers;
+
+const char* ZoneEventLocatorNode::ZONE_NAME_SHORT = "z";
+const char* ZoneEventLocatorNode::ZONE_NAME_LONG = "zone";
+MObject ZoneEventLocatorNode::sZone;
+
+char ZoneEventLocatorNode::sNewName[MAX_NAME_LEN];
+char ZoneEventLocatorNode::sZoneName[MAX_NAME_LEN];
+
+//******************************************************************************
+//
+// Callbacks
+//
+//******************************************************************************
+
+BOOL CALLBACK ZoneEventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
+ SetDlgItemText( hWnd, IDC_EDIT3, "" );
+ return true;
+ }
+ break;
+ case WM_COMMAND:
+ {
+ if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
+ {
+ //Get the entry in the text field.
+ char name[ZoneEventLocatorNode::MAX_NAME_LEN];
+ GetDlgItemText( hWnd, IDC_EDIT1, name, ZoneEventLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a new name for the Zone Event Locator!");
+ return false;
+ }
+
+ MString newName( WorldBuilder::GetPrefix() );
+ newName += MString( name );
+
+ ZoneEventLocatorNode::SetNewName( newName.asChar() );
+
+ //Do the zone name too...
+ GetDlgItemText( hWnd, IDC_EDIT3, name, ZoneEventLocatorNode::MAX_NAME_LEN );
+
+ if ( strcmp(name, "") == 0 )
+ {
+ MExt::DisplayWarning("You must input a file name for the zone!");
+ return false;
+ }
+
+ ZoneEventLocatorNode::SetZoneName( name );
+
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+ else if( LOWORD(wParam) == IDCANCEL )
+ {
+ ZoneEventLocatorNode::SetNewName( "" );
+ ZoneEventLocatorNode::SetZoneName( "" );
+ EndDialog( hWnd, 0 ); //this is how you close the window.
+ return true;
+ }
+
+ return false;
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+}
+
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// ZoneEventLocatorNode::ZoneEventLocatorNode
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ZoneEventLocatorNode::ZoneEventLocatorNode()
+{
+}
+
+//==============================================================================
+// ZoneEventLocatorNode::~ZoneEventLocatorNode
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+ZoneEventLocatorNode::~ZoneEventLocatorNode()
+{
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::creator
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void* ZoneEventLocatorNode::creator()
+{
+ return new ZoneEventLocatorNode();
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::draw
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
+//
+// Return: void
+//
+//=============================================================================
+void ZoneEventLocatorNode::draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus )
+{
+ if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::ZONE_EVENT_LOCATORS )
+ {
+ view.beginGL();
+ glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
+
+ //When we are in render mode, we draw the lines between the nodes.
+ //If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
+ //with selection.
+ GLint value;
+ glGetIntegerv( GL_RENDER_MODE, &value );
+
+ //Draw things here we don't want selectable.
+ if ( (value == GL_RENDER) )
+ {
+ MPlugArray sources, targets;
+ MFnDagNode fnNode( thisMObject() );
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < targets.length(); ++i )
+ {
+ //Draw a box around the source trigger volume.
+ MPoint triggerWP, thisWP;
+ MExt::GetWorldPosition( &triggerWP, sources[i].node() );
+
+ MExt::GetWorldPosition( &thisWP, thisMObject() );
+
+ MPoint triggerLP;
+ triggerLP = triggerWP - thisWP;
+
+ view.setDrawColor( 8, M3dView::kActiveColors );
+
+ GLExt::drawLine( MPoint(0,0,0), triggerLP, 5.0f );
+ }
+ }
+
+ if ( displayStatus == M3dView::kDormant )
+ {
+ int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
+
+ view.setDrawColor( colour, M3dView::kDormantColors );
+ }
+ else
+ {
+ view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
+ }
+
+ //Draw a star to represent the locator.
+ GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
+ GLExt::drawPyramid( SCALE, 0,0,0, 5.0 );
+ GLExt::drawLBolt( SCALE, 0,1,0, 5.0 );
+
+ glPopAttrib();
+ view.endGL();
+ }
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::initialize
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: MStatus
+//
+//=============================================================================
+MStatus ZoneEventLocatorNode::initialize()
+{
+ MFnMessageAttribute msgAttr;
+ MStatus status;
+
+ sTriggers = msgAttr.create( TRIGGERS_NAME_LONG, TRIGGERS_NAME_SHORT, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( false ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setArray( true ) );
+ RETURN_STATUS_ON_FAILURE( msgAttr.setIndexMatters( false ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sTriggers ) );
+
+ MFnTypedAttribute typAttr;
+ sZone = typAttr.create( ZONE_NAME_LONG, ZONE_NAME_SHORT, MFnData::kString, MObject::kNullObj, &status );
+ RETURN_STATUS_ON_FAILURE( status );
+ RETURN_STATUS_ON_FAILURE( typAttr.setReadable( true ) );
+ RETURN_STATUS_ON_FAILURE( typAttr.setWritable( true ) );
+
+ RETURN_STATUS_ON_FAILURE( addAttribute( sZone ) );
+
+ return MStatus::kSuccess;
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::postConstructor
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void ZoneEventLocatorNode::postConstructor()
+{
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::Export
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& eventLocatorNode )
+//
+// Return: tlDataChunk
+//
+//=============================================================================
+tlDataChunk* ZoneEventLocatorNode::Export( MObject& zoneEventLocatorNode )
+{
+ MFnDagNode fnNode( zoneEventLocatorNode );
+
+ if ( fnNode.typeId() == ZoneEventLocatorNode::id )
+ {
+ //Create a tlDataChunk and return it filled with the appropriate data.
+ tlWBLocatorChunk* locator = new tlWBLocatorChunk;
+
+ locator->SetName( fnNode.name().asChar() );
+
+ locator->SetType( LocatorType::DYNAMIC_ZONE );
+
+ //The data here is the zone associated with this locator.
+ MString zone;
+ fnNode.findPlug( sZone ).getValue( zone );
+
+ unsigned int length = zone.length() / 4 + 1;
+
+ unsigned long* data;
+
+ data = new unsigned long[ length ];
+
+ memcpy( data, zone.asChar(), zone.length() );
+ ((char*)(data))[zone.length()] = '\0';
+
+ locator->SetDataElements( data, length );
+ locator->SetNumDataElements( length );
+
+ MPoint thisPosition;
+ MExt::GetWorldPosition( &thisPosition, zoneEventLocatorNode );
+
+ //Set the values.
+ tlPoint point;
+
+ point[0] = thisPosition[0] / WBConstants::Scale;
+ point[1] = thisPosition[1] / WBConstants::Scale;
+ point[2] = -thisPosition[2] / WBConstants::Scale; //Maya vs. P3D...
+ locator->SetPosition( point );
+
+ //Make the trigger volumes a sub-chunk of the locator...
+ MPlugArray sources, targets;
+ MPlug triggersPlug = fnNode.findPlug( sTriggers );
+ MExt::ResolveConnections( &sources, &targets, triggersPlug, true, false );
+
+ unsigned int i;
+ for ( i = 0; i < sources.length(); ++i )
+ {
+ tlDataChunk* trigger = TriggerVolumeNode::Export( sources[ i ].node() );
+ assert( trigger );
+
+ locator->AppendSubChunk( trigger );
+ }
+
+ locator->SetNumTriggers( i );
+
+ delete data;
+
+ return locator;
+ }
+
+ return NULL;
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
diff --git a/tools/worldbuilder/code/nodes/zoneeventlocatornode.h b/tools/worldbuilder/code/nodes/zoneeventlocatornode.h
new file mode 100644
index 0000000..7f25565
--- /dev/null
+++ b/tools/worldbuilder/code/nodes/zoneeventlocatornode.h
@@ -0,0 +1,151 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File: zoneeventlocatornode.h
+//
+// Description: Blahblahblah
+//
+// History: 18/06/2002 + Created -- Cary Brisebois
+//
+//=============================================================================
+
+#ifndef ZONEEVENTLOCATORNODE_H
+#define ZONEEVENTLOCATORNODE_H
+
+//========================================
+// Nested Includes
+//========================================
+#include "precompiled/PCH.h"
+
+//========================================
+// Forward References
+//========================================
+class tlDataChunk;
+
+//=============================================================================
+//
+// Synopsis: Blahblahblah
+//
+//=============================================================================
+BOOL CALLBACK ZoneEventLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam );
+
+class ZoneEventLocatorNode : public MPxLocatorNode
+{
+public:
+ enum { MAX_NAME_LEN = 256 };
+
+ ZoneEventLocatorNode();
+ virtual ~ZoneEventLocatorNode();
+
+ static void* creator();
+
+ virtual void draw( M3dView& view,
+ const MDagPath& path,
+ M3dView::DisplayStyle displayStyle,
+ M3dView::DisplayStatus displayStatus
+ );
+ static MStatus initialize();
+ virtual void postConstructor();
+
+ //This is how you export one of these.
+ static tlDataChunk* Export( MObject& eventLocatorNode );
+
+ static void SetNewName( const char* name );
+ static const char* const GetNewName();
+ static void SetZoneName( const char* name );
+ static const char* const GetZoneName();
+
+ static MTypeId id;
+ static const char* stringId;
+
+ static const char* TRIGGERS_NAME_SHORT;
+ static const char* TRIGGERS_NAME_LONG;
+ static MObject sTriggers;
+
+ static const char* ZONE_NAME_SHORT;
+ static const char* ZONE_NAME_LONG;
+ static MObject sZone;
+
+private:
+
+ static const int ACTIVE_COLOUR;
+ static const int INACTIVE_COLOUR;
+ static const float SCALE;
+
+ static char sNewName[MAX_NAME_LEN];
+ static char sZoneName[MAX_NAME_LEN];
+
+ //Prevent wasteful constructor creation.
+ ZoneEventLocatorNode( const ZoneEventLocatorNode& zoneeventlocatornode );
+ ZoneEventLocatorNode& operator=( const ZoneEventLocatorNode& zoneeventlocatornode );
+};
+
+//******************************************************************************
+//
+// Inline Public Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// ZoneEventLocatorNode::SetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ZoneEventLocatorNode::SetNewName( const char* name )
+{
+ strncpy( sNewName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::GetNewName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ZoneEventLocatorNode::GetNewName()
+{
+ return sNewName;
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::SetZoneName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( const char* name )
+//
+// Return: void
+//
+//=============================================================================
+inline void ZoneEventLocatorNode::SetZoneName( const char* name )
+{
+ strncpy( sZoneName, name, MAX_NAME_LEN);
+}
+
+//=============================================================================
+// ZoneEventLocatorNode::GetZoneName
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: const char* const
+//
+//=============================================================================
+inline const char* const ZoneEventLocatorNode::GetZoneName()
+{
+ return sZoneName;
+}
+
+
+
+#endif //ZONEEVENTLOCATORNODE_H
diff --git a/tools/worldbuilder/code/precompiled/PCH.cpp b/tools/worldbuilder/code/precompiled/PCH.cpp
new file mode 100644
index 0000000..5f77b4a
--- /dev/null
+++ b/tools/worldbuilder/code/precompiled/PCH.cpp
@@ -0,0 +1 @@
+#include "PCH.h" \ No newline at end of file
diff --git a/tools/worldbuilder/code/precompiled/PCH.h b/tools/worldbuilder/code/precompiled/PCH.h
new file mode 100644
index 0000000..e643056
--- /dev/null
+++ b/tools/worldbuilder/code/precompiled/PCH.h
@@ -0,0 +1,52 @@
+#include <maya/M3dView.h>
+#include <maya/MArgList.h>
+#include <maya/MCursor.h>
+#include <maya/MDagPath.h>
+#include <maya/MDGMessage.h>
+#include <maya/MDGModifier.h>
+#include <maya/MDoubleArray.h>
+#include <maya/MEulerRotation.h>
+#include <maya/MFnCamera.h>
+#include <maya/MFnData.h>
+#include <maya/MFnDagNode.h>
+#include <maya/MFnDependencyNode.h>
+#include <maya/MFnDoubleArrayData.h>
+#include <maya/MFnEnumAttribute.h>
+#include <maya/MFnIkJoint.h>
+#include <maya/MFnIntArrayData.h>
+#include <maya/MFnMatrixData.h>
+#include <maya/MFnMesh.h>
+#include <maya/MFnMessageAttribute.h>
+#include <maya/MFnNumericAttribute.h>
+#include <maya/MFnNurbsCurve.h>
+#include <maya/MFnStringArrayData.h>
+#include <maya/MFnTransform.h>
+#include <maya/MFnTypedAttribute.h>
+#include <maya/MGlobal.h>
+#include <maya/MIntArray.h>
+#include <maya/MItDag.h>
+#include <maya/MItMeshVertex.h>
+#include <maya/MItSelectionList.h>
+#include <maya/MMatrix.h>
+#include <maya/MNodeMessage.h>
+#include <maya/MObject.h>
+#include <maya/MObjectArray.h>
+#include <maya/MPlug.h>
+#include <maya/MPlugArray.h>
+#include <maya/MPoint.h>
+#include <maya/MPointArray.h>
+#include <maya/MPxCommand.h>
+#include <maya/MPxContext.h>
+#include <maya/MPxContextCommand.h>
+#include <maya/MPxLocatorNode.h>
+#include <maya/MQuaternion.h>
+#include <maya/MSelectionList.h>
+#include <maya/MStatus.h>
+#include <maya/MString.h>
+#include <maya/MStringArray.h>
+#include <maya/MTransformationMatrix.h>
+#include <maya/MTypeId.h>
+#include <maya/MUiMessage.h>
+#include <maya/MVector.h>
+
+#include <assert.h> \ No newline at end of file
diff --git a/tools/worldbuilder/code/resources/icon1.ico b/tools/worldbuilder/code/resources/icon1.ico
new file mode 100644
index 0000000..8ba9328
--- /dev/null
+++ b/tools/worldbuilder/code/resources/icon1.ico
Binary files differ
diff --git a/tools/worldbuilder/code/resources/resource.aps b/tools/worldbuilder/code/resources/resource.aps
new file mode 100644
index 0000000..12d3e81
--- /dev/null
+++ b/tools/worldbuilder/code/resources/resource.aps
Binary files differ
diff --git a/tools/worldbuilder/code/resources/resource.h b/tools/worldbuilder/code/resources/resource.h
new file mode 100644
index 0000000..e6ac7fe
--- /dev/null
+++ b/tools/worldbuilder/code/resources/resource.h
@@ -0,0 +1,28 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by resource.rc
+//
+#define IDD_DIALOG1 101
+#define IDR_ACCELERATOR1 102
+#define IDD_DIALOG2 103
+#define IDD_DIALOG3 104
+#define IDD_DIALOG4 105
+#define IDD_DIALOG5 106
+#define IDI_ICON1 107
+#define IDC_EDIT1 1000
+#define IDC_BUTTON1 1001
+#define IDC_EDIT3 1002
+#define IDC_EDIT2 1007
+#define IDC_COMBO1 1010
+#define IDC_COMBO2 1012
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 109
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1013
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/tools/worldbuilder/code/resources/resource.rc b/tools/worldbuilder/code/resources/resource.rc
new file mode 100644
index 0000000..d256bfb
--- /dev/null
+++ b/tools/worldbuilder/code/resources/resource.rc
@@ -0,0 +1,318 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (Canada) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 95
+STYLE DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Forced Object Naming Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+ EDITTEXT IDC_EDIT1,63,30,113,12,ES_AUTOHSCROLL
+ CTEXT "Object Name",IDC_STATIC,34,14,116,11,SS_CENTERIMAGE
+ PUSHBUTTON "Done",IDC_BUTTON1,66,63,50,14
+ EDITTEXT IDC_EDIT2,10,30,52,12,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_READONLY | NOT WS_TABSTOP
+END
+
+IDD_DIALOG2 DIALOG DISCARDABLE 0, 0, 186, 82
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Prefix"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CTEXT "Set Prefix",IDC_STATIC,36,15,114,8,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT1,36,31,114,14,ES_AUTOHSCROLL
+ PUSHBUTTON "Done",IDC_BUTTON1,63,53,61,14
+END
+
+IDD_DIALOG3 DIALOG DISCARDABLE 0, 0, 186, 95
+STYLE DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Forced Zone Naming Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+ EDITTEXT IDC_EDIT1,63,30,113,12,ES_AUTOHSCROLL
+ EDITTEXT IDC_EDIT3,65,49,112,12,ES_AUTOHSCROLL
+ PUSHBUTTON "Done",IDC_BUTTON1,66,68,50,14
+ CTEXT "Object Name",IDC_STATIC,66,14,111,11,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT2,10,30,52,12,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_READONLY | NOT WS_TABSTOP
+ LTEXT "P3D File to Load",IDC_STATIC,10,49,56,12,SS_CENTERIMAGE
+END
+
+IDD_DIALOG4 DIALOG DISCARDABLE 0, 0, 186, 111
+STYLE DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Action Trigger"
+FONT 8, "MS Sans Serif"
+BEGIN
+ EDITTEXT IDC_EDIT1,63,30,113,12,ES_AUTOHSCROLL
+ COMBOBOX IDC_COMBO1,63,49,114,30,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_COMBO2,63,67,113,30,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Done",IDC_BUTTON1,66,87,50,14
+ CTEXT "Object Name",IDC_STATIC,66,14,111,11,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT2,10,30,52,12,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_READONLY | NOT WS_TABSTOP
+ CTEXT "Object",IDC_STATIC,10,49,53,12,SS_CENTERIMAGE
+ CTEXT "Joint",IDC_STATIC,10,67,53,12,SS_CENTERIMAGE
+END
+
+IDD_DIALOG5 DIALOG DISCARDABLE 0, 0, 186, 95
+STYLE DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Forced Script Naming Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+ EDITTEXT IDC_EDIT1,63,30,113,12,ES_AUTOHSCROLL
+ EDITTEXT IDC_EDIT3,63,49,114,12,ES_AUTOHSCROLL
+ PUSHBUTTON "Done",IDC_BUTTON1,66,68,50,14
+ CTEXT "Object Name",IDC_STATIC,66,14,111,11,SS_CENTERIMAGE
+ EDITTEXT IDC_EDIT2,10,30,52,12,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_READONLY | NOT WS_TABSTOP
+ CTEXT "Script Name",IDC_STATIC,10,49,53,12,SS_CENTERIMAGE
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+ IDD_DIALOG1, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 179
+ VERTGUIDE, 10
+ VERTGUIDE, 176
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 88
+ HORZGUIDE, 30
+ HORZGUIDE, 42
+ END
+
+ IDD_DIALOG2, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 179
+ VERTGUIDE, 36
+ VERTGUIDE, 93
+ VERTGUIDE, 150
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 75
+ HORZGUIDE, 38
+ END
+
+ IDD_DIALOG3, DIALOG
+ BEGIN
+ LEFTMARGIN, 10
+ RIGHTMARGIN, 179
+ VERTGUIDE, 65
+ VERTGUIDE, 66
+ VERTGUIDE, 176
+ VERTGUIDE, 177
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 88
+ HORZGUIDE, 30
+ HORZGUIDE, 42
+ HORZGUIDE, 49
+ HORZGUIDE, 61
+ END
+
+ IDD_DIALOG4, DIALOG
+ BEGIN
+ LEFTMARGIN, 10
+ RIGHTMARGIN, 179
+ VERTGUIDE, 63
+ VERTGUIDE, 66
+ VERTGUIDE, 176
+ VERTGUIDE, 177
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 104
+ HORZGUIDE, 30
+ HORZGUIDE, 42
+ HORZGUIDE, 49
+ HORZGUIDE, 61
+ END
+
+ IDD_DIALOG5, DIALOG
+ BEGIN
+ LEFTMARGIN, 10
+ RIGHTMARGIN, 179
+ VERTGUIDE, 63
+ VERTGUIDE, 66
+ VERTGUIDE, 176
+ VERTGUIDE, 177
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 88
+ HORZGUIDE, 30
+ HORZGUIDE, 42
+ HORZGUIDE, 49
+ HORZGUIDE, 61
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "100904b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "Radical Entertainment\0"
+ VALUE "FileDescription", "worldbuilder\0"
+ VALUE "FileVersion", "1, 0, 0, 1\0"
+ VALUE "InternalName", "worldbuilder\0"
+ VALUE "LegalCopyright", "Copyright © 2002\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "worldbuilder.mll\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "Radical Entertainment worldbuilder\0"
+ VALUE "ProductVersion", "1, 0, 0, 1\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x1009, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE
+BEGIN
+ VK_ESCAPE, IDCANCEL, VIRTKEY, NOINVERT
+ VK_RETURN, IDOK, VIRTKEY, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1 ICON DISCARDABLE "icon1.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_DIALOG4 DLGINIT
+BEGIN
+ IDC_COMBO1, 0x403, 2, 0
+0x0031,
+ IDC_COMBO1, 0x403, 2, 0
+0x0032,
+ IDC_COMBO1, 0x403, 2, 0
+0x0033,
+ IDC_COMBO1, 0x403, 2, 0
+0x0034,
+ IDC_COMBO1, 0x403, 2, 0
+0x0035,
+ IDC_COMBO1, 0x403, 2, 0
+0x0036,
+ IDC_COMBO1, 0x403, 2, 0
+0x0037,
+ IDC_COMBO1, 0x403, 2, 0
+0x0038,
+ IDC_COMBO1, 0x403, 2, 0
+0x0039,
+ IDC_COMBO1, 0x403, 2, 0
+0x0030,
+ 0
+END
+
+#endif // English (Canada) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/tools/worldbuilder/code/scripts/wb_cleanup.mel b/tools/worldbuilder/code/scripts/wb_cleanup.mel
new file mode 100644
index 0000000..1b2f42c
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_cleanup.mel
@@ -0,0 +1,11 @@
+
+if ( `menu -exists wb_MainMenu` )
+{
+ deleteUI wb_MainMenu;
+ deleteShelfTab ("WorldBuilder");
+
+ wb_SplinesCleanup();
+ wb_CoinSplinesCleanup();
+
+ flushUndo;
+}
diff --git a/tools/worldbuilder/code/scripts/wb_coinsplines.mel b/tools/worldbuilder/code/scripts/wb_coinsplines.mel
new file mode 100644
index 0000000..750eb3e
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_coinsplines.mel
@@ -0,0 +1,53 @@
+global int $gCoinSplineCompleteCB = -1;
+
+global proc wb_MCB_CreateCoinPath()
+{
+ global int $gCoinSplineCompleteCB;
+
+ if ( !`contextInfo -exists CoinSplineCtx` )
+ {
+ curveCVCtx -degree 3 -me true -un true CoinSplineCtx;
+ print "create\n";
+ }
+ else
+ {
+ string $currentCtx = `currentCtx`;
+
+ if ( $currentCtx == "CoinSplineCtx" )
+ {
+ print "complete\n";
+ ctxCompletion;
+
+ wb_CB_CoinSplineComplete();
+ }
+ }
+
+ print "select\n";
+ setToolTo CoinSplineCtx;
+
+ $gCoinSplineCompleteCB = `scriptJob -ro 1 -p "WorldBuilder" -e "ToolChanged" wb_CB_CoinSplineComplete`;
+}
+
+global proc wb_CB_CoinSplineComplete()
+{
+ print "complete callback\n";
+ WB_CoinSplineComplete();
+}
+
+global proc wb_CoinSplinesCleanup()
+{
+ print "clean\n";
+ global int $gCoinSplineCompleteCB;
+
+ if ( $gCoinSplineCompleteCB != -1 )
+ {
+ scriptJob -k $gCoinSplineCompleteCB;
+ print "kill job\n";
+ }
+
+ if ( `contextInfo -exists CoinSplineCtx` )
+ {
+ print "delete ui\n";
+ deleteUI -tc CoinSplineCtx;
+ }
+}
diff --git a/tools/worldbuilder/code/scripts/wb_locator.mel b/tools/worldbuilder/code/scripts/wb_locator.mel
new file mode 100644
index 0000000..0b46abb
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_locator.mel
@@ -0,0 +1,71 @@
+global float $gWB_Offset = 0;
+
+global proc wb_BCB_CreateLocator( string $type )
+{
+ //Start the Locator context...
+ if ( ! `contextInfo -exists LocatorCtx` )
+ {
+ LocatorContext LocatorCtx;
+ }
+
+ WB_SetLocatorType($type);
+
+ setToolTo LocatorCtx;
+}
+
+global proc wb_MCB_SnapLocatorOptions()
+{
+ global float $gWB_Offset;
+
+ if ( `window -exists wb_OptionWindow` ) deleteUI wb_OptionWindow;
+
+ window -title "Snap Locator Options" wb_OptionWindow;
+
+ columnLayout;
+
+ rowLayout -nc 2;
+
+ text -label "Offset (M):";
+
+ floatField -min -10.0 -max 10.0 -value $gWB_Offset -cc ("$gWB_Offset = #1");
+
+ setParent ..;
+
+ button -label "snap locator" -command "WB_SnapLocator( $gWB_Offset )";
+
+ setParent ..;
+
+ showWindow;
+}
+
+global proc wb_BCB_AttachTriggers( string $name, int $isVisibler )
+{
+ global int $gIsItVisibler;
+
+ $gIsItVisibler = $isVisibler;
+
+ //Start the Trigger context...
+ if ( ! `contextInfo -exists TriggerCtx` )
+ {
+ TriggerContext TriggerCtx;
+ }
+
+ select $name;
+
+ WB_SelectObject( $name );
+
+ setToolTo TriggerCtx;
+}
+
+global proc wb_LocatorCleanup()
+{
+ if ( `contextInfo -exists LocatorCtx` )
+ {
+ deleteUI -tc LocatorCtx;
+ }
+
+ if ( `contextInfo -exists TriggerCtx` )
+ {
+ deleteUI -tc TriggerCtx;
+ }
+} \ No newline at end of file
diff --git a/tools/worldbuilder/code/scripts/wb_main.mel b/tools/worldbuilder/code/scripts/wb_main.mel
new file mode 100644
index 0000000..8106946
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_main.mel
@@ -0,0 +1,274 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
+//
+// WB_main.mel
+//
+// Description: Installs the World Builder (WB) interface.
+// As a convention all World Builder global procedures
+// and global variables are prefixed with "wb_". All commands
+// exposed through WB plugins are prefixed with "WB_".
+//
+// MCB = Menu Call Back
+// BCB = Button Call Back
+//
+// Modification History:
+// + Created Apr 11, 2001 -- bkusy
+// + Stolen & Adapted -- CBrisebois
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// w b _ b r e a k p o i n t
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_breakpoint( string $tag )
+{
+ confirmDialog -m ( "BreakPoint: " + $tag );
+}
+
+//-----------------------------------------------------------------------------
+// w b _ M C B _ A b o u t
+//
+// Synopsis: Display an About World Builder window.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_MCB_About()
+{
+ string $pluginVersion = "2.0";
+
+ string $message = ( "\nSimpsons Road Rage World Builder.\n\n" +
+ "Release " + $pluginVersion + "\n" +
+ "(c) 2001, Radical Entertainment, Ltd.\n\n" );
+
+
+ confirmDialog -title "About World Builder"
+ -message $message
+ -button "OK"
+ -defaultButton "OK";
+}
+
+//-----------------------------------------------------------------------------
+// w b _ d o M a i n M e n u I w b m s
+//
+// Synopsis: Creates the WB menu on the menu handle passed in.
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_doMainMenuItems( string $menu )
+{
+ global string $gMainWindow;
+ global float $gWB_Offset;
+
+ menu -edit -tearOff true -allowOptionBoxes true $menu;
+
+ menuItem -label "Display Levels" -sm true;
+
+ menuItem -label "Event Locators" -checkBox true -command "WB_ChangeDisplay(0, #1)";
+
+ menuItem -label "Script Locators" -checkBox true -command "WB_ChangeDisplay(1, #1)";
+
+ menuItem -label "Generic Locators" -checkBox true -command "WB_ChangeDisplay(2, #1)";
+
+ menuItem -label "Car Start Locators" -checkBox true -command "WB_ChangeDisplay(3, #1)";
+
+ menuItem -label "Dynamic Zone Locators" -checkBox true -command "WB_ChangeDisplay(4, #1)";
+
+ menuItem -label "Occlusion Locators" -checkBox true -command "WB_ChangeDisplay(5, #1)";
+
+ menuItem -label "Interior Entrance Locators" -checkBox true -command "WB_ChangeDisplay(7, #1)";
+
+ menuItem -label "Directional Locators" -checkBox true -command "WB_ChangeDisplay(8, #1)";
+
+ menuItem -label "Action Locators" -checkBox true -command "WB_ChangeDisplay(9, #1)";
+
+ menuItem -label "FOV" -checkBox true -command "WB_ChangeDisplay(10, #1)";
+
+ menuItem -label "Breakable Camera" -checkBox true -command "WB_ChangeDisplay(11, #1)";
+
+ menuItem -label "Static Camera" -checkBox true -command "WB_ChangeDisplay(12, #1)";
+
+ menuItem -label "Ped Group" -checkBox true -command "WB_ChangeDisplay(13, #1)";
+
+ menuItem -divider true;
+
+ menuItem -label "Trigger Volumes" -checkBox true -command "WB_ChangeDisplay(20, #1)";
+
+ setParent -menu ..;
+
+ menuItem -divider true;
+
+ menuItem -label "Create Camera Path" -command "wb_MCB_CreateCameraPath()";
+
+ menuItem -label "Create Coin Path" -command "wb_MCB_CreateCoinPath()";
+
+ menuItem -divider true;
+
+ menuItem -label "Set Prefix" -command "WB_SetPrefix()";
+
+ menuItem -divider true;
+
+ menuItem -label "Snap Locator" -command "WB_SnapLocator( $gWB_Offset )";
+
+ menuItem -optionBox true -command "wb_MCB_SnapLocatorOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "Export" -command "WB_Export()";
+
+ menuItem -optionBox true -command "WB_ExportOptions()";
+
+ menuItem -divider true;
+
+ menuItem -label "About" -command "wb_MCB_About()";
+
+ setParent -m ..;
+
+ if ( `shelfLayout -exists "WorldBuilder"` == 0 )
+ {
+ addNewShelfTab "WorldBuilder";
+ }
+
+ //Delete all the old buttons (in case there was a change)..
+ string $buttons[] = `shelfLayout -q -ca WorldBuilder`;
+
+ int $i;
+
+ for ( $i = 0; $i < size($buttons); $i++ )
+ {
+ deleteUI $buttons[ $i ];
+ }
+
+ //Create all the buttons required..
+ shelfButton -c ("wb_BCB_CreateLocator(\"Event\")")
+ -p "WorldBuilder"
+ -i1 "eventlocator.bmp"
+ -ann "Create Event Locator"
+ -l "Event";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Script\")")
+ -p "WorldBuilder"
+ -i1 "scriptlocator.bmp"
+ -ann "Create Script Locator"
+ -l "Script";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Generic\")")
+ -p "WorldBuilder"
+ -i1 "genericlocator.bmp"
+ -ann "Create Generic Locator"
+ -l "Generic";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Car Start\")")
+ -p "WorldBuilder"
+ -i1 "carstartlocator.bmp"
+ -ann "Create Car Start Locator"
+ -l "Car Start";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Dynamic Zone\")")
+ -p "WorldBuilder"
+ -i1 "zonelocator.bmp"
+ -ann "Create Dynamic Zone Locator"
+ -l "Dynamic Zone";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Occlusion\")")
+ -p "WorldBuilder"
+ -i1 "occlusionlocator.bmp"
+ -ann "Create Occlusion Locator"
+ -l "Occlusion";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Interior Entrance\")")
+ -p "WorldBuilder"
+ -i1 "interiorlocator.bmp"
+ -ann "Create Interior Entrance Locator"
+ -l "Interior Entrance";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Directional\")")
+ -p "WorldBuilder"
+ -i1 "directionallocator.bmp"
+ -ann "Create Directional Locator"
+ -l "Directional";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Action\")")
+ -p "WorldBuilder"
+ -i1 "actionlocator.bmp"
+ -ann "Create Action Locator"
+ -l "Action";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"FOV\")")
+ -p "WorldBuilder"
+ -i1 "fovlocator.bmp"
+ -ann "Create FOV Locator"
+ -l "FOV";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Breakable Camera\")")
+ -p "WorldBuilder"
+ -i1 "breakablecameralocator.bmp"
+ -ann "Create Breakable Camera Locator"
+ -l "Breakable Camera";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Static Camera\")")
+ -p "WorldBuilder"
+ -i1 "staticcameralocator.bmp"
+ -ann "Create Static Camera Locator"
+ -l "Static Camera";
+
+ shelfButton -c ("wb_BCB_CreateLocator(\"Ped Group\")")
+ -p "WorldBuilder"
+ -i1 "pedgrouplocator.bmp"
+ -ann "Create Ped Group Locator"
+ -l "Ped Group";
+
+}
+
+
+//-----------------------------------------------------------------------------
+// w b _ I n s t a l l U I
+//
+// Synopsis:
+//
+// Parameters: NONE
+//
+// Returns: NOTHING
+//
+// Constraints: NONE
+//
+//-----------------------------------------------------------------------------
+global proc wb_InstallUI()
+{
+
+ global string $gMainWindow;
+
+ //
+ // Install WB menu as a root menu.
+ //
+ if ( `menu -exists wb_MainMenu` ) deleteUI wb_MainMenu;
+ menu -label "World Builder" -allowOptionBoxes true -parent $gMainWindow wb_MainMenu;
+
+ wb_doMainMenuItems "wb_MainMenu";
+}
+
+evalDeferred "wb_InstallUI";
+
+source "wb_setup.mel";
+source "wb_locator.mel";
+source "wb_splines.mel";
+source "wb_coinsplines.mel";
+source "AEWBTriggerButton.mel";
+source "AEWBSelectTarget.mel"; \ No newline at end of file
diff --git a/tools/worldbuilder/code/scripts/wb_setup.mel b/tools/worldbuilder/code/scripts/wb_setup.mel
new file mode 100644
index 0000000..9211390
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_setup.mel
@@ -0,0 +1,6 @@
+//Create the WorldBuilderNode.
+
+
+global proc wb_Create_WorldBuilderNode()
+{
+} \ No newline at end of file
diff --git a/tools/worldbuilder/code/scripts/wb_splines.mel b/tools/worldbuilder/code/scripts/wb_splines.mel
new file mode 100644
index 0000000..ab99858
--- /dev/null
+++ b/tools/worldbuilder/code/scripts/wb_splines.mel
@@ -0,0 +1,46 @@
+global int $gSplineCompleteCB = -1;
+
+global proc wb_MCB_CreateCameraPath()
+{
+ global int $gSplineCompleteCB;
+
+ if ( !`contextInfo -exists CameraSplineCtx` )
+ {
+ curveCVCtx -degree 3 -me false -un true CameraSplineCtx;
+ }
+ else
+ {
+ string $currentCtx = `currentCtx`;
+
+ if ( $currentCtx == "CameraSplineCtx" )
+ {
+ ctxCompletion;
+
+ wb_CB_SplineComplete();
+ }
+ }
+
+ setToolTo CameraSplineCtx;
+
+ $gSplineCompleteCB = `scriptJob -ro 1 -p "WorldBuilder" -e "ToolChanged" wb_CB_SplineComplete`;
+}
+
+global proc wb_CB_SplineComplete()
+{
+ WB_SplineComplete();
+}
+
+global proc wb_SplinesCleanup()
+{
+ global int $gSplineCompleteCB;
+
+ if ( $gSplineCompleteCB != -1 )
+ {
+ scriptJob -k $gSplineCompleteCB;
+ }
+
+ if ( `contextInfo -exists CameraSplineCtx` )
+ {
+ deleteUI -tc CameraSplineCtx;
+ }
+}
diff --git a/tools/xboxsync/XboxSync.exe b/tools/xboxsync/XboxSync.exe
new file mode 100644
index 0000000..af39518
--- /dev/null
+++ b/tools/xboxsync/XboxSync.exe
Binary files differ