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

241 lines
5.3 KiB
Plaintext

fn HardReset obj =
(
gc ()
local CObj = obj
ConvertToMesh CObj
CObj.pivot = CObj.center
Props = GetUserPropBuffer CObj
-- Copy the object. Center the pivot.
local o_pos = obj.pos
local o_rot = obj.rotation
local o_scale = obj.scale
-- move the object to the origin, strip off rotation, scale
obj.pos = [0,0,0]
obj.rotation = (quat 0 z_axis)
obj.scale = [1,1,1]
-------
local VertArray = for i = 1 to CObj.numverts collect (getvert CObj i)
local FaceArray = for i = 1 to CObj.numfaces collect (getface CObj i)
local MatIDArray = for i = 1 to CObj.numfaces collect (GetFaceMatID CObj i)
local TVertArray = #()
local i = 0
for i = 1 to FaceArray.count do
(
CFace = (GetTVFace CObj i)
if FindItem TVertArray CFace.x == 0 do (append TVertArray CFace.x)
if FindItem TVertArray CFace.y == 0 do (append TVertArray CFace.y)
if FindItem TVertArray CFace.z == 0 do (append TVertArray CFace.z)
)
TVertUVArray = (for i = 1 to TVertArray.count collect (GetTvert CObj TVertArray[i]))
local m = mesh vertices:VertArray faces:FaceArray MaterialIDs:MatIDArray
for i = 1 to CObj.numfaces do
(
SetEdgeVis m i 1 (GetEdgeVis CObj i 1)
SetEdgeVis m i 2 (GetEdgeVis CObj i 2)
SetEdgeVis m i 3 (GetEdgeVis CObj i 3)
)
for i = 1 to CObj.numfaces do
SetFaceSmoothGroup m i (getFaceSmoothGroup CObj i)
addmodifier m (uvwMap maptype:1)
ConvertToMesh m
local Ntv = getNumTVerts CObj
SetNumTverts m Ntv true
for i = 1 to CObj.numfaces do
setTVFace m i (GetTVFace CObj i)
update m
for i = 1 to Ntv do
SetTvert m i (GetTvert CObj i)
m.name = (CObj.name + "_regen")
m.pivot = m.center
-- fix location of new object
m.scale = o_scale
m.rotation = o_rot
m.pos = o_pos
-- other stuff
m.wirecolor = CObj.wirecolor
update m
if CObj.mat != undefined do
m.mat = CObj.mat
local oname = CObj.name
delete CObj
m.name = oname
setUserPropBuffer m Props
return m
)
fn GetGUIAppScale obj =
(
local rot = obj.rotation;
obj.rotation = (quat 0 Z_axis);
local dim = obj.max - obj.min;
local GUIscale = dim.x;
if (dim.y > GUIScale) do
GUIscale = dim.y;
if (dim.z > GUIScale) do
GUIscale = dim.z;
obj.rotation = rot;
return GUIscale * 0.5;
)
fn UpdateObject obj word_array =
(
local len, angle, x, y, z, w;
len = word_Array.count;
-- print word_array;
-- Read from right to left.
-- Scale is the last number
local rescale = GetGUIAppScale obj;
rescale = word_array[len] as float / rescale;
-- obj.scale = obj.scale * rescale;
-- ignore scale
len = len - 1;
-- Rotation is the next four
w = word_array[len-3] as float;
x = word_array[len-2] as float;
y = word_array[len-1] as float;
z = word_array[len-0] as float;
obj.rotation = (quat x y z w);
len = len - 4;
-- Position is the next three.
x = word_array[len-2] as float;
y = word_array[len-1] as float;
z = word_array[len-0] as float;
obj.pos = [x, y, z]
len = len - 3;
)
fn WordArray textline =
(
local c;
local i = 1;
local word = "";
local word_array = #();
for i = 1 to textline.count do
(
c = textline[i];
if (c == " " or c == "\t" or c == "\n") then
(
append word_array word
word = "";
)
else
word = word + c;
)
append word_array word;
)
fn load_placement_file filename =
(
-- loads the file into an array of arrays. Each array in the
-- containing array is a line of text as a WordArray.
local FileArray = #();
local f, l;
f = openfile filename;
if f != undefined then
(
while not eof f do
(
l = readline f;
append FileArray (WordArray l);
)
close f;
)
else
format "File not found: %\n" filename
return filearray
)
fn find_array_index obj filearray =
(
-- object name should not have spaces!
if (wordArray obj.name).count != 1 then
format "Object name cannot have spaces... => %\n" obj.name
else
(
-- Find object in array.
arraylength = filearray.count;
for i = 1 to arraylength do
(
linelength = filearray[i].count;
if (obj.name == filearray[i][linelength - 8]) do
(
-- found it! Now update it.
return i;
)
)
)
return undefined;
)
fn update_obj_from_array obj filearray =
(
local i;
i = find_array_index obj filearray;
if i != undefined then
(
updateObject obj filearray[i]
return true
)
else
(
format "Object not found: %\n" obj.name
return false
)
)
-- **************************************************************************************************
-- * Utility Start
-- **************************************************************************************************
Utility LoadGroffText "Load Groff Text"
(
checkbox HR "Hard Reset" checked:true
button GetGroffTextFile "Load Groff Text Selection" width:145
on GetGroffTextFile pressed do
if (GroffTextFile = getOpenFilename caption:"Select Groff Text File:") != undefined do
(
g = geometry as array
CFileArray = load_placement_file GroffTextFile
if CFileArray != undefined then
(
-- build the valid object array
ObjArray = for o in selection collect o
for i = 1 to ObjArray.count do
(
CObj = ObjArray[i]
if (findItem g CObj) != 0 do
if (update_obj_from_array CObj CFileArray) == true do
if HR.checked do
CObj = HardReset CObj
)
)
else
format "CFileArry is undefined...aborting\n"
)
)