205 lines
6.2 KiB
Plaintext
Executable File
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)
|
|
|
|
|
|
|
|
|