460 lines
11 KiB
Text
460 lines
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
|