[codesyntax lang=”python”]
#******************************************************
# Mold a terrain to objects placed above it
#
# - terrainmatcher.py
# - By Mark Caldwell
# - Version 0.1
# - 10th April 2007
# - Tested with Vue 6 Infinite
#
# How to use in 6 easy steps
#
# 1. Download this file onto your computer
#
# 2. Create a terrain (at this stage you can scale it
# but avoid rotating it)
#
# 3. Place objects above the terrain that you want to
# affect the terrain (don't put them too close to
# the top of the terrain)
#
# 4. Select the terrain to be modified
#
# 5. Then run script
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
# 6. Answer the questions that appear in the pop ups
# then let it run till it pops up to say it's
# finished
#
#******************************************************
import copy
#----------------------------------------------
# Configuration
#----------------------------------------------
spread=Prompt('How far should the match spread beyond the match to objects?','2',true,'Input Spread')
if int(spread)<0:
spread=0
else:
spread=int(spread)
setheight=Prompt('What altitude should the top be set to on a scale of 1 to 100 with 100 at the top and 1 at the bottom of the terrain? (enter 0 to not affect matches altitude)',
'100',true,'Input Top Altitude')
if float(setheight)==0:
setheight=-1
elif float(setheight)>100:
setheight=0.99
else:
setheight=(float(setheight)-1)/100
setdepth=Prompt('What altitude should the areas not under the object be set to on a scale of 1 to 100 with 100 at the top and 1 at the bottom of the terrain? (enter 0 to not affect unmatched altitude)',
'0',true,'Input Bottom Altitude')
if float(setdepth)==0:
setdepth=-1
elif float(setdepth)>100:
setdepth=0.99
else:
setdepth=(float(setdepth)-1)/100
#setheight=0.2
#setdepth=-1
#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------
if TestLoaded():
#--------------------------------------------------------------------------
# Test the user has 1 object and that it is a terrain
#--------------------------------------------------------------------------
numselected=CountSelectedObjects()
if numselected>1:
message="Please select only one object."
elif numselected<1:
message="Please select an object."
else:
bObject=GetSelectedObjectByIndex(0) # Get first selected object
if bObject.IsTerrain()==False:
message="Please select a terrain."
elif bObject.IsLocked(): # Check object isn't locked
message="Please select an object that isn't locked."
else:
#--------------------------------------------------------------------------
# Apply terrain data to terrain
#--------------------------------------------------------------------------
pos=bObject.Position()
scal=bObject.GetScale()
altitudes=[]
TerrainObj=bObject.ToTerrain()
height= TerrainObj.Height() # Get Terrain Objects Height
width= TerrainObj.Width() # Get Terrain Objects Width
factorheight=height
factorwidth=width
stepdistancewidth=(factorheight*scal[0])/(width-1)
stepdistanceheight=(factorwidth*scal[1])/(height-1)
altitudes=TerrainObj.TerrainAltitudes ()
altitudes_new=[[0]*width for i in range(height)]
xplus=pos[0]-((factorheight/2)*scal[0])
yplus=pos[1]-((factorwidth/2)*scal[1])
altitudes=TerrainObj.TerrainAltitudes ()
for i in range (0,height):
for j in range (0,width):
x=(i*stepdistancewidth)+xplus
y=(j*stepdistanceheight)+yplus
z=pos[2]+(altitudes[j][i]*scal[2]*100)+(20*scal[2])
start=x,y,z
vector=0,0,1
hitobj=GetFirstHitObject(start,vector)
if hitobj:
altitudes_new[j][i]=1
else:
altitudes_new[j][i]=0
if spread>0:
altitudes_temp=[[0]*width for i in range(height)]
for i in range (0,height):
for j in range (0,width):
if altitudes_new[j][i]==1:
for k in range ((i-spread),(i+spread)):
for l in range ((j-spread),(j+spread)):
if k>=0 and k<height and l>=0 and l<width:
altitudes_temp[l][k]=1
altitudes_new=copy.deepcopy(altitudes_temp)
altitudes_temp=[[0]*width for i in range(height)]
for i in range (0,height):
for j in range (0,width):
if setheight>=0 and altitudes_new[i][j]==1:
altitudes_temp[i][j]=setheight
elif setdepth>0 and altitudes_new[i][j]==0:
altitudes_temp[i][j]=setdepth
else:
altitudes_temp[i][j]=altitudes[i][j]
TerrainObj.SetTerrainAltitudes (altitudes_temp) # Set terrain heights
message="Successfully Changed Terrain"
else:
message="No Scene Loaded"
Refresh()
Message(message) # Display message
#--------------------------------------------------------------------------
# End of Script
#--------------------------------------------------------------------------
[/codesyntax]

