From b6b104c9dc726017a0746e66badcfd13a71f6c97 Mon Sep 17 00:00:00 2001 From: Marco Hutter Date: Sat, 1 Jun 2024 20:01:18 +0200 Subject: [PATCH 1/3] Add function to update alignment --- src/cli/ToolsMain.ts | 14 ++++++++ src/cli/main.ts | 12 +++++++ src/tools/contentProcessing/ContentOps.ts | 42 +++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/cli/ToolsMain.ts b/src/cli/ToolsMain.ts index bc51c3c..57050f9 100644 --- a/src/cli/ToolsMain.ts +++ b/src/cli/ToolsMain.ts @@ -282,6 +282,20 @@ export class ToolsMain { logger.debug(`Executing optimizeI3dm DONE`); } + static updateAlignment(input: string, output: string, force: boolean) { + logger.debug(`Executing updateAlignment`); + logger.debug(` input: ${input}`); + logger.debug(` output: ${output}`); + logger.debug(` force: ${force}`); + + ToolsMain.ensureCanWrite(output, force); + const inputBuffer = fs.readFileSync(input); + const outputBuffer = ContentOps.updateAlignment(inputBuffer); + fs.writeFileSync(output, outputBuffer); + + logger.debug(`Executing updateAlignment DONE`); + } + static analyze( inputFileName: string, outputDirectoryName: string, diff --git a/src/cli/main.ts b/src/cli/main.ts index a5137ac..a745314 100644 --- a/src/cli/main.ts +++ b/src/cli/main.ts @@ -225,6 +225,16 @@ function parseToolArgs(a: string[]) { }, } ) + .command( + "updateAlignment", + "Update the alignment of the batch- and feature table and the tile data" + + "as a whole, to meet the alignment requirements of the specification. " + + "This can be applied to B3DM, I3DM, PNTS, or CMPT tile data.", + { + i: inputStringDefinition, + o: outputStringDefinition, + } + ) .command("gzip", "Gzips the input tileset directory.", { i: inputStringDefinition, o: outputStringDefinition, @@ -488,6 +498,8 @@ async function runCommand(command: string, toolArgs: any, optionArgs: any) { await ToolsMain.optimizeB3dm(input, output, force, parsedOptionArgs); } else if (command === "optimizeI3dm") { await ToolsMain.optimizeI3dm(input, output, force, parsedOptionArgs); + } else if (command === "updateAlignment") { + await ToolsMain.updateAlignment(input, output, force); } else if (command === "gzip") { const tilesOnly = toolArgs.tilesOnly === true; await ToolsMain.gzip(input, output, force, tilesOnly); diff --git a/src/tools/contentProcessing/ContentOps.ts b/src/tools/contentProcessing/ContentOps.ts index 89805ab..913b996 100644 --- a/src/tools/contentProcessing/ContentOps.ts +++ b/src/tools/contentProcessing/ContentOps.ts @@ -1,4 +1,5 @@ import { TileFormats } from "../../tilesets"; +import { CompositeTileData } from "../../tilesets"; import { GltfUtilities } from "./GltfUtilities"; @@ -149,4 +150,45 @@ export class ContentOps { const outputBuffer = TileFormats.createTileDataBuffer(outputTileData); return outputBuffer; } + + /** + * Update the alignment of the given tile data buffer. + * + * This can be applied to B3DM, I3DM, PNTS, or CMPT tile data. It will + * read the tile data from the input, and generate a new tile data + * buffer with the same contents, but ensuring that the alignment + * requirements for the batch- and feature tables and the tile data + * as a whole are met. For CMPT tile data, the data of inner tiles + * will be updated recursively. + * + * @param inputBuffer - The input buffer + * @returns The resulting buffer + */ + static updateAlignment(inputBuffer: Buffer): Buffer { + const isComposite = TileFormats.isComposite(inputBuffer); + if (isComposite) { + const inputCompositeTileData = + TileFormats.readCompositeTileData(inputBuffer); + const header = inputCompositeTileData.header; + const inputInnerTileBuffers = inputCompositeTileData.innerTileBuffers; + const outputInnerTileBuffers: Buffer[] = []; + for (let i = 0; i < inputInnerTileBuffers.length; i++) { + const inputInnerTileBuffer = inputInnerTileBuffers[i]; + const outputInnerTileBuffer = + ContentOps.updateAlignment(inputInnerTileBuffer); + outputInnerTileBuffers.push(outputInnerTileBuffer); + } + const outputCompositeTileData: CompositeTileData = { + header: header, + innerTileBuffers: outputInnerTileBuffers, + }; + const outputBuffer = TileFormats.createCompositeTileDataBuffer( + outputCompositeTileData + ); + return outputBuffer; + } + const tileData = TileFormats.readTileData(inputBuffer); + const outputBuffer = TileFormats.createTileDataBuffer(tileData); + return outputBuffer; + } } From 068eecd7cbef7f791d1c6bbfc63ba49d659e3460 Mon Sep 17 00:00:00 2001 From: Marco Hutter Date: Wed, 26 Jun 2024 12:59:51 +0200 Subject: [PATCH 2/3] Add specs for updateAlignment --- specs/data/updateAlignment/README.md | 11 ++++ specs/data/updateAlignment/batchedColors.b3dm | Bin 0 -> 13316 bytes .../updateAlignment/golden/batchedColors.b3dm | Bin 0 -> 13320 bytes .../golden/instancedScale.i3dm | Bin 0 -> 3912 bytes .../updateAlignment/golden/pointCloudRGB.pnts | Bin 0 -> 15176 bytes .../updateAlignment/golden/testComposite.cmpt | Bin 0 -> 28520 bytes .../data/updateAlignment/instancedScale.i3dm | Bin 0 -> 3908 bytes specs/data/updateAlignment/pointCloudRGB.pnts | Bin 0 -> 15180 bytes specs/data/updateAlignment/testComposite.cmpt | Bin 0 -> 28520 bytes .../contentProcessing/UpdateAlignmentSpec.ts | 59 ++++++++++++++++++ 10 files changed, 70 insertions(+) create mode 100644 specs/data/updateAlignment/README.md create mode 100644 specs/data/updateAlignment/batchedColors.b3dm create mode 100644 specs/data/updateAlignment/golden/batchedColors.b3dm create mode 100644 specs/data/updateAlignment/golden/instancedScale.i3dm create mode 100644 specs/data/updateAlignment/golden/pointCloudRGB.pnts create mode 100644 specs/data/updateAlignment/golden/testComposite.cmpt create mode 100644 specs/data/updateAlignment/instancedScale.i3dm create mode 100644 specs/data/updateAlignment/pointCloudRGB.pnts create mode 100644 specs/data/updateAlignment/testComposite.cmpt create mode 100644 specs/tools/contentProcessing/UpdateAlignmentSpec.ts diff --git a/specs/data/updateAlignment/README.md b/specs/data/updateAlignment/README.md new file mode 100644 index 0000000..ead013a --- /dev/null +++ b/specs/data/updateAlignment/README.md @@ -0,0 +1,11 @@ + +Individual tile content files (one of each type) for testing the `updateAlignment` +command. These have been taken from the state at +https://github.com/CesiumGS/cesium/blob/83306253e36bbc3fb53801fdae8dee62f1a47be5 +which was before the alignment of the spec data was fixed via +https://github.com/CesiumGS/cesium/commit/4b3b4186b4afa2307d7d1666569826d864b984ca + +The `testComposite.cmpt` was created specifically for this test, +from `batchedColors.b3dm` and `pointCloudRGB.pnts`. + + diff --git a/specs/data/updateAlignment/batchedColors.b3dm b/specs/data/updateAlignment/batchedColors.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..28cf4bd01d3a30847da1d50eb0f504dc6a304fa7 GIT binary patch literal 13316 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 literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/golden/batchedColors.b3dm b/specs/data/updateAlignment/golden/batchedColors.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..d877294f27f67dfa2c9cff689e3cf357ed78790a GIT binary patch literal 13320 zcmeHO3wRXO6+T6);-dxMS}k;?igmKio%cj#vlD_mLZV5;2Ow^eO|qI~<7Rmo0YOAW zL`6VFr7A6=&{`G2MAd0Q8s#QS|ZBYYyzBKXU^J8J|IXipi zzyCS++50k}7GEE*X+3S&}_g3KYict7FOWl~Gvah@dKL!;&(Jsu-4PYqkJ#>pep? z4MUMF+0fhW>7ZdMLbfy`V`timVOX|oc|==qZPgSeKAOn(V92IsD5hx%RmqxZvJe0i zvYkb- zR9z8@uBjO;U9&Z~WGIS;ffyQ%Ro5gj3Pw<%M_Jek!mQY`kTArWkQGBUKu!?|m;@sk z&mk%ZfGWJ9H-e_7Xtr&8sbYG=V+1WP5|(bj6ZoP^LJpd68p8^PK(KryL$wT;0a`I+ zOG1_b+ER2K{D3L&oD$SAPRZWqKQ$l=)^!SQoVd~GFn_!)fhzp@U&uJy|#?mfe7fDq6RdCC+f^b!~1w29IGy}1(i%bFl@)wzdY*9@_2l*f*Qww?-062*ZprK*LS*EQ@IT$<*xuNTZj+m>OH!E=uLv5HX4k2;8 z$~924?L;TAY0U!6+e{L)+lQid)QJht zzL{&C>BXP2En(KM#C|OazUGV2w66A}S=o@8m|?r`2TMa&`!SVlKepasKUfdD7&n_u zH_>4dV43b}M?z^!HlcNx2^#jFF1m!#&Bjg`9VUY=cR3k^(UuLuTX1)u4%h^`?33M= z57IvIWS9?OvW}~O5$OwFkH2NDsQ=mFpA5BD(@kAgupjPH2W3|!7oW@99gD2a5 zlmZi?iN;tQyFfq*%7H0ZO8ot$b+5tZQW&kTPSyl+O-+-%F531Vz8_`xqKvtMMgAM> zQZkaL_BJXN1x4%9Sei`4yb?+%ZDZ02uon2P;@RHp;5#P<+}j)5r>E_PovC~c&G7GV zG}Vh-T_hPz#3HpVacd|~jEp8DwY9N|lKA-QntJT>1Ts}_Z=322Hy z6{(mg824zWOcX?_YAZU38Zy=%R0RqOT?N&&ZOic2yM>w#8V(LKv*!2o(%|g{@3RyNxQ}z~f88xhK3dKaFWSFXnnt4yoJsd|&3*O+AfYTOES6=p6 zHmX0IkZ=+(P_28%3)K5KMPZ;&!{UszhkIq=RD`3Qjx7?kvVS7O4>I(M=puz4>G+wv96f4hbrz7OeK< z+%pAE7y_#V&b7K1eynja@(hP_obxrs##tWsFzN8}L04sbESv%NXrC<1BUuxM0nbcJ zH@z_dcf1zBYM|gKZu%1pD+JaJ&BQoact@~DyQEuq^P(gDWW0mH)bWPNKq49jT*CNS z3XU0Y6K{U7G2wWN7Xunf!0$BmyaFNGSQBln4id4tSQ0yP%hyN}Wm5V0r1!Nca8_~Y zu(DyrMSh)BR9rGLT!;cn3XJpLgbf>vqdtm&Sbb#-FAh*`wUr+J6Lo%J;8!&N7cQ#t zOiAN+-(9#m$3>agUAU;}+xU7x>83cC9M=mm30aD{wCJfAzH%^h`gfyYVKl&+$agup(M;=K-lDPfMxw zPm~Ngv3Y2o)U>kM(;t64kayI&iJ|^Re%@D0gQ>&*yl$>b><>`FeXc9G~~g@i`9Xz&Udp&Vl3eXE{FS z#yN2OvvWqLo@<)q{%J9>?)cNTruP43p0BrO!|{2)9G~NG4xBT$ z;T$+Vf0pBOZkz+hm-GeB&4Vh!)Al(%we7N{&PgMt`+9BhT~4U~(r~XSeezcKp6^s9 zZ}RmQx83MG|Kh^%mb>3b%^rA{vtsJ6ef`jXFL9nMeJXtEoR^!&thwHK|DH9z-kuG| z=lybgj>9={&fJD`;Q0Jmj?cMq4jliT~r}nU!QRGFy}u%n(q87THLykCybaX1IgncHv<9G^eS@i{lnf#YvKc|>|lKz9CR#hm{44NvvmZu|Oy z2i=}>=a)G%zntm3H?t~z$fn`G{??%vr4P7ruyg#i=Q>}Uczx=L;YGgw_s#25b)VKa z(uhgU=DMczqo<7X_4aHyKJS;~a~#frbLKXj1IOpja(vE>bKv-2ys^kVX<}X8F=c(7 zfuGE9|1fQ%udn~@EO**|=ZC9=?%ce1v0E`f_Vpn<7rXsN<%ZP-JHp9cSG%WM6~5j# zJ;%NHs}(}V^Eq~1^z4|p@??3nzXY@zQ(~}C$ap$dB=M;YYn6D3*vferQpBvJ}Q>VMD zd%x;fpRe-u4Le?P!eeHpwLsL>#<`Ai;UZse&xYgkemOqJ;T$+;Zo@fneEuxQ=iE34 zj{n()3*3UTm2TwVdG42YORgGQ=IiQ4)%~F97Wc!gligE3jJUh1miT(<;g#+)%3{}i z>JImUPjvT@GZ*;!{3FhA;}^_w3s=l_=h&CH(+lSMdV4k;pZCl0IS%K*IddD%f#dUM zIX>scIdJ?3KCMl!4)u1^HLKE(uD&bv_T>MhJw5%#meiKbPo}5-@x1i0S6-E_-u9}m zZ@TfCbba5A>1%g=mY#9s&eXdHt@8Et#~+biyCso6@Qan{LvFhz9ZO#4>+RWaeBLj| z=Qx}L=ge(52aeC5<@lT%=fLrc&VRtIt-n7!`~8UX?($`BS=D2{eyUjRhDN*?eqmvQ zv-s@?-E*;bd-{EOtK5+fZw}8LT;zmqxYyNx^PaEIIeLZLfBskDm;W}#`TNF)U32kg zzTTb<$LIZWe2&98aL(L@bKv;=S&q-SaSj|m^sF;z(JN;(fBE2mP$%`Zun)n$8TK9O z)Bia!^pC{ULEgVY>7?Ea`?an19qMx*I$`aNv-^d#FY`m4)Ca-78TQSv?@;e#On3}C zj0ulhCMN2+Pn^(6-H!?Em%_e7y^}HFG3+oVJZ|4reD>zgx6idq&cx4I=jB7ln`<5D ze$K$g%eM~o?@Rui@ztBz_;jHAF@a4sKD*PuFY(zszji;r_Qq##d|GRyF75Ao^Jn+@ zv;EVzvg>mPy1zcdCc8fGPVedU*&ElM{ag_u>dA}pz`qBtJYe_abp`Ny^12iFJ$a>o z-;>u?;P>Q3VWOVA`T)NtuOCn^IM9psq5bHGv@h)sxi1|+z3D)-2hu_GBRYf*rXNEd zOovim>O+S?_MyY+2s#q&k#rOtO~=r&Xpg0z&`;@jI*$559!LG@XB0pipcCjs`Z*1t zlOPAsFX&_%NT)y!B#Ck;h&D*4l1zdWvgzBk|YAFs`O9{G^ z8mJMnfs!5GTx{a359dtYW67qJs zo9?1JX({BL^eg%`EknDE?xE#$FWrasK3YM)rQgs>x*u{S{f-`>2hl!A57BCRm{!pm z$W`+Cb}R9X$oPjyBTM^bFc(XcPUB{y@*t zbCA!{i}V6LPcK0}Pk*A9=@qoE(5v)kdW~L3`#QZrZ_*apOm9JMrmgfgZ9}__-l4zJ hU+7(W5At2wP9Me`j9@NooIK`$H-)&{{ldz8@&Jk literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/golden/instancedScale.i3dm b/specs/data/updateAlignment/golden/instancedScale.i3dm new file mode 100644 index 0000000000000000000000000000000000000000..e6284fe442cebb78d1f13dea64ea87f75cd42c04 GIT binary patch literal 3912 zcmb_eZ)h837=Jt0Ipf^s)a{!)4u;Kki%BkR(-b|j+N~*V(ly!qvz2g3F3Cx97cQ4< zX$cJ6WIBdpR1_wHpbT*$42B;D8$%GMG86}X62T9CRQ#YY8JoZN?tPPMGHpMYHkaq# z=lT7fzwdje%Z2IyA!KR`A!YoY!_79U|SN?6Y-hJUWFVCw%Y>z z_*2V?!87N+-urZGIy<+V_~T7ie*55Z;wL75Gryd;$>f2|a^eb;|4J?=et>)tSP9tc zOwIxO36tLi_8lhQN-rl)GWiQ&KY%RmY)#)m3}>1AEU=4A)_^TC`2w)>Og;y!3Hd!> zzXbLulkXyiDJF-2jWD?ctia@>z&;OohtQfn5A1Fxe+BGzCf`F0>zEt?_O~}&`%}v6 z%AsG*DCsj7lwY@AQeJuHtm6OvQ|0QlQ_6MglJcQlQGWmKE#>1&=anCeIpy=gniAVH zqrAWCvU2U@W@Yx}tIDl!CzUaOPMMfmRFoG#Qg;1$QMrBjHRa~di^^wLPAf~|l%|); zXx@=TrkAX%vf^by(Mqi7{DP zIZ2Y3H>)+%&y%;P%sdrA2}L|jEs$jM@A&9(Qog1$30g?Mn|IZXlOVZmVn@^!=vGF zFftq+ivqwhIXpQbi>rhjjz%9;nUz6%`MN0}TKsq8lR{Exp^baB?rh#Av7{NArP`(? z#>CXV>F|M>%zhNMsabX1L~+G%Acz22-&hZ^{bw|zWS4PXgrX5j*zK#g&p003@^kY@ zu%{m*k!UylKJ!pWMnk;EO(-~w6Nk6B4=_B6vUu&`-&U;>J*ni#*a-8Uwk^GY0Skry zgKM-WREOJ3Cey^Ls;ybNT5;2^<*ZrFRx1@fKW{clWdoy655_86+^^=HS|cor>-ky; zk*jrW!mOAUUps<^xlNNqt*Y1SdQSI&0E|#ME5;;Gs!$uwXWF6)lZ4 z3u3H@_%tV4tzOnxsFq&UZSc9bs*RfD8aBOM@|^aF3Xg)>_zZfDIna%Qj{WQuo~Q2K zIQ}sU)Qy1~m$nLr(9^|w9<%1yI+CmBmO`UP#wj=Hhu?RDsN!6l!w}Su@ADL81{9zyf$8bZ){%K zYvYaW-{R-KsIAw=i$#I(IdR?nU9+rEkc&C7itOlJQ?eG>;RSbxcNN)*9X1rV78#b# zXRSF85c(`yM;;>U$spN)>jv^L*+?ECK3sj|QL>3VMmFQRnQS3j$>U@juG`2HY;8pQYaAgk5iZ@5I{i?INn;Mno=b@$AWh_ zdn*A_Si2lNVBUjC`xF{>ay9Chb{IJ6CCqEObib3i_fp z)MT}B8$tWWa&!vW$=B(v%yl#L{SO96QXaw!jU@03r;!Doxx>S60#+&Kbc+rqUt9|t zFR;VLZ&t9emN^DYUZHPdf4!hv(C_tT-z{f1bOv7~t`$~$I>iXnVz`$sV+C$|ip7VY zmDqL0X`qw@e(__3@q#*3Fzq2XbgAN}Ub_5c@OQJS2zvyUu4Cek94~jmur&iS)B=Xm z1_Kf{(XpW(7ed+fA$e!j@9=S^Rbu959fzIH=jlsIe@QSz4!^5LEm&=6A5jBur6^U$ zj5~r27oE^n81bQ5vB-x8XN0@sJ2;#?`z^KPyiU21MuuF6oj?Mr#A6Dm@ZHFIH!d=1 I`{*O*A0nlx`v3p{ literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/golden/pointCloudRGB.pnts b/specs/data/updateAlignment/golden/pointCloudRGB.pnts new file mode 100644 index 0000000000000000000000000000000000000000..8ab4d2656d89092ecc174b43e92f1e7e382da516 GIT binary patch literal 15176 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 literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/golden/testComposite.cmpt b/specs/data/updateAlignment/golden/testComposite.cmpt new file mode 100644 index 0000000000000000000000000000000000000000..06ecaa3248f884f27e1426a288af4883a2fd9277 GIT binary patch literal 28520 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 x!~UJ;Jf5H5*ZkVGHpM2Z7$Ef z&-42|f8RH!%lXOxA!Pp+LQ42PkB1lWO)t8>EGFhs>G<5lWGXW=Id?EUCC0+Tk~kSp zr89HMh4fVB@Vpqat-2(;UP)YG@?Uc+i60*bg9!JDbyY5W_hpKMU*kaUQ%9u=A1J0{in*+Yp0d#)+OabyR7{F-J8nCmo6wj7P89cgHY@kt>mwAjM4T5~qCG7Oo+h-gPZuz-+ zB-qoBkw~kT<0cdw#)-pQ+y@vQMOnP|@NcVDk)Bj?WNd_aPuZ59$AE>x z|G_od6RN}QC6j6571h=(T`jw5SF_fvW~=40o?9^M#gc*1rw3z&Egn#FPOTA^#r1qG zgviyJHer@ci?1C;!`!AxqE^vsHNBy=bwLS#w3+2*|L^G znt3r+Kzy1LtyU{(EL2Oc=r;J=N7Y76vUQt2E_+UUM1`M%+4u~4jXBVbypH|s6rQK< zJ~;j{3)GE)2bZ=2htSi-S`M@3*gBG{=axa>=&!|@jfCt=%;6Lf;`rRSe}CrA>%~6EhGN*q;quye`Mt4u zWv`7lwttJC`=Yj98!r|G!gcbx`@Lpap&%D?auwOpyQX9}p>37x@LiL1+MPrDdlS`7ErVJyRKPqFy$ zvl6?`I1QANz;8nsVZ5OF^QP^0Lzl`!)JuoI1pZD|WnquN(sfMSk>lk~7`A3$hMK@o z+F(G!COYo#aUqmkACh-gha5i6v`Wm}tnIMf`5b*o=`RU}$l-U@s0FJH?IUX7trVqd zn{h|5;i3~-mk}SDu0=jHI3wI0-^StOIbf+p=XJ`BG~#z1wgU;M5|1gM!goF6-MGl4 G<@*OcoT>K! literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/pointCloudRGB.pnts b/specs/data/updateAlignment/pointCloudRGB.pnts new file mode 100644 index 0000000000000000000000000000000000000000..455d3b84065b30703e32280b73a8d550ae13c4cd GIT binary patch literal 15180 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 literal 0 HcmV?d00001 diff --git a/specs/data/updateAlignment/testComposite.cmpt b/specs/data/updateAlignment/testComposite.cmpt new file mode 100644 index 0000000000000000000000000000000000000000..d01c3798dcc6ac171a517850562f18bf3e966bc3 GIT binary patch literal 28520 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 Date: Wed, 26 Jun 2024 13:00:04 +0200 Subject: [PATCH 3/3] Update README.md for updateAlignment --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 51e385e..2918fbf 100644 --- a/README.md +++ b/README.md @@ -265,13 +265,23 @@ This example optimizes the b3dm and compresses the meshes using Draco, with a hi #### optimizeI3dm -Optimize a i3dm using [gltf-pipeline](https://github.com/CesiumGS/gltf-pipeline/blob/main/README.md). +Optimize an i3dm using [gltf-pipeline](https://github.com/CesiumGS/gltf-pipeline/blob/main/README.md). ``` npx 3d-tiles-tools optimizeI3dm -i ./specs/data/instancedWithBatchTableBinary.i3dm -o ./output/optimized.i3dm ``` See [optimizeB3dm](#optimizeb3dm) for further examples. +#### updateAlignment + +Update a B3DM, I3DM, PNTS or CMPT file to ensure that the alignment requirements +for the batch- and feature tables and the tile data as a whole are met. For CMPT +tile data, the data of inner tiles will be updated recursively. + +``` +npx 3d-tiles-tools updateAlignment -i ./specs/data/updateAlignment/testComposite.cmpt -o ./output/testCompositeFixed.cmpt +``` + #### analyze