khanat-opennel-code/code/nel/tools/3d/plugin_max/scripts/nel_old_zone_to_ligo.ms
2010-05-06 02:08:41 +02:00

460 lines
No EOL
11 KiB
Text

-- *** Convert old zone into ligo zone
-- *** How to work with old zones:
-- Continue to edit old zone files in world position, not in new ligo material zone
-- Place villages near the origine, not in the world and save the metazone in the ligo folder
-- When modifing metazone or zone, launch this tool to create new ligo files
-- It will create a meta materialzone for each village.
-- It will create a materialzone for each old zone not in metazone.
-- It will remove modified zone in ligo materialzone files and merge new zone modified in old file translated at origin and flagged properly
-- It will update the .land file
-- Process overview
-- For each meta zone
-- If one old file in the metazone is more recent than dest metazone file or no old file exist
-- Reset max
-- Load the destination zone file
-- For each old zone file in the meta zone
-- Remove the patch mesh from max
-- If the old file zone exist
-- Merge the new zone file in the destination file
-- For each max file in the old directory
-- If the src file is more recent than dest zone file
-- Reset max
-- Load the destination zone file
-- Delete the old zone in the destination file
-- Merge the new zone in the destination file
-- Generate the .land file
-- Structures
struct metazone (name, posMin, posMax)
-- Fyros : X: [150 - 169] Y: [DV - EW] Generate : X: [99 - 128] Y: [-169 - -169]
-- Trykers : X: [194 - 215] Y: [DV - EW] Generate : X: [96 - 115] Y: [-215 - -215+22]
-- Parameters, uppercase for cell position
old_zone_directory_fyros = "w:/database/landscape/zones/fyros"
ligo_directory_fyros = "w:/database/landscape/ligo/desert"
metazones_fyros = #(metazone "1_MZ_city" "152_EK" "155_EO", metazone "bridge_a" "158_EM" "158_EO", metazone "brandon" "164_ES" "165_ET", metazone "ecorce_A" "155_EI" "157_EJ")
old_zone_directory_tryker = "w:/database/landscape/zones/tryker"
ligo_directory_tryker = "r:/database/landscape/ligo/lacustre"
metazones_tryker = #(metazone "village_a" "205_EC" "208_EE", metazone "village_b" "199_EH" "200_EI", metazone "village_c" "206_EH" "208_EJ", metazone "village_d" "206_DS" "208_DU")
cell_size = 160.0
weld_threshold = 1.0
-- Constants
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
NEL3D_APPDATA_LIGO_USE_BOUNDINGBOX = 1342141818
NEL3D_APPDATA_DONTEXPORT = 1423062565
-- Convert a name in coordinate
fn nameToCoord name coord =
(
local
-- Const
NameTab = filterString name "_"
alpha_letter1 = NameTab[2][1]
alpha_letter2 = NameTab[2][2]
alpha_letter1_value = findstring alphabet alpha_letter1
alpha_letter2_value = findstring alphabet alpha_letter2
-- Decompose theh name in an array array[1]=numeric string value array[2]=alpha string value
-- The index of the engine start at 0 but the script one at 1 so we sub 1 each time
alpha_sub_id = (((alpha_letter1_value as integer - 1) * 26 + (alpha_letter2_value as integer)))-1
num_sub_id = (NameTab[1] as integer)-1
-- X
coord[1] = alpha_sub_id
-- Y
coord[2] = num_sub_id
)
-- Convert a coordinate in a name
fn coordToName coord =
(
up = coord[1] / 26 + 1
down = coord[1] - ((up-1) * 26) + 1
-- X
coord[1] = alpha_sub_id
-- Y
return ((coord[2] + 1) as string) + "_" + alphabet[up] + alphabet[down]
)
-- Get the bounding of the metazone
fn getMetaZoneBound metazone minPos maxPos =
(
nameToCoord metazone.posMin minPos
nameToCoord metazone.posMax maxPos
if (minPos[1] > maxPos[1]) then
(
tmp = minPos[1]
minPos[1] = maxPos[1]
maxPos[1] = tmp
)
if (minPos[2] > maxPos[2]) then
(
tmp = minPos[2]
minPos[2] = maxPos[2]
maxPos[2] = tmp
)
)
-- File exist ?
fn fileExist filename =
(
file = openFile filename mode:"r"
if file == undefined then
(
return false
)
else
(
close file
return true
)
)
-- Output error
fn outputError message =
(
messagebox message
)
-- To uppercase
fn uppercase instring = -- beginning of function definition
(
local upper, lower, outstring -- declare variables as local
upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ" -- set variables to literals
lower="abcdefghijklmnopqrstuvwxyz"
outstring=instring
for i=1 to outstring.count do
(
j=findString lower outstring[i]
if (j != undefined) do outstring[i]=upper[j]
)
return outstring -- value of outstring will be returned as function result
)
fn mergeNeighbor x y old_zone_directory trans =
(
local name, node, src
-- Get the file name
name = coordToName #(x, y)
-- Source filename
src = old_zone_directory+"/"+name+".max"
-- Delete the zone if exist
node = getnodebyname name
if (node != undefined) and ((classof node) == RklPatch) then
(
delete node
)
-- File exist ?
if (fileExist (src)) then
(
-- Load the file
name = uppercase (name)
if mergeMAXFile src #(name) #mergeDups then
(
-- Get the node
node = getnodebyname name
if (node != undefined) then
(
node.transform = translate node.transform trans
-- Collapse the node
collapseStack node
-- Set the appdata
setAppData node NEL3D_APPDATA_LIGO_USE_BOUNDINGBOX "1"
setAppData node NEL3D_APPDATA_DONTEXPORT "1"
node.isFrozen = true
)
)
)
)
fn convertLandscape old_zone_directory ligo_directory metazones =
(
-- For each meta zone
for i in metazones do
(
-- Memory dump
gc ()
-- Get the coordinate of the metazone
minPos = #()
maxPos = #()
getMetaZoneBound i minPos maxPos
-- Get the translation for this metazone
trans = [-cell_size*minPos[1], cell_size*(minPos[2] + (maxPos[2] - minPos[2] + 1)), 0.0]
-- Metazone filename
metazoneFilename = ligo_directory+"/max/zonematerial-converted-"+i.name+".max"
----- If one old file in the metazone is more recent than dest metazone file or no old file exist
exist = false
export = false
for y = minPos[2] to maxPos[2] do
(
x = 0
for x = minPos[1] to maxPos[1] do
(
-- Get the file name
name = coordToName #(x, y)
-- Source filename
src = old_zone_directory+"/"+name+".max"
-- Does the file exist ?
if (fileExist (src) == true) then
(
-- One file exist
exist = true
-- Need rebuild ?
if (NeLTestFileDate metazoneFilename src) == true then
(
export = true
exit
)
)
)
-- Breaked ?
if (x > maxPos[1]) then
exit
)
if ( (exist == false) or (export == true) ) then
(
-- Reset max
resetMAXFile #noprompt
-- For each old zone file in the meta zone
for y = minPos[2] to maxPos[2] do
(
x = 0
for x = minPos[1] to maxPos[1] do
(
-- Get the file name
name = coordToName #(x, y)
-- If the old file zone exist
src = old_zone_directory+"/"+name+".max"
-- Merge the new zone file in the destination file
if (fileExist (src) == true) then
(
name = coordToName #(x, y)
mergeMAXFile src #(name) #mergeDups
-- Translate the node
node = getnodebyname name
if (node != undefined) then
(
node.transform = translate node.transform trans
-- Collapse the node
collapseStack node
SetRykolTileSteps node -5
-- Merge it
if (getnodebyname "metazonetemp") == undefined then
(
node.name = "metazonetemp"
)
else
(
NeLAttachPatchMesh node $metazonetemp
)
)
)
)
)
-- Set the appdata
setAppData $metazonetemp NEL3D_APPDATA_LIGO_USE_BOUNDINGBOX "1"
-- Weld it
NeLWeldPatchMesh $metazonetemp weld_threshold
-- Merge neighbor zones
for x = minPos[1]-1 to maxPos[1]+1 do
(
if x >= 0 then
(
arrayY = #(minPos[2]-1, maxPos[2]+1)
for y in arrayY do
(
if (y >= 0) then
(
-- Load neighbor
mergeNeighbor x y old_zone_directory trans
)
)
)
)
for y = minPos[2] to maxPos[2] do
(
arrayX = #(minPos[1]-1, maxPos[1]+1)
for x in arrayX do
(
if x >= 0 then
(
-- Load neighbor
mergeNeighbor x y old_zone_directory trans
)
)
)
-- If file exist, load metazone project
cont = true
if (fileExist (metazoneFilename) == true) then
(
if (mergeMAXFile metazoneFilename #mergeDups) == false then
(
outputError ("Can't merge max file "+metazoneFilename)
cont = false
)
)
if cont == true then
(
-- Remove the patch mesh from max
node = getnodebyname "metazone"
if (node != undefined) and ((classof node) == RklPatch) then
(
delete node
)
-- Rename new zone
$metazonetemp.name = "metazone"
-- Save the meta zone
saveMaxFile metazoneFilename
)
)
)
-- Get files in the zone_source_directory
files = getFiles (old_zone_directory + "/*.max")
for i in files do
(
-- Zone name
name = uppercase (getFilenameFile i)
-- Zone position
pos = #()
nameToCoord name pos
-- Translation
trans = [-cell_size*pos[1], cell_size*(pos[2] + 1), 0.0]
-- Zone filename
zoneFilename = ligo_directory+"/max/zonematerial-converted-"+name+".max"
-- Need rebuild ?
if (NeLTestFileDate zoneFilename i) == true then
(
-- Reset max
resetMAXFile #noprompt
-- Memory dump
gc ()
-- If file exist, load azone project
cont = true
if (fileExist (zoneFilename) == true) then
(
if loadMaxFile zoneFilename == false then
(
outputError ("Can't load max file "+zoneFilename)
cont = false
)
)
-- Continue ?
if (cont == true) then
(
-- Delete the zone if exist
node = getnodebyname name
if (node != undefined) and ((classof node) == RklPatch) then
(
delete node
)
-- Load the file
name = uppercase (getFilenameFile i)
if mergeMAXFile i #(name) #mergeDups then
(
-- Get the node
node = getnodebyname name
if (node != undefined) then
(
node.transform = translate node.transform trans
-- Set the appdata
setAppData node NEL3D_APPDATA_LIGO_USE_BOUNDINGBOX "1"
-- Merge neighbor zones
for x = pos[1]-1 to pos[1]+1 do
(
if x >= 0 then
(
arrayY = #(pos[2]-1, pos[2]+1)
for y in arrayY do
(
if (y >= 0) then
(
-- Load neighbor
mergeNeighbor x y old_zone_directory trans
)
)
)
)
for y = pos[2] to pos[2] do
(
arrayX = #(pos[1]-1, pos[1]+1)
for x in arrayX do
(
if x >= 0 then
(
-- Load neighbor
mergeNeighbor x y old_zone_directory trans
)
)
)
-- Save the meta zone
saveMaxFile zoneFilename
)
)
else
(
outputError ("Can't load max file "+i)
)
)
)
)
)
-- Convert Fyros
convertLandscape old_zone_directory_fyros ligo_directory_fyros metazones_fyros
-- Convert Tryker
convertLandscape old_zone_directory_tryker ligo_directory_tryker metazones_tryker