Table of Contents
Scripts > Cube wrapped heightfield
AboutThis script converts 4×3 aspect heightfields like this… …into cube-wrapped maps such as this: In principle, the above map could be 'folded' to create a 6 sided cube. With a some sort of spherical distortion calculation, this may allow spherical worlds to be generated from heightmaps. In Sapphire, the raw (unfolded) results look like: Note that the blending operations have some artefacts that you will need to clean up manually, including streaking near tile edges, and small steps at internal tile edges. Script contents// Author: A. Torpy // Updated: 10 Mar 2012 hvar hMap set hMap <project.GetMap "HF"> int nx ny set nx <map.GetWidth hMap> set ny <map.GetHeight hMap> assert <or nx ny> "Map not initialised" int TileSize set TileSize <div ny 3> if <not <iseq 0 <mod ny TileSize>>> echo <strcat "Height is not divisible by 3 (" <strcat ny <strcat " % " <strcat TileSize <strcat " = " <strcat <mod ny TileSize> ")">>>>>> return -1 endif if <not <iseq 4 <div nx TileSize>>> echo "Width must be 4/3 height" return -1 endif if <not <iseq 0 <mod nx TileSize>>> echo "Width must be exactly 4/3 height" return -1 endif int depth set depth <div TileSize 3> if <not <EditUI &depth "Enter blend depth">> return -1 endif if <islt depth 1> echo "Blend depth must be greater than 0" return -1 endif if <isgt depth <div TileSize 2>> echo <strcat "Blend depth must not be greater than TileSize/2 (i.e. " <strcat <div TileSize 2> ")">> return -1 endif L3DTio_Backup.BackupMap "HF" "BoxWrap HF" 0 "view.ShowMap \"HF\"" int px py int p pmax set p 0 set pmax 3 do // east/west calc.HF.BlendEdges hMap 0 TileSize 1 0 depth <sub nx 1> TileSize 1 2 depth TileSize 0.5 0 NULL // easternmost top to mid topmost (reversed) calc.HF.BlendEdges hMap <mul 3 TileSize> <mul 2 TileSize> 0 3 depth <mul TileSize 2> <sub ny 1> 2 3 depth TileSize 0.5 0 NULL // easternmost bottom to mid bottommost (reversed) calc.HF.BlendEdges hMap <mul 3 TileSize> TileSize 0 1 depth <mul TileSize 2> 0 2 1 depth TileSize 0.5 0 NULL // northwest diag set px TileSize set py <mul TileSize 2> calc.HF.BlendEdges hMap px py 2 3 depth px py 1 0 depth TileSize 0.5 0 NULL // northeast diag set px <mul TileSize 2> set py <mul TileSize 2> calc.HF.BlendEdges hMap px py 1 2 depth px py 0 3 depth TileSize 0.5 0 NULL // southeast diag set px <mul TileSize 2> set py TileSize calc.HF.BlendEdges hMap px py 0 1 depth px py 3 2 depth TileSize 0.5 0 NULL // southwest diag set px TileSize set py TileSize calc.HF.BlendEdges hMap px py 2 1 depth px py 3 0 depth TileSize 0.5 0 NULL // interior vert b/w rightmost tiles (except for last pass, where we don't want changes if <islt p <sub pmax 1>> set px <mul TileSize 3> set py TileSize calc.HF.BlendEdges hMap px py 2 1 depth px py 0 1 depth TileSize 0.5 0 NULL // interior of centre square, left edge set px TileSize set py TileSize calc.HF.BlendEdges hMap px py 1 2 depth px py 1 0 depth TileSize 0.5f 0 NULL // interior of centre square, right edge set px <mul TileSize 2> set py TileSize calc.HF.BlendEdges hMap px py 1 0 depth px py 1 2 depth TileSize 0.5f 0 NULL // interior of centre square, top edge set px TileSize set py <mul TileSize 2> calc.HF.BlendEdges hMap px py 0 1 depth px py 0 3 depth TileSize 0.5f 0 NULL // interior of centre square, bottom edge set px TileSize set py TileSize calc.HF.BlendEdges hMap px py 0 3 depth px py 0 1 depth TileSize 0.5f 0 NULL endif while <islt <incr p> pmax> // clear rects calc.map.ZeroArea hMap 0 0 TileSize TileSize 0 calc.map.ZeroArea hMap <mul TileSize 2> 0 <mul TileSize 2> TileSize 0 calc.map.ZeroArea hMap 0 <mul TileSize 2> TileSize TileSize 0 calc.map.ZeroArea hMap <mul TileSize 2> <mul TileSize 2> <mul TileSize 2> TileSize 0 map.SetFlag hMap 5 true view.ShowMap "HF" return 0 Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Share Alike 3.0 Unported
|