Files
gtav-src/tools_ng/wildwest/script/3dsMax/Maps/rsta_snapSplineToMesh.ms
T
2025-09-29 00:52:08 +02:00

205 lines
6.2 KiB
Plaintext
Executable File

------------------------------------------------------------------------------
-- FILE IN
------------------------------------------------------------------------------
FileIn (RsConfigGetWildWestDir() + "script/3dsMax/_config_files/Wildwest_header.ms")
------------------------------------------------------------------------------
-- ROLLOUT
------------------------------------------------------------------------------
try (destroyDialog RSTA_snapSlpineToMesh_roll) catch()
rollout RSTA_snapSlpineToMesh_roll "Conform To Surface" width:200
(
--------------------------------------------------------------
-- LOCAL
--------------------------------------------------------------
local obj_A
local obj_B
--------------------------------------------------------------
-- CONTROLS
--------------------------------------------------------------
dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:RSTA_snapSlpineToMesh_roll.Width
local banner = makeRsBanner dn_Panel:rsBannerPanel versionNum:1.1 versionName:"" wiki:"snap_spline_to_mesh" filename:(getThisScriptFilename())
--------------------------------------------------------
group "Spline To Poly/Mesh"
(
button btn_setSplineA "> Set Spline A<" width:180
button btn_setSplineB "> Set Obj B<" width:180
spinner spn_spline_offset "Offset" offset:[3,0]
button btn_project "Snap A To B" width:180
)
group "Poly/Mesh To Poly/Mesh"
(
button btn_setMeshA "> Set Obj A <" width:180
button btn_setMeshB "> Set Obj B <" width:180
spinner spn_mesh_offset "Offset" offset:[3,0]
button btn_Conform_mesh_mesh "Snap Obj A To Obj B" width:180
checkbox cbx_snapToVert "Snap To Nearest Vert"
)
--------------------------------------------------------------
-- FUNCTIONS
--------------------------------------------------------------
fn isValid type obj =
(
case type of
(
#poly: return (classof_array #(Editable_Poly, Editable_mesh) obj)
#spline: return (classof_array #(line) obj)
)
return false
)
--------------------------------------------------------
fn set_obj objIdx type =
(
if selection.count != 0 then
(
local obj = selection[1]
case type of
(
#spline:
(
if objIdx == #a AND (isValid #spline obj) do
(
obj_A = obj
btn_setSplineA.text = obj_A.name
)
if objIdx == #b AND (isValid #poly obj) do
(
obj_B = obj
btn_setSplineB.text = obj_B.name
)
)
#poly:
(
if objIdx == #a AND (isValid #poly obj) do
(
obj_A = obj
btn_setMeshA.text = obj_A.name
)
if objIdx == #b AND (isValid #poly obj) do
(
obj_B = obj
btn_setMeshB.text = obj_B.name
)
)
)
)
else messagebox "Nothing Selected!"
)
--------------------------------------------------------
fn fire_ray startPos vect obj =
(
local theRay = ray startPos vect
local hitData = intersectRayEx obj theRay
if (hitdata != undefined) do return hitdata[1].pos
return startPos
)
--------------------------------------------------------
fn copyB =
(
local obj_B_temp = copy obj_B
convertToMesh obj_B_temp
return obj_B_temp
)
--------------------------------------------------------
fn conform_spline_mesh =
(
if (obj_A != undefined) AND (obj_B != undefined) then
(
undo on
(
local obj_B_temp = copyB()
for s = 1 to (numSplines obj_A) do
(
for k = 1 to (numKnots obj_A s) do
(
local knt_pos = getKnotPoint obj_A s k
local hitPos = fire_ray knt_pos [0,0,-1] obj_B_temp
-- OFFSET
hitPos += [0,0,spn_spline_offset.value]
setKnotPoint obj_A s k hitPos
)
)
updateshape obj_A
delete obj_B_temp
)
)
else messageBox "Please set Spline A and Poly B first."
)
--------------------------------------------------------
fn conform_mesh_mesh =
(
if (obj_A != undefined) AND (obj_B != undefined) then
(
undo on
(
local obj_B_temp = copyB()
for idx = 1 to ((RsMeshPolyOp obj_A).getNumVerts obj_A) do
(
local vtx_pos = (RsMeshPolyOp obj_A).getVert obj_A idx
local hitPos = fire_ray vtx_pos [0,0,-1] obj_B_temp
if (cbx_snapToVert.state) do
(
local dist
local clostestPointIdx
for idx2 = 1 to ((RsMeshPolyOp obj_B).getNumVerts obj_B) do
(
local vtx2_pos = (RsMeshPolyOp obj_B).getVert obj_B idx2
local dist_to_vert = distance vtx2_pos hitPos
if (dist == undefined OR dist_to_vert < dist) do
(
dist = dist_to_vert
clostestPointIdx = idx2
)
)
hitPos = (RsMeshPolyOp obj_B).getVert obj_B clostestPointIdx
)
-- OFFSET
hitPos += [0,0,spn_mesh_offset.value]
(RsMeshPolyOp obj_A).setVert obj_A idx hitPos
)
delete obj_B_temp
)
)
else messageBox "Please set Mesh/Poly A and Mesh/Poly B first."
)
--------------------------------------------------------------
-- EVENTS
--------------------------------------------------------------
on btn_setSplineA pressed do set_obj #a #spline
--------------------------------------------------------
on btn_setSplineB pressed do set_obj #b #spline
--------------------------------------------------------
on btn_project pressed do conform_spline_mesh()
--------------------------------------------------------
on btn_setMeshA pressed do set_obj #a #poly
--------------------------------------------------------
on btn_setMeshB pressed do set_obj #b #poly
--------------------------------------------------------
on btn_Conform_mesh_mesh pressed do conform_mesh_mesh()
--------------------------------------------------------
on RSTA_snapSlpineToMesh_roll open do
(
rs_dialogPosition "get" RSTA_snapSlpineToMesh_roll
banner.setup()
)
--------------------------------------------------------
on RSTA_snapSlpineToMesh_roll close do rs_dialogPosition "set" RSTA_snapSlpineToMesh_roll
)
createDialog RSTA_snapSlpineToMesh_roll style:#(#style_titlebar, #style_border, #style_sysmenu,#style_toolwindow)