JurassicParkTrespasser/jp2_pc/Tools/MAXScript/VPlace.ms
2018-01-01 23:07:24 +01:00

270 lines
7.2 KiB
Plaintext

--**********************************************************************************************
-- *
-- * Copyright © DreamWorks Interactive, 1997
-- *
-- * Contents:
-- * Implementation of VPlace.ms
-- *
-- * Bugs:
-- *
-- * To do:
-- *
-- * Notes:
-- * VPlace places selected vertices of an object at a certain height
-- * this height is eithere determined to be the top or bottom limit of a
-- * picked object, or it is determined from user input via a spinner control.
-- * Road Support Added too (6/6).
-- **********************************************************************************************
Utility VPlace "V-Place with Roads"
(
local SnapObject, NewHeight, SnapTop, SnapBottom, tapeobj, terrainobj, road, loftspline;
group "V-Place Basic Options"
(
Spinner SpinHeight "" range:[0,1000,0] type:#float fieldwidth:50 offset:[3,0]
checkbutton UseSpinHeight "Lock Height:" offset:[-31,-22]
pickbutton GetSnapObject "Pick Snap Object" width:140
label snapOptionslabel "Snap Object Options:" align:#left
radiobuttons HeightKeys labels:#("Top of Mesh","Bottom of Mesh", "Center of Mesh", "Mesh Pivot Point", "Avg Vert Selection Height") default:2 align:#left
label SnapObjLabel "" align:#left
label ht "" align:#left
label vp "" align:#left
pickbutton PickObject "Pick Terrain" width:135
)
group "V-Place Conform Tools"
(
label splineLabel "Conform this Spline:" align:#left
pickbutton ChooseSpline "-" width:105 offset:[-17,0]
Spinner SplineResolution "" range:[0,1,0] type:#integer fieldwidth:25 offset:[4,-24]
label terrainlabel "Conform this Mesh:" align:#left
pickbutton ChooseTerrain "-" width:110 offset:[-15,0]
checkbutton conformSelected "Sel" offset:[57,-26]
label roadlabel "To this Mesh:" align:#left
pickbutton chooseRoad "-" width:140
label blank ""
button ConformSpline "Conform Spline" width:140
button pave "Conform Mesh" width:140
)
on UseSpinHeight changed state do
if state == on then
(
GetSnapObject.enabled = false
NewHeight = SpinHeight.value
ht.text = ("Height set at: " + NewHeight as string + "M")
SnapObjLabel.text = ("Snap Object: none")
SpinHeight.enabled = false
HeightKeys.enabled = false
) else (
GetSnapObject.enabled = true
SpinHeight.enabled = true
HeightKeys.enabled = true
)
on SpinHeight changed state do
(
NewHeight = SpinHeight.value
ht.text = ("Height set at: " + NewHeight as string + "M")
SnapObjLabel.text = ("Snap Object: none")
)
on ChooseSpline picked obj do
(
loftSpline = obj
ConvertToSplineShape loftspline
if classof loftspline != splineshape then
(
messageBox "You must pick a collapsed spline object"
loftSpline = undefined
ChooseSpline.text = "Choose Spline"
) else (
ChooseSpline.text = loftSpline.name
)
)
on GetSnapObject picked Obj do
(
SnapObject = obj
SnapObjLabel.text = ("Snap Object: " + SnapObject.name)
SnapTop = (SnapObject.max).z
SnapBottom = (SnapObject.min).z
SnapCenter = (SnapObject.center).z
SnapPivot = (SnapObject.pivot).z
if HeightKeys.state == 1 do (NewHeight = SnapTop)
if HeightKeys.state == 2 do (NewHeight = SnapBottom)
if HeightKeys.state == 3 do (NewHeight = SnapCenter)
if HeightKeys.state == 4 do (NewHeight = SnapPivot)
ht.text = ("Height set at: " + NewHeight as string + "M")
vp.text = ""
)
on PickObject picked obj do
(
undo on
(
Terrain = obj
ConvertToMesh Terrain
VertSel = (getvertselection Terrain)
vc = VertSel.count
if vc == 0 do (MessageBox "No Vertices Scelected")
if UseSpinHeight.checked == true do
(
NewHeight = SpinHeight.value
SnapObjLabel.text = ("Snap Object: ignored")
)
if UseSpinHeight.checked == false do (if NewHeight == undefined do (NewHeight = -1.0))
ht.text = "Height set at: " + NewHeight as string
if HeightKeys.state == 5 do
(
TotalHeight = 0.0
for i = 1 to vc do
TotalHeight = (getvert Terrain VertSel[i]).z + TotalHeight
NewHeight = TotalHeight / (vc as float)
)
for i = 1 to vc do
(
VertIndex = VertSel[i]
VertPos = getvert terrain VertIndex
SetVert Terrain VertIndex [VertPos.x, VertPos.y, NewHeight]
)
Update Terrain
vp.text = (vc as string + " Vertices Translated")
)
)
on getTape picked obj do
(
tapeobj = obj
getTape.text = tapeobj.name
)
on pave pressed do
(
if terrainobj == undefined do
(
messageBox "Error!!! No Terrain Defined. Exiting..."
Exit
)
if road == undefined do
(
messageBox "Error!!! No Road Defined. Exiting..."
Exit
)
if ConformSelected.checked == true do
(
ProgressStart "Paving..."
heightOffset = ((road.max).z + 1)
VertSelArray = getvertselection terrainobj
nv = VertSelArray.count
if nv == 0 do (messagebox "No Vertices Selected!"; exit)
progscale = 100.0 / nv
r = ray [0,0,0] [0,0,-1]
for i = 1 to nv do
(
vpos = getvert TerrainObj VertSelArray[i]
r.pos = [vpos.x, vpos.y, heightOffset]
if (ir = intersectRay road r) != undefined do
setvert terrainObj VertSelArray[i] ir.pos
if ProgressUpdate (i * progscale) == false then exit
)
ProgressEnd()
update TerrainObj
)
if ConformSelected.checked == false do
(
ProgressStart "Paving..."
heightOffset = ((road.max).z + 1)
nv = terrainObj.numverts
progscale = 100.0 / nv
r = ray [0,0,0] [0,0,-1]
for i = 1 to nv do
(
vpos = getvert TerrainObj i
r.pos = [vpos.x, vpos.y, heightOffset]
if (intersectRay road r) != undefined do
setvert terrainObj i (intersectRay road r).pos
if ProgressUpdate (i * progscale) == false then exit
)
ProgressEnd()
update TerrainObj
)
)
on ChooseTerrain picked obj do
(
terrainobj = obj
ConvertToMesh terrainObj
ChooseTerrain.text = terrainobj.name
nv = getvertselection terrainobj
if nv != 0 do (conformSelected.checked = true)
)
on ChooseRoad picked obj do
(
road = obj
ConvertToMesh road
ChooseRoad.text = road.name
)
on ConformSpline pressed do
(
if road == undefined do
(
messageBox "Error!!! No Terrain Defined. Exiting..."
Exit
)
if loftspline == undefined do
(
messageBox "Error!!! No Spline Defined. Exiting..."
Exit
)
ProgressStart "Conforming..."
ConVertToSplineShape loftspline
SplineRez = SplineResolution.value
ns = loftspline.numsplines
for i = 1 to ns do
(
Cnt = 0
if SplineRez == 0 do (Exit)
NumSegs = numsegments loftspline i
for j = 1 to NumSegs do
(
for k = 1 to SplineRez do
(
SegmantParam = (1.0 / (SplineRez + 1.0)) * k
refineSegment loftspline i (j + Cnt) SegmantParam
Cnt = Cnt + 1
)
)
)
progscale = 100.0 / ns
r = ray [0,0,0] [0,0,-1]
HeightOffset = (road.max).z + 1
for i = 1 to ns do
(
nk = numknots loftspline i
for j = 1 to nk do
(
-- SetKnotType loftspline i j #smooth
kpos = getknotpoint loftspline i j
r.pos = [kpos.x, kpos.y, HeightOffset]
if (ir = intersectRay road r) != undefined then
(
setknotpoint loftspline i j ir.pos
) else (
format "Knot % returned Undefined intersection\n" j
)
if ProgressUpdate (i * progscale) == false then exit
)
)
ProgressEnd()
updateshape loftspline
)
)