gH]kDwP$Rosetta Beta 7.61[VS_O93YJClinton Reese, Clintons 3D Creations`d8pM*#ͺOPNG  IHDR`ZRIDATxIEu p2$hM\E hfc.l _8zWX` +VX` +VX` +VX` +VX` +VX` +VX` +VX` -*{xCN0lz 0x^1[`yo;;xptZmp>|9Ǻf3Mi+NG+VX` +VX` +VX` ZzGoaIENDB`/tfѭ8Lwb"qZg܂dKu= 4install Grid Array ButtonP .;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects"ŝ P 4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p" zFAa| zFAa|DhelpText\vRm)EC!avRm)EC!aD leftClickScript\1V {E!Y1V {E!YD name\!K0}q!K0}qD"rightClickScript\-1OSM n-1OSM n"LayoutLayout 럆L<_ї"1V {E!YsayHello!K0}q2System.Alert("goodbye");(XFҦV>g'JNjn*pF~DBk@@T@ BtB?vRm)EC!a<System.Alert("hello there!");-1OSM n 럆L<_їˁDefaultOˁ CRih[  }}LActivity.Run('%THIS_NAME%' + "/doIt")8install buttons and scriptsZ`Ez]UO GFʠN= 0 ,}} version 1.0Z`Ez]UO}} zFAa|say helloC 4C +`._E#ބ6 CustomFrame(Pŝ .;]kI 忞@"Pڝ ŝ 4W}@O{$*O΢C}*O΢C} WinIDWindow IDƝ -pϗO 0)t-pϗO 0)PositionShelf Position mz!OHwcPǝ Pǝ >-MD'zZt>-MD'zZRectangle"Screen Rectangle THj6F 2s*ǝ RÒGbDeC tRÒGbDeC  WidthWindow widthPǝ Pȝ [FB%n*jt[FB%n*jHeightWindow heightPǝ  [GDJM [GDJMMin Width$Min. Window width%]GJ7ψ%]GJ7ψMin Height&Min. Window height^^Dy^^DyMax Width$Max. Window widthv43N tv43N tMax Height&Max. Window height~൱D@ j#^c~൱D@ j#^cMaximized(Window Is Maximized 9@'s9@'sRootNodeRootNode{Q !aOt {Q !aOt  TitleTitle Text6*Mv46*Mv4View Index$View window indexf$I `7f$I `7Frame TypeFrame Typej^G@!,j^G@!,"ViewersViewers array 2bOdA)f "I)LL !I)LL ! Def1D Default 1D GUID8M0cry8M0cry Def2D Default 2D GUIDF L$3F L$3 Def3D Default 3D GUIDobFFJL}obFFJL}SnappedTo$Snapped To WindowBXPjKɸtEBXPjKɸtE SnappedToTarget@Snapped To Window Target CornerkJHx(V@WkJHx(V@W SnappedToSource@Snapped To Window Source CornerKTLA7~fKTLA7~f"SnappedToOffsetX6Snapped To Window Offset XK8Y8O#=gtMK8Y8O#=gtM"SnappedToOffsetY6Snapped To Window Offset Ymk~_Lb.mk~_Lb.SnappedToWidth0Snapped To Window Width|7EId |7EId  SnappedToHeight2Snapped To Window HeightKXtO LKXtO L,StartSnappedToOffsetXBStart Snapped To Window Offset XVG))jHETVG))jHET,StartSnappedToOffsetYBStart Snapped To Window Offset Y?V{N7l?V{N7lSnappedToRatio,Snapped To Ratio Mode 86*n^HD9t 86*n^HD9t OwnedByOwned By|_ D|_ DTabsAsButtons Tabs As Buttons _N>G1_N>G1HiddenHidden Flag \q^2FII3w\q^2FII3wPreference,View Preference Panel >=жaMpT>=жaMpT&HideDockedTitlebarJHide Title bar when window is docked N'D)L-N'D)L-MinimizedBHJWindow Is Minimized into Blue Handle ϕ`&FSx9wϕ`&FSx9wSizeLockPrevent horizontal and/or vertical size change. 0x01 - horizontal, 0x02 - vertical˽OS˽OSDispTitleText,Display Titlebar Text Ī8mݧC>!7Ī8mݧC>!7SmallerTabs*Display smaller Tabs (XFҦV"&|_ DkJHx(V@WBXPjKɸtEmk~_Lb.8M0cryN{485B725E-A69D-4AD5-A876-B3BBA72D2C0A}[FB%n*j\q^2FII3wK8Y8O#=gtM6*Mv4 [GDJMRÒGbDeC 1f$I `7{Q !aOt Ī8mݧC>!7obFFJL}I)LL !v43N t (XFҦV>g'JNjn*pFBCX@1@?^^Dy_N>G19@'s*O΢C}N{5FDDFE6E-518F-464A-B4B9-8D24B556E36C}˽OS-pϗO 0)mz!OHwc ϕ`&FSx9w>=жaMpTF L$3j^G@!,2bOdA)f 6^r[HJv-, ^r[HJv-, %]GJ7ψ>-MD'zZKXtO L?V{N7l VG))jHET~൱D@ j#^cN'D)L-86*n^HD9t |7EId KTLA7~f^r[HJv-, | Toolbar.;]kI 忞@"Pڝ 4W}@O{$n_<&KES Qn_<&KES Q NameItem nameo(K ]p do(K ]p dHelpTextHelp text8Cechg8Cechg RowsToolbar RowsNL {NL {$Dimension$Toolbar dimension$Z_IFL!OSZ_IFL!OSHorizontal Horizontal Flag .S)A2UЍc.S)A2UЍcIsSubToolbar$IsSubToolbar Flag =JM@hM Q3=JM@hM Q3IsImportant2IsImportant Toolbar Flag .UuwO e.UuwO eIDToolbar ID'0#ԪC'X/9}'0#ԪC'X/9}$ IndexItem Index$_N>G1JdWJc~JdWJc~PrototypePrototype name<9BH@b\<9BH@b\IsMinimizedPTrue/False flag if toolbar is minimized m O1Wwm O1Ww$IsAspectT(Aspect Toolbar Flag $(XFҦV".UuwO e'0#ԪC'X/9}m O1Ww=JM@hM Q3 (XFҦV>g'JNjn*pFBCb@ f@?_N>G1Z_IFL!OS NL {JdWJc~8Cechg.S)A2UЍc n_<&KES Qo(K ]p d<9BH@b\ R/$ķKniaW  gridArrayButton'0#ԪC'X/9}]8teO?s]8teO?s"MaxItemTxtHeight.Maximal item text size% sH?DC sH?DCTagTag%IlfāA>ˁwIlfāA>ˁwTagAliasTag Alias%/ru|GF0/ru|GF0AgentIDUpdate agentID(XFҦVLE2Data, 1"-1OSM n".;]kI 忞@" 4W}@O{$n_<&KES Qo(K ]p dQm6l3Ll/V^Qm6l3Ll/V^CommandAction commandN="QEj%:N="QEj%:RClickCommand,RClick Action Command$ܿORE bi$ܿORE biPreview2D8Item preview 2D resource id*S]?G[~x;*S]?G[~x;Preview3D8Item preview 3D resource idSr)B8Sr)B8Package"Package class idDNOQsP'ѭDNOQsP'ѭBitmap.Item preview 3D bitmap eSBgciDsL[wiDsL[wRadio Group(Radio buttons group4E*4E*ControlID2D&User Control ID 2Dh>ǑJ]@<h>ǑJ]@<ControlID3D&User Control ID 3D+fyOA7XC+fyOA7XC MaxItemBmpWidth2Maximal item bitmap sizeTl@fC.^&GZTl@fC.^&GZ"MaxItemBmpHeight2Maximal item bitmap sizeh0OY~ C h0OY~ C  MaxItemTxtWidth.Maximal item text size%?Aυ D)7t?Aυ D)7tGrayPercentxGray icon about specified percents if it is not highlighted][D+Iv(][D+Iv( MenuAct As Menu 8{Nm(!8{Nm(!IsMenuButtonIs Menu Button ko6ǑJ]@<N{2BBC850E-6EEF-4364-9265-A4A606AE464B}N="QEj%:4Node.Value("/Scripts/CustomCommands/gridArrayScript/rectangleGridTemplate","worldcoord")=0;Activity.Run("/Scripts/CustomCommands/gridArrayScript/doGrid")$ܿORE bi//ru|GF0N{00000000-0000-0000-0000-000000000000}+fyOA7XC(XFҦV>g'JNjn*pFC`b@v@p8B?8{Nm(!][D+Iv(ko6ˁw?Aυ D)7tUTl@fC.^&GZo(K ]p dgrid array - let click for world coord grid, rt click for local space grid]8teO?s.;]kI 忞@Sr)B8-1OSM n 럆L<_ї0DNOQsP'ѭeSBgcs TC:\Users\Clint\Pictures\gridArrayIcon.bmp o(C{m xViLTg6mVCQQafXeBMu)nJ-AAexol&. ""UHEqE*((H4QBxy{~Qq cx)WU0`b1˵N˼Rr8Zb)wakCtI=-0qS#U+k#wOylDwyTcIn = F J`8$ᇚB.Dqu,1(׼!Z ?n{5*@R S&Ub Rk!> Xoiu7/ [IoOK]d QN3LcP հL۰:HO<+!>ӭ0X-WaA'KV|f2Y{"l*ݰoea+{ =av$i5| ڗ㘳0q!Lq,`WI޺ze?TaQځOI!/he؜l.!lg?$s qay_"M;K: cԙ#.v2Vm%Nm.fɯf݅j% H O0)Xg(&T$ih涂 1ZE/Cn7LArTyv3P0|U?Ӓo+#_`|czuP815`q`z |GG.ޗ@&jar5;A~! +0Zu$T@}$fHQĭ/D/@,@o?L#` >)iT1FxFPfA\`<j.`^xJ-7UP_ 4r#Sk`dwzH.(œp&}lpu0.}V9MMyNhe15pCi?̲08O3 ~T)FJBh gKg4@Qi-vb& }p 쯐/|!_zb ͇$1R2)uwYG )[ '@^aln |bT@֗dC ,RjHa q^;:2/o!%.t[6BP ym1uW(b ,,3BRL#}Y#C 1BQqW?o{.QV0*1/0M(yN%'l>yj+Q;&/e&,[Ww-8~=sUhM]oH[)ڼasؗ_(bcJ|y^U)yaƄqMi܀6cJ3GVK g/+x uZS+5Sq;]vH42os|J sH?DC 48@J g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ % 4W}@O{$(XFҦVLE2Data, 1#J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 22|=Bynj2|=Bynj Control OutTransitionOutz@Hoz@Ho Control InTransitionIn 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); button1 = "gridArrayButton"; theScript = "gridArrayScript"; // if(Node.Exists("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1)) { replaceLeft = System.Question(button1 + " button already exists in the toolbar. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1); else return; } //check for and create customframe if(!Node.Exists("/Project/Windows Manager Space/CustomFrame")) Node.Copy(owner + "/CustomFrame","/Project/Windows Manager Space"); //copy buttons to custom frame oldButt = Node.Copy(owner + "/" + button1,"/Project/Windows Manager Space/CustomFrame/Toolbar"); //copy script to custom commands //create CustomCommands if(!Node.Exists("/Scripts/CustomCommands")) { temp = Node.Create("Kernel Package/Object","/Scripts"); custcom = Node.Rename(temp,"CustomCommands"); } if(Node.Exists("/Scripts/CustomCommands/" + theScript)) { replaceLeft = System.Question(theScript + " script already exists. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Scripts/CustomCommands/" + theScript); else return; } Node.Copy(owner + "/" + theScript,"/Scripts/CustomCommands"); //activate it WindowsManager.Activate(); WindowsManager.UpdateWindowsStructure(); //reset the toolbar //1D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 1); //2D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 2); } NScript Object Package/jScript language 4W}@O{(XFҦV>g'JNjn*pn7C`b@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ Ca8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Ca:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=  gridArrayScript .;]kI 忞@"P P 4W}@O{$(XFҦV"-1OSM n"(XFҦV>g'JNjn*pF/D@f@@@uCsC?-1OSM n 럆L<_їˬDefault GFʠN= ,}} version 1.0Z`Ez]UO}} 48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand>// doGrid // convert a scene object to a rectangular grid object // December 2 2010 // Clinton Reese clintons3d.com // // Execute // Called to execute the command function Execute(params) { //owner of this encapsulator owner = System.ThisOwner(); //the selected node firstsel = Node.FirstSelected(); //the owner of the selected node firstselowner = Node.Owner(firstsel); //scratch working matrices workMatrix = System.CreateDO("Math Package/Matrix Float Data"); workMatrix2 = System.CreateDO("Math Package/Matrix Float Data"); //be sure selection has a wldmatrix connector if(!Node.ConExists(firstsel,"WldMatrix")) { System.Alert("Not a valid selection"); return; } //copy grid to the owner of the selected object thegrid = Node.Copy(owner + "/rectangleGridTemplate",firstselowner); //note if object ownermatrix is connected and to what - take encapsulation into account ownermatcount = Node.LinkedInputNodeCount(firstsel,"OwnerMatrix"); if(ownermatcount>0) { ownermatnode = Node.LinkedInputNode(firstsel,"OwnerMatrix",0);//full name, index 0 } else ownermatnode = ""; // //local coord mode // // if(!Node.Value(thegrid,"worldcoord")) { //transform array to the objmatrix //first remove scale from the selected object's local transform workMatrix = Node.Value(firstsel,"ObjMatrix"); workMatrix.SetScaleX(1); workMatrix.SetScaleY(1); workMatrix.SetScaleZ(1); Node.Value(thegrid,"Matrix") = workMatrix; //move the selected object into grid node //theoriginal = Node.Move(firstsel,thegrid); //must copy and delete because move results in an empty node theoriginal = Node.Copy(firstsel,thegrid); Node.Delete(firstsel); //clear the object matrix //except for scale workMatrix.LoadIdentity(); workMatrix2 = Node.Value(theoriginal ,"ObjMatrix"); workMatrix.SetScaleX(workMatrix2.GetScaleX()); workMatrix.SetScaleY(workMatrix2.GetScaleY()); workMatrix.SetScaleZ(workMatrix2.GetScaleZ()); Node.Value(theoriginal,"Matrix") = workMatrix; } // //world coord mode // if(Node.Value(thegrid,"worldcoord")) { //translate array to the selected object workMatrix = Node.Value(firstsel,"ObjMatrix"); workMatrix2.LoadIdentity(); workMatrix2.SetTransX(workMatrix.GetTransX()); workMatrix2.SetTransY(workMatrix.GetTransY()); workMatrix2.SetTransZ(workMatrix.GetTransZ()); Node.Value(thegrid,"Matrix") = workMatrix2; //move selected object into grid encapsulator //theoriginal = Node.Move(firstsel,thegrid);move result empty node theoriginal = Node.Copy(firstsel,thegrid); Node.Delete(firstsel); //set local translation of the object to (0,0,0) workMatrix2 = Node.Value(theoriginal,"ObjMatrix"); workMatrix2.SetTransX(0); workMatrix2.SetTransY(0); workMatrix2.SetTransZ(0); Node.Value(theoriginal,"Matrix") = workMatrix2; } // //both local and world coord // //connect the object owner matrix to the grid world matrix Node.ConnectTo(thegrid + "/Transform", "WldMatrix", theoriginal, "OwnerMatrix"); //rename the original mesh object newname = Node.Rename(theoriginal,"meshObj"); //remove cone object placeholder Node.Delete(thegrid + "/Cone"); //connect grid to ownermatrix if needed if(ownermatnode!="") { Node.ConnectTo(ownermatnode, "WldMatrix", thegrid, "OwnerMatrix"); } //rename the grid thegrid2 = Node.SafeRename(thegrid,"rectangleGrid"); //run the update to initialize the array Activity.Run(thegrid2 + "/update copies"); //select the grid and open the panel view Node.Select(thegrid); UserInterface.OpenToolPanelViewEx2("" , "" ,thegrid2, 3,1,0) } NScript Object Package/jScript language~൱Dl@#^c4W}@O{(XFҦV>g'JNjn*pnC`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho ܂dKu= ,rectangleGridTemplateP .;]kI 忞@"P  ! % ) - 0 Pc Pg Pk Po Ps Pw P{  P P Ќ В 4W}@O{$P ׊;Jf|ڢ׊;Jf|ڢBWldMatrixWorld matrix `^02eE{|@R 偢jD%~`8偢jD%~`8BObjMatrix Object's matrix `^02eE{|@RP WAGWAGOwnerMatrixOwner's matrix `^02eE{|@P <ĠF姁J]<ĠF姁J]DMatrix,Object's input matrix `^02eE{|@T (XFҦV"-1OSM n"P 찣>F.TF찣>F.TFHeightMesh Height Pu _x15~HSe(sG_x15~HSe(sG Height segments2Count of height segments$ 7 P ,cLAp/,cLAp/ WidthMesh Width( P} Ɩ^?2ObHƖ^?2ObHWidth segments0Count of width segments, 8 P [irH%}J[irH%}J DepthMesh depthPb Py ZK=nʼZK=nʼDepth segments0Count of depth segments6 Pf P wBF.TF@偢jD%~`8(XFҦV>g'JNjn*pF(B5k@w@C?wB0[T?UiS=~99PT=?-1OSM n 럆L<_їIDefault clean  GFʠN=X1 }}<ĠF姁J]Z`Ez]UO GFʠN= X1 }}WAGZ`Ez]UO GFʠN= 0X1 }}偢jD%~`8Z`Ez]UO GFʠN=0@X1 }}׊;Jf|ڢZ`Ez]UO GFʠN=0pHX: yz Depth (Y)[irH%}JƄvR^I҂{iks1釥GP>ap0HX0 }}[irH%}JZ`Ez]UO GFʠN=pX: yz Depth (Y)ZK=nʼƄvR^I҂{iks1釥GP>apX0 }}ZK=nʼZ`Ez]UO GFʠN=Hp`X; ww Height (Z)찣>F.TFƄvR^I҂{iks1釥GP>apH`X0 }}찣>F.TFZ`Ez]UO GFʠN=pX? wys Height (Z)_x15~HSe(sGƄvR^I҂{iks1釥GP>apX0 }}_x15~HSe(sGZ`Ez]UO GFʠN=p0X> vwM Width (X),cLAp/ƄvR^I҂{iks1釥GP>ap0X0 }},cLAp/Z`Ez]UO GFʠN=xpX> wyM Width (X)Ɩ^?2ObHƄvR^I҂{iks1釥GP>apxX0 }}Ɩ^?2ObHZ`Ez]UO GFʠN=pX; }} worldcoordwBfdN*5ՒhpX, }}wBF.TFZ`Ez]UOPN AnqH0HX5 }}[irH%}JZ`Ez]UOPN AnqHxXB}}Ɩ^?2ObH?<F=Z`Ez]UOPN AnqHXB}}_x15~HSe(sG?<F=Z`Ez]UOPN AnqHXB}}ZK=nʼ?<F=Z`Ez]UO AϠOsX`xX-}}SegmentsZ`Ez]UO AϠOsXX)}}SizeZ`Ez]UO GFʠN=X!}}Z`Ez]UOOˁ CRih[ X}}TActivity.Run('%THIS_NAME%' + "/cleanIt");4convert to ordinary groupZ`Ez]UOOˁ CRih[ X}}NNode.Select('%THIS_NAME%' + "/Plane");0select the control meshZ`Ez]UO GFʠN=P`X,}} version 1.0Z`Ez]UO GFʠN=(X=}}only rotate the control meshZ`Ez]UOOˁ CRih[ 0HX}}VActivity.Run('%THIS_NAME%' + "/fillItUp");$fill in the holesZ`Ez]UO}}}}ZK=nʼ܂dKu=  Cone  .;]kI 忞@" P P P 4W}@O{$ G?ŋ G?ŋ tSObjLtrueSpace object synchronization data W5f@(䐈Z + п9  ׊;Jf|ڢZ` + п9 P 偢jD%~`8Z WAGP P <ĠF姁J]\ $1&KߊPV$1&KߊPV$AutoShowPanelAutoShowPanel$P -V?XM%-V?XM%Material ListMaterial List +N⩊` (XFҦV"-1OSM n" -V?XM%偢jD%~`8(XFҦV>g'JNjn*pF DCb@ b@?׊;Jf|ڢWAG G?ŋ~0iV@KU>x%g'JNjn*pFB BX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї0{`D@}㒱 Cone primitive P tveDCE`"IWJPBP *tL V0*Pt*tL V0*PRadiusTop"Top radius valueP P 1)ps6DU9rLt1)ps6DU9rLRadiusBottom(Bottom radius valueP @,G8R(t@,G8R(HeightMesh HeightP P H=1Gn@`U)tH=1Gn@`U) Radial segments.Count of side segmentsP DMN{ g;tDMN{ g;Cap segments4Count of top cap segmentsP P [T}lAuܿxjt[T}lAuܿxj Height segments2Count of height segmentsP  BƆK``;a!tBƆK``;a!SliceRadial,Radial slice to angleP P 4W}@O{$(XFҦV"-1OSM n" *tL V0*P>[T}lAuܿxj(XFҦV>g'JNjn*pFC Bb@ b@?@,G8R(?-1OSM n 럆L<_ї% Default GFʠN=p@P7 }}Height[T}lAuܿxjZ`Ez]UO1釥GP>apP`0 }}[T}lAuܿxjZ`Ez]UO GFʠN=p = }} RadiusBottom1)ps6DU9rLZ`Ez]UO1釥GP>ap 0 }}1)ps6DU9rLZ`Ez]UO GFʠN=p: }} RadiusTop*tL V0*PZ`Ez]UO1釥GP>ap0 }}*tL V0*PZ`Ez]UO GFʠN=8@pP7 }}RadialH=1Gn@`U)Z`Ez]UO1釥GP>a8P``0 }}H=1Gn@`U)Z`Ez]UO GFʠN=08@< }} RadialSliceBƆK``;a!Z`Ez]UO1釥GP>a0@0 }}BƆK``;a!Z`Ez]UO GFʠN=@P4 }}CapDMN{ g;Z`Ez]UO1釥GP>aP`0 }}DMN{ g;Z`Ez]UOPN AnqHP`>[T}lAuܿxj?K?Z`Ez]UOPN AnqH >1)ps6DU9rLK>Z`Ez]UOPN AnqH>*tL V0*PK>Z`Ez]UOPN AnqH`Pp`>H=1Gn@`U)@@K?Z`Ez]UOPN AnqHP`>DMN{ g;K?Z`Ez]UO GFʠN=@8`)}}SegmentsZ`Ez]UON\q+nN-K^80@A\VVv@BƆK``;a!Z`Ez]UOY@ GFʠN= p01 }}@,G8R(Z`Ez]UO1釥GP>ap 00 }}@,G8R(Z`Ez]UOPN AnqH 0>@,G8R(K>Z`Ez]UOtveDCE`"IWJ1)ps6DU9rL?H=1Gn@`U)DMN{ g;BƆK``;a!C܂dKu=T Material List .;]kI 忞@"P  P 4W}@O{$ -V?XM%P -V?XM%) 6G% ,Material List ManagerP -V?XM%P  &zB}J?t&zB}J?&Active material ID2Active material class IDP P 4W}@O{$ AXF  LeWtAXF  LeWMat Chunk 0BDynamic material input connector |E8yP -V?XM%&zB}J?AXF  LeW܂dKu= Material 0P .;]kI 忞@"P P  4W}@O{$P gYأC۲+?gYأC۲+?Material ChunkMaterial Chunk |E8y gYأC۲+?b=h0CRf 0Material Flavor Manager gYأC۲+?PP P !EJGWMt!EJGWMMaterial IndexMaterial Index  6~qK;2t&t6~qK;2t&Active Info4Active and validity flags NOI/)[& P 4W}@O{$ ?.9>DGl{?t?.9>DGl{?Mat Item 0BDynamic material input connector !EJGWM?.9>DGl{?6~qK;2t&NOI/)[&2/ChˢjCgYأC۲+?~wC쇀D  Solid P .F_P#T.F_P#Material Output material __W8E#(  n%⟀A}aJtn%⟀A}aJDiffuseColorDiffuseColor -n,NjlpgP P >]zJ4 t>]zJ4 (VertexColorStrength(VertexColorStrengthP  J.HE /*gtJ.HE /*gShininessShininessP P 8VnZN:W pt8VnZN:W p DiffuseStrength DiffuseStrengthP  ll-#Ez k^tll-#Ez k^"SpecularStrength"SpecularStrengthP P K#uiL$tK#uiL$AlphaTestAlphaTest :KrbSxP  ,L?D}t,L?D}AlphaTestValueAlphaTestValueP P 4W}@O{$J.HE /*g?>]zJ4 n%⟀A}aJ-n,Njlpg????.F_P#,L?D}ll-#Ez k^K#uiL$:KrbSxbDisabledEnabledAs OpaqueDisabled8VnZN:W p?47m2O L Transform <ĠF姁J]pD P P WAGpP  偢jD%~`8PB P ׊;Jf|ڢPBP  P3  4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pF9Cb@@T@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї0 5@(l .Height Watch Dog EventP 2|=BynjPp 8ffNzw̮8ffNzw̮Change detect.Change detection inputz@Ho! 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG asvHhTG$NodeIconNodeIcon eSBgc$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFWCBb@S@? asvHhTGeSBgc|<  o(C{m<<x}XT9`1~ޘx{[b7j{oXb/REAT@AP`TD{y˙s55<9032]]e3g-HH4k W޾ ?oߊ^}[:t~[b͘ '7/d7hQ hGQ+$&rL2 Q'P`FƢmTs<S_^⊊t7P|WJMɨunF&w5w,l7ݏ#Q5> Q@2m9On#gh4W JZ$5T"*I5(URUJPt{¿,Pv/?Id"ʅ@PtQ+0z"-0e t6ч#WPh?9`޼aIxVD֭u0~YA`2͛wt9' AӁQ{'Svmҍ*95o{B(eʇBٞۃ1 c] dk=)T8 l~h F|^E}Xs#vpj(wD?Fd+;B`klV+Xk6yR٘j:ٌwcr(ߤt(ţ䁳(v6a59k.tۅa x&}4 b} f +og$9$H1ܺ͛;qv\4\83q,a.AX[a,ẍ́F ,wg0f Cߑ!PK.(=g1> EQaOu߆ W|#QE;*m G>W?Z5ń8x8 ^w")8${?Vz7pw3p{t內7A'H/N&Xp4N^Xi ǣ(V _e|Hxo)|wo" 4$d[E65nɫr t9$wIҐ;FheA$ېs97M/<ēkxtq_uS9>ĕGY 6:9[; ߍ_ׅ(ܡ'>\I((ލ)LoL[NPTK6Cm-ԪSp‘OHgzO .=w 疷 s)^Lz>ӕʽ w\](>0= SdЏ(Tr*Pvt Cɽ2 /]bQlj%|0~qٳ"7pg~pN'9Aǐ죧wC<GoN{M{1뫮¯\:{N [I,1a*icBQnޗbêC엮ױ)rP~Uk?լ'#|A0Jr$N {Ǔ?<ݽ/l?sٿW zu@҅'\;C׏O ,voGJ9ٗQ~ ŃDGծjk&1gPTYEs` HF!|@;u  /W>qkw6)w\5xYe6 Cὐx4ڴӭ|M-㖭EC~*y@ ~k7w$3>:l~[ؼƢ«q.e3h݉J(5t"ʐ >L),<<Umi<[kɟc/ 'uIu$/Ӌu S>`z2>hXj(b'Qocq_lhyj_F(R>. ͳq܈i8poys{g>yoÖSHOw:Rs:`; [xȫ ^ s(NZFیy(֡Jq~o˔pԹ5#6lޓbYؿ۹ƽZkkvϰߗvqx3~|!{ (g5")>0?Սy‹:q[\m3?3 N̮8dhiPj8Vy΂+&H o剺 @B(o`,cI5<|gr@ ` gk:VRʬ߆'߽YV4 Db*Uu ??|Nz30m^E:CfeA{Ⱦp8a1_Oo5Ɵsݳ^SUNeR|/Nυ>&U>9;LHrxluUbc3ݸszY`}`anՇBTX7m Sٝ/_^,c3˜I$yQRct:ҁl _#d}u,p_̾b1f cWtg7tLZ)Pco4.,xll}к=5dk6ad{n;8ZJ>qk4anui)$'0慯z26N^3k\_(UE)ەPB}f >`F~%E ,r6nXWp3{x3>ʀ7LH.:z%׊izŇ}<~[Xg<<|F6RiF`֡JGX99b@Jj]ѡtyp4l%پX#VOy8{5><)pzl]Or1<>!z@ԃ3@ rs? P>8 ?/Qr&96n[1|ͯ1!$KrZ8~J{Q#r뀎sz`#0^u@ZnW^}.]W Qj5!x{s9`ž0Թ|l-~rYH[Fkgkk,f9 r.u쨴Dz|$0p\~|:0@> }-+estY1} R7RB̏h &X9!;Y/2b`QaGwM&ʄ$# bvD>3+fke7X=:>Z&Lrb>00ϔ|97e8.c,DXf8Xx_^\u}ӝq,دjDAQb@m&O _w S4-zD¡xvS>w/R|5Bh Ov}C\c3tUz,}ygtb.ވDpߣmތozyx,<a,|ݩ%[vA̞q@y 1i){pgu|_E^yHʃe/[$wܕW =5Wt Y~II;Ba>gƹĀ|g aæY3PmJ+ךyK-4R}b_5 w/jZY}7xOMޖX^.ާ]>qh}@?~#1Ыօ_dylLuB5;ߓ7}Ȧ[oZ2ƫ>[lOek>i cGHMr<9:0KybXӅF:`R%H s& &dwyվ@~3"/ OÇ${!`S|]aMקF@[R$ĐPXK> GߨՄi 5~P2(omr<_WF{ *n?j8}lsƱw-zm_#]Ws=⟎ CS#+Uy8+rB;FJ;ɺ0G~IMkċ\'_k4'^CQlaTbr<_K'D韎hգ%\8<^̏y |.s/8]iƳNgqb])1>C]HGAy ,|g{W& O({~7=eb!ʯ؈~ûkdwټlAc8qg~9-?~ Oܑsd_'ھ#/bփ/倯?pj8m 1Pf[P~w,FShI`=~,q3iu?g>15S/}x=#yE5Ȗ:8]7j>@5`1b @ټ!vp:@nu'v'tùc͟ݡ!QSN'q?Y~uх9Oo5.1 !rtVe>,?ܒ%Lp@2n8`@#sfy逻aOy0=;0i,#ipFE{4o  -)!~^Ca6tt{xNsM{7?[mzIZւd_zSSYDx?in;r Qw95xfF"0ؿ^9'x^1h#?ress O [ b%zY\fo?{ ޗ"/ˋ!C[.B,èsP (ۢEALv6=hI.  =doK_էOg c 9#F~93p۳C͂ـ0A٠C|q} d|"];WR7[D/=;%1 z'sݫ~Xb??χ sq'&9iJ( qe1|5 8 ͯej)|ӿ =,p!iM_{Ntt W}9`?/~ zQ_g\yjU? G8BW PtWy}_ Ehu &Wa8yd9y|r/X,I:9gu\.H␻'yC3ܸ_h2k*T(|vRttͯnhDE:++eG`\bL:G~f =@la̸/z}]UʄPVtpC_c,~q=A2_g{/- d+oE8xKϒ|={0MG/K&{_b|'vN/f@GwWwksܓ En:aT}# /z:s8y::P<(*l 79V,VC;hp>5NDtf} >_uF>@= }=XwA. K_`< v[W= 7#m =b'~?yl}N{>@̧ kj>!;FoDKl؅»c?fYg E3 ϕ|αUكዧb=>x_@8L8To1G-_ٻ1rco˳A}t/콞(q(ttބF^3T^v=x= uA}]$,ϑz }K,0M"N/pkzg~~}_fPu:ZN†U8$`n?? 87Y.-OY7>WPZyƏh>}̯|b3nNkbFlFQgڙwDjcߔYv +gQ>H\pZ+l\\q8'̫/vov3e !HCiC,Ƚ\9Gq!~=U}epxoRZWK;0 j=A`qqit灲0ݫ$K=y"|Y?6H\Yfgx3>I%{vϰt+ؚNɻt%W~AL^W~ۋjF cU; t<1Yົ[y aP BN;]}:=F߿2sg]p~t>!6?:c!8Cev [8pD W&u #0>^w[ECqtG~Rm"`GWfK?c {/+}G`/~gz@VnݙH|c(+c·hOc[uḆw:(OX߄2 M݇lYu(_x&&P9wQ |z!'@wPtJ! ڲaɍȼgW)yE]uOW2w؀˙v3l4GQӀW_+w8e9{GR:Mʼn4/ܡi ٝ Q\Jؾo矾 OO2Y|q=c(E>o5-uyw,~&'W(=g(t`IV,20ԑϞP:.An(LKO8̺0j,FۏI7Q]T<1=NǶ#/ӽp֞*׏<|j8=qy̍yXd!U t57PmoQ[vmt\ .wu|ǜ~Z.WlWCny⻰ nwfA ",6f] P(9CZ_hrTAitP=/ԃّghy,1BI<d@ ]v[ P~ ˏ(֪ ?fzt ܏'/xA>p;,c᜴ v$^+<&?G8#5 G̍Hꏸ;zvpNŜ̫B̓Ot1'sÈ%o/פ7>w}>,&Y *Uesg9:`8-(YgL>el@*(PQė㗯Ex8'HGGvocpIمiC!f\[cujZp}z \/!n$"$"WR.fi 9N؟@='YH,ʴ9 ͻeCaό-1oz~=$^E>+v^+9(,2bۡws5+QR:fY3l/zEšj|~,<*{b5< vDV[^x_܋Cr9Wv":#3'$3k!!8B"8 _ú[W0:=raN%)zƁIOy7fͱG+0*pe/EY .>:]m;g{KRP|o(6識2(]h=w3{~- MATT>P<GT#)?d|/W4 B0qz ]?&fGοs8;gyz<+:; fSQ2mP~q9>@M{2JZ$@ut80(wAGG(=wW4gZ%cY׬ðj Go􋉀El FcTnELZGUjZɫVbrLf_&,׳އBvDf΅<̹2{~&P:ɇP{ (Ln>ǝ||?WNPUjePw&jP[Mx(ڽA0{",Auhn]ax.HJ:%*nN߂aF>q;'{Gw|9PgxρfSx5 >Pk+$--+p9߄5KdX.7r#03vf`y6M{#n/qg];ioAi:l~8Ԇ JnP-$ͭv=8;Io+=>MbH6OÔGl~꠭b;۩m,M!'R'웏"Gp4EݠTi5Z?1sY /Wlo^cpBxtc)2tAFw[Bn:̅t`à4PFZF&_w][.gև)_^`GbK"sgvʸP(W)+lk*Xߕao'x &}|՛l+ԪmQRsL:.Ŝyr^4J.U.H eqzemgk:*a +ZJ|Qhyץ \xxG=2<_{#ys~{Jy6LSݫP^bl.2:Uۣб ͻ.X: p^߽# {;Gg#L{^*s'_Avx^yFrFC3_+Pr}t3k }y~y,P~|>{o?@ Oٽt$j!ud5o7a/_/ (g:<ݦa uE1Av(S {uDݞk:^'{jdƓ'Q~ǰgu Pj@<+*j f|]Ms|}*qϱ2Jui> {oyn/!P*Ǿ+@f \mO>;^{KgqZ= p ۹+{:,W[ܞVg>a?8^QkuZ#*}Fb"n'Wݒ=L.ݟ|f<o|jP:C^^m;QQ[^%Y]G#;ZZtws}P[~0{^keMo'r{ľhNuڣtz$=lQގ^=|uyg矢xgsU^\O-'jzr'rq<rq|*ImI&YD14Y}^^Qٽ2.gqy~.gaثH& _E~;Pi+L2w6bn m3e'u}+SOu]pWX=c-g\o0c5=ۋnyyW =}Nn&_s\ﱜV,SX꺓Ϗ%^+}]/qxϓ8PoеOQ&]JG1{sSy} y~~T96PȅBU޿{8Z-׬r[Tn#M5:*Rnk]yAð#{9b.mٌu&Zg yS Tnmz`Xo*ibvj<f؟&Y}':b*(lVsNi68prkZ;y-ǂޝ)+ ^^_=>a;K>_bJ;x=W{n ެj|UKw^@XV{xw?{ {{0ݫ=a/빬7&ox^QӡX_j+c'oLeh`,ϟ'汘oV՛kL ,8fu{E=Ǟf3Ay-W=Qj[Ti jyoJ7*%Dg%:[Di(f-FD(xJo@3/8ffNzw̮@J@#QL>g'JNjn*pFBB`@P@?-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho 5@(l| @Height Segments Watch Dog EventP$ 2|=BynjP $ 8ffNzw̮z@Ho% 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFBCX@L@? asvHhTGeSBgc8  o(C{mJ@#QL>g'JNjn*pFBB`@P@?8ffNzw̮-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho 5@(l ,Width Watch Dog EventP( 2|=BynjPp ( 8ffNzw̮z@Ho) 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFWCCb@S@? asvHhTGeSBgc8  o(C{m8ffNzw̮@J@#QL>g'JNjn*pFBB`@P@?-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho 5@(l >Width Segments Watch Dog EventP, 2|=BynjP , 8ffNzw̮z@Ho- 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFACX@L@? asvHhTGeSBgc8  o(C{mJ@#QL>g'JNjn*pFBB`@P@?8ffNzw̮-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho܂dKu=D  PlaneP0 .;]kI 忞@"; @ B P PR PY 0 4W}@O{$ G?ŋ1 tveDCE`"IWJZЎ Д 1 п9 P2 ׊;Jf|ڢZ` 1 п9 2 偢jD%~`8ZPj P3 WAGP: 3 <ĠF姁J]\9 $1&KߊPV$4 -V?XM%` (XFҦV"5 L[> IkF:ǭJL[> IkF:ǭJB Pivot0Local coordinate system `^02eE{|@RP6 [irH%}JP> 6 ZK=nʼP@ P7 cCN!F)/cCN!F)/HeightMesh height> 7 4MBLt64MBLt6 Height segments2Count of height segments? P8 \5KZWDL&f\5KZWDL&f WidthMesh width= 8 XxEbN5 IkF:ǭJ偢jD%~`8(XFҦV>g'JNjn*pF.Db@q@?׊;Jf|ڢ[irH%}JWAGcCN!F)/XxEbN5x%g'JNjn*pFB BX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї08c+KjWNt Cube primitive P= tveDCE`"IWJPB1 = \5KZWDL&fpP= P> [irH%}JpP= > cCN!F)/pP= P? XxEbN5g'JNjn*pFCdBb@ `@?[irH%}JcCN!F)/XxEbN5a@P0 }}ZK=nʼZ`Ez]UO GFʠN=p0@7 }}Height4MBLt6Z`Ez]UO1釥GP>ap@P0 }}4MBLt6Z`Ez]UO GFʠN=80p@6 }}WidthXxEbN5a8@`P0 }}XxEbN54MBLt6?K?Z`Ez]UOPN AnqH`@pP>XxEbN5ZK=nʼ?K?Z`Ez]UO GFʠN=08P)}}SegmentsZ`Ez]UO GFʠN= p01 }}[irH%}JZ`Ez]UO1釥GP>ap 00 }}[irH%}JZ`Ez]UOPN AnqH 0>[irH%}JK>Z`Ez]UO GFʠN=p 1 }}cCN!F)/Z`Ez]UO1釥GP>ap 0 }}cCN!F)/Z`Ez]UOPN AnqH >cCN!F)/K>Z`Ez]UO GFʠN=p1 }}\5KZWDL&fZ`Ez]UO1釥GP>ap0 }}\5KZWDL&fZ`Ez]UOPN AnqH>\5KZWDL&fK>Z`Ez]UOtveDCE`"IWJ\5KZWDL&f4MBLt6ZK=nʼ܂dKu= Material ListPB .;]kI 忞@"PE F B 4W}@O{$PC -V?XM%4 (XFҦV"-V?XM%(XFҦV>g'JNjn*pFBBX@1@?) 6G% ,Material List ManagerPD -V?XM%PPC D &zB}J?pPD PE 4W}@O{$E w!OA7Dx1tw!OA7Dx1Mat Chunk 0BDynamic material input connector |E8yPD -V?XM%&zB}J?w!OA7Dx1܂dKu=< Material 0PF .;]kI 忞@"PI PN F 4W}@O{$PG gYأC۲+?E gYأC۲+?b=h0CRf 0Material Flavor ManagerG gYأC۲+?PPG PH !EJGWMpG H 6~qK;2t&pG PI 4W}@O{$I ?.9>DGl{?pG !EJGWM?.9>DGl{?6~qK;2t&NOI/)[&2/ChˢjCgYأC۲+?~wC쇀Dl  Solid PJ .F_P#T.F_P#Material Output material __W8E#(I J n%⟀A}aJpPJ PK >]zJ4 pPJ K J.HE /*gpPJ PL 8VnZN:W ppPJ L ll-#Ez k^pPJ PM K#uiL$pPJ M ,L?D}pPJ PN 4W}@O{$J.HE /*g?>]zJ4 n%⟀A}aJ-n,Njlpg????,L?D}.F_P#K#uiL$:KrbSxbDisabledEnabledAs OpaqueDisabledll-#Ez k^8VnZN:W p?"L2OƲ@5N  PivotN L[> IkF:ǭJPB5 PO <ĠF姁J]pDN PP O WAGpN PP PP ׊;Jf|ڢpBP 4W}@O{$(XFҦV"L[> IkF:ǭJ(XFҦV>g'JNjn*pFCeCb@@T@?׊;Jf|ڢWAG<ĠF姁J]`^02eE{|@B????u8DMhbE OwnerNameQ 6VPoint Size in Point rendering.R T \Eh{5t\Eh{5Points ColorLColor of points during the rendering. -n,NjlpgR PU "PbEGDߗrt"PbEGDߗr0Ignore mesh point color0Ignore mesh point color R U F?N dtF?N d.Ignore mesh point size.Ignore mesh point size R PV ]*qBCxt]*qBCxEdges opacityEdges opacityR V \J:I%7ut\J:I%7uEdges ColorEdges Color -n,NjlpgR PW iA޲1rIK>XtiA޲1rIK>X0Ignore mesh edges color0Ignore mesh edges color R W ,ot"AaYt,ot"AaY$Show hidden lines`Do not use ZBuffer in point and wireframe modes R PX ^RI8ÿRt^RI8ÿRShow backfaceslEnable two-sided rendering when Color mode is enabled R X çwH5#VtçwH5#V0Ignore layer attributesvDo not combine render attributes with layer defined values R PY 4W}@O{ Owner%J@#QLLE2Data-1OSM n-1OSM n#LayoutLayout 럆L<_їLayout#(XFҦVLE2Data, 1"P[ o[nfFto[nfF Overlay opacity Overlay opacityR [ zgGFohN)tzgGFohN)Overlay ColorOverlay Color. -n,NjlpgR P\ vhD zʔtvhD zʔ4Ignore mesh overlay color6Ignore mesh overlay color. R W0@zdW0@zd$VersionVersion$P] ȅ8vDCxZtȅ8vDCxZInvisibleInvisible flag R ] F+2MGtF+2MGCast shadows$Cast shadows flag R P^ I2GWM:).$tI2GWM:).$ Receive shadows Receive shadows R ^ mBޖw ptmBޖw pLayer index(Modeler layer indexR P_ fB #^tfB #^$Transparency Mode@Quality of transparency solving :KrbSxR _ |$}mK;)t|$}mK;) OverlayEnable*Enable color overlay  R P` rg@*oHtrg@*oH OverlayColor*Color of the overlay -n,Njlpg R ` !eLZE^Nt!eLZE^N OverlayStrengthJStrength (visibility) of the overlay R Pa pSLDMF:ɅpSLDMF:ɅDObject_NameObject_NameDzgGFohN)I2GWM:).$ ]*qBCxS $hKnPSVmvhD zʔçwH5#V rg@*oH4W}@O{\J:I%7u-n,Njlpg???\Eh{5-n,Njlpg????fB #^:KrbSxv No Hidden FacesNo SortTriangle SortNo Sort(XFҦV>g'JNjn*pFC(Bk@ b@?pSLDMF:Ʌ/Project/Space 3D/rectangularGridScript/rectangleGridTemplate/PlaneF?N d 8Ns2]?ȅ8vDCxZ "PbEGDߗr F+2MG J@#QL>g'JNjn*pFzCCb@q@?(lrsGr?^mګA~Ksi[o[nfFW0@zdmBޖw p-1OSM n 럆L<_ї DefaultAdvanced! GFʠN=0@Ƃ1 }}F+2MGZ`Ez]UOͽ>fdN*5Ւh0@Ƃ, }}F+2MGZ`Ez]UO GFʠN= 0Ƃ1 }}ȅ8vDCxZZ`Ez]UOͽ>fdN*5Ւh 0Ƃ, }}ȅ8vDCxZZ`Ez]UO GFʠN=P`Ƃ1 }}mBޖw pZ`Ez]UO1釥GP>aP`Ƃ0 }}mBޖw pZ`Ez]UO GFʠN=@PƂ1 }}I2GWM:).$Z`Ez]UOͽ>fdN*5Ւh@PƂ, }}I2GWM:).$Z`Ez]UO GFʠN=Ƃ1 }}^RI8ÿRZ`Ez]UOͽ>fdN*5ՒhƂ, }}^RI8ÿRϱZ`Ez]UO GFʠN= Ƃ1 }},ot"AaYZ`Ez]UOͽ>fdN*5Ւh Ƃ, }},ot"AaYZ`Ez]UO GFʠN=@(P<6 }}Color\J:I%7uZ`Ez]UO B>I(@hP<%}}\J:I%7uZ`Ez]UO GFʠN=P(`<8 }}Opacity]*qBCxZ`Ez]UON\q+nN-K^(Ph`<A\VV?]*qBCxZ`Ez]UO` Y@ GFʠN=hP`<@ }}Enable Obj ModeçwH5#VZ`Ez]UOͽ>fdN*5ՒhP`<, }}çwH5#VZ`Ez]UO GFʠN=h 0<6 }}Color\Eh{5Z`Ez]UO B>I 0<%}}\Eh{5Z`Ez]UO GFʠN=h0@<9 }}Oppacity^mګA~Ksi[Z`Ez]UON\q+nN-K^0@<A\VV?^mګA~Ksi[Z`Ez]UO` Y@ GFʠN=h@P<5 }}Size(lrsGrZ`Ez]UON\q+nN-K^@P<A\VV?$@(lrsGrZ`Ez]UO`UUX@ GFʠN= (0<8 }}Opacity8Ns2]Z`Ez]UON\q+nN-K^( h0<A\VV?8Ns2]Z`Ez]UO` Y@ GFʠN=`hp<1 }}fB #^Z`Ez]UOnevG4'h`p<2fB #^Z`Ez]UO1釥GP>a0<0 }}pSLDMF:ɅZ`Ez]UO GFʠN=h <(}}SurfaceZ`Ez]UO GFʠN=h <'}}PointsZ`Ez]UO GFʠN=0h@<&}}EdgesZ`Ez]UO GFʠN=0<7 }}ObjectpSLDMF:ɅZ`Ez]UO,ot"AaY ^RI8ÿR |$}mK;)!eLZE^NiA޲1rIK>X  5@(l ,Depth Watch Dog Eventa 2|=BynjPp Pb 8ffNzw̮z@HoPc 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFBeCb@S@? asvHhTGeSBgc8  o(C{mJ@#QL>g'JNjn*pFBB`@P@?8ffNzw̮@-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho 5@(ld >Depth Segments Watch Dog Evente 2|=BynjP Pf 8ffNzw̮z@HoPg 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pF$BBX@L@? asvHhTGeSBgc8  o(C{mJ@#QL>g'JNjn*pFBB`@P@?8ffNzw̮-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho 5@(l 4ObjMatrix Watch Dog Eventi 2|=BynjP Pj 8ffNzw̮z@HoPk 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFiDBb@S@? asvHhTGeSBgc8  o(C{m8ffNzw̮J@#QL>g'JNjn*pFBB`@P@?-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandF // size update // update the physical dimensions of the array // Dec 2 2010 // Clinton Reese - clintons3d.com // // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); //return if template, not the actual array object snowner = Node.ShortName(owner); if(snowner == "rectangleGridTemplate") return; height = Node.Value(owner,"Height"); width = Node.Value(owner,"Width"); depth = Node.Value(owner,"Depth"); pivotMatrix = System.CreateDO("Math Package/Matrix Float Data"); objMatrix = System.CreateDO("Math Package/Matrix Float Data"); //update pivot pivotMatrix = Node.Value(owner + "/Plane/Pivot","Matrix"); pivotMatrix.SetTransX(-width/2); pivotMatrix.SetTransY(-depth/2); pivotMatrix.SetTransZ(-height/2); Node.Value(owner + "/Plane/Pivot","Matrix") = pivotMatrix ; //update matrix objMatrix = Node.Value(owner + "/Plane","ObjMatrix"); objMatrix .SetTransX(width/2); objMatrix .SetTransY(depth/2); objMatrix .SetTransZ(height/2); Node.Value(owner + "/Plane","Matrix") = objMatrix ; Activity.Run(owner + "/update copies"); } NScript Object Package/jScript language~൱D@ j#^c4W}@O{(XFҦV>g'JNjn*pn@DCb@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Hoͤ*EgbĬ, absValue2AEHM'ceZU@䑧r%Ps 4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#Pu G.I@mLEUtG.I@mLEUDplusminusDu u YED8Z`TYED8Z`B plusBP7 2AEHM'>g'JNjn*pFBC`@0@?G.I@mLEU@ceZU@䑧r[җJs@ 6NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var plusminus = params.ConValue('plusminus'); // TODO: put your computation here params.ConValue('plus') = Math.abs(plusminus); } NScript Object Package/jScript language|numberplusminusG.I@mLEUnumber plusYED8Z`4W}@O{YED8Z`(XFҦV>g'JNjn*pFB Cb@H@?.;]kI 忞@-1OSM n 럆L<_ї0ͤ*EgbĬ absValue, 12AEHM'ceZU@䑧r%Pw 4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#Py G.I@mLEUpDy y YED8Z`PBP6 2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ 6NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var plusminus = params.ConValue('plusminus'); // TODO: put your computation here params.ConValue('plus') = Math.abs(plusminus); } NScript Object Package/jScript language|numberplusminusG.I@mLEUnumber plusYED8Z`G.I@mLEU@4W}@O{(XFҦV>g'JNjn*pFCb@H@?YED8Z`-1OSM n 럆L<_ї0.;]kI 忞@ͤ*EgbĬ\ absValue, 22AEHM'ceZU@䑧r%P{ 4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#P} G.I@mLEUpD} } YED8Z`PBP8 2AEHM'>g'JNjn*pFBC`@0@?G.I@mLEU@ceZU@䑧r[җJs@ 6NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var plusminus = params.ConValue('plusminus'); // TODO: put your computation here params.ConValue('plus') = Math.abs(plusminus); } NScript Object Package/jScript language|numberplusminusG.I@mLEUnumber plusYED8Z`4W}@O{YED8Z`(XFҦV>g'JNjn*pFCDb@H@?.;]kI 忞@-1OSM n 럆L<_ї048@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandV // cleanIt // empty the array object converting it to an ordinary group node // Dec 2 2010 // Clinton Reese - clintons3d.com // // Execute // Called to execute the command function Execute(params) { owner = System.ThisOwner(); snowner = Node.ShortName(owner); if(snowner == "rectangleGridTemplate") return;//protect templated version of the encapsulator // //delete all the array nodes, scripts and watchdogs // Node.Delete(owner + "/update copies"); Node.Delete(owner + "/size update"); Node.Delete(owner + "/Plane"); Node.Delete(owner + "/absValue"); Node.Delete(owner + "/absValue, 1"); Node.Delete(owner + "/absValue, 2"); Node.Delete(owner + "/ObjMatrix Watch Dog Event"); Node.Delete(owner + "/Depth Watch Dog Event"); Node.Delete(owner + "/Width Watch Dog Event"); Node.Delete(owner + "/Height Watch Dog Event"); Node.Delete(owner + "/Depth Segments Watch Dog Event"); Node.Delete(owner + "/Width Segments Watch Dog Event"); Node.Delete(owner + "/Height Segments Watch Dog Event"); Node.Delete(owner + "/Coord Watch Dog Event"); Node.Delete(owner + "/coord update"); Node.Delete(owner + "/fillItUp"); // //remove all the exported connections // Node.ConRemove(owner, 'Depth'); Node.ConRemove(owner, 'Height'); Node.ConRemove(owner, 'Width'); Node.ConRemove(owner, 'Depth segments'); Node.ConRemove(owner, 'Height segments'); Node.ConRemove(owner, 'Width segments'); Node.ConRemove(owner, 'worldcoord'); Node.Delete(owner + "/cleanIt");//can i delete myself? yes i can } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pnfC+D`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho 5@(l ,Coord Watch Dog EventЂ 2|=BynjP P 8ffNzw̮z@HoP 4W}@O{%J@#QL(XFҦVLE2Data, 1#-1OSM n" asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pF CDb@S@? asvHhTGeSBgc8  o(C{m8ffNzw̮ J@#QL>g'JNjn*pFBB`@P@?-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandF// coord update // update if the coordinate system is changed world<->local // also calls the update copies script after processing is complete // this has sticky operation - first change in coord checkbox has no effect, // but change 2 more times and then it mysteriously works // only works for array built from scene level item when switching from local to world // Dec 2 2010 // Clinton Reese - clintons3d.com // // Execute // Called to execute the command function Execute(params) { //owner of this encapsulator owner = System.ThisOwner(); //return if template, not the actual array object snowner = Node.ShortName(owner); if(snowner == "rectangleGridTemplate") return; //the grid array object thegrid = owner; //scratch working matrices workMatrix = System.CreateDO("Math Package/Matrix Float Data"); workMatrix2 = System.CreateDO("Math Package/Matrix Float Data"); //delete the copies numNotCopy = 4+7+1+3+1+2+1;//transform, point template, original, script, 7 watchdogs, script2, //3 absval, cleaner node, 2 coord conversion nodes, fillItUp //number of nodes in the grid array node numsub = Node.SubObjectCount(thegrid); //change in the number of nodes from the original one delta = numsub - numNotCopy + 1;//add one to cover the original mesh node //delete all mesh copies except the original one - for(i=1;i<delta;i++) { nodeName = thegrid + "/meshObj, " + i; Node.Delete(nodeName); } //disconnect the original mesh object Node.Disconnect(thegrid + "/Transform", "WldMatrix", thegrid + "/meshObj", "OwnerMatrix"); // //changed to local coord // // if(!Node.Value(thegrid,"worldcoord")) { //transform array to the objmatrix position //but first remove any scaling from mesh object workMatrix = Node.Value(thegrid + "/meshObj","WldMatrix"); workMatrix2 = Node.Value(thegrid + "/meshObj","WldMatrix");//save for later scale preservation workMatrix.SetScaleX(1); workMatrix.SetScaleY(1); workMatrix.SetScaleZ(1); //now the array matches the position and orientation of the original mesh in world space Node.Value(thegrid,"Matrix") = workMatrix; //clear matrix on object workMatrix.LoadIdentity(); //preserve scale workMatrix.SetScaleX(workMatrix2.GetScaleX()); workMatrix.SetScaleY(workMatrix2.GetScaleY()); workMatrix.SetScaleZ(workMatrix2.GetScaleZ()); //original mesh object has no rotation and no translation - will inherit from the array Node.Value(thegrid + "/meshObj","Matrix") = workMatrix; } // // changed to world coord // if(Node.Value(thegrid,"worldcoord")) { //set transalation of array to object workMatrix = Node.Value(thegrid + "/meshObj","WldMatrix"); workMatrix2.LoadIdentity(); workMatrix2.SetTransX(workMatrix.GetTransX()); workMatrix2.SetTransY(workMatrix.GetTransY()); workMatrix2.SetTransZ(workMatrix.GetTransZ()); //array has no rotation or scale but has the same location as the original mesh Node.Value(thegrid,"Matrix") = workMatrix2; //set translation object (0,0,0) workMatrix2 = Node.Value(thegrid + "/meshObj","WldMatrix"); workMatrix2.SetTransX(0); workMatrix2.SetTransY(0); workMatrix2.SetTransZ(0); //original mesh has it's translation set to 0,0,0 - rotation and scale unaffected Node.Value(thegrid + "/meshObj","Matrix") = workMatrix2; } //connect owner matrix for 3d encapsulation Node.ConnectTo(thegrid + "/Transform", "WldMatrix", thegrid + "/meshObj", "OwnerMatrix"); Activity.Run(owner + "/update copies"); } NScript Object Package/jScript language~൱D@ j#^c4W}@O{(XFҦV>g'JNjn*pnCDb@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J W5f@(䐈D8M1hs$ 8M1hs$ DobjectNameDЏ wBg'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ 8>NewCommandr<// fillItUp // fill the hollow spaces of the array // Dec 2 2010 // Clinton Reese - clintons3d.com // // Execute // Called to execute the command function Execute(params) { var pointmesh = params.ConValue('pointmesh'); var objectName = params.ConValue('objectName'); var worldcoord = params.ConValue('worldcoord'); myVector = System.CreateDO('Math Package/Point Data'); transVect = System.CreateDO('Math Package/Point Data'); points = System.CreateDO("Space 3D Package/Vertex Stream Data"); rawpoints = System.CreateDO("Space 3D Package/Vertex Stream Data"); rawpoints = pointmesh.GetVertices(); points = pointmesh.GetVertices(); pivotMatrix = System.CreateDO("Math Package/Matrix Float Data"); objMatrix = System.CreateDO("Math Package/Matrix Float Data"); finalMatrix = System.CreateDO("Math Package/Matrix Float Data"); origMatrix = System.CreateDO("Math Package/Matrix Float Data"); // TODO: put your action code here newmat = System.CreateDO("Math Package/Matrix Float Data"); idmat = System.CreateDO("Math Package/Matrix Float Data"); idmat.LoadIdentity(); owner = System.ThisOwner(); //return if template, not the actual array object snowner = Node.ShortName(owner); if(snowner == "rectangleGridTemplate") return; //read physical size of the array height = Node.Value(owner,"Height"); width = Node.Value(owner,"Width"); depth = Node.Value(owner,"Depth"); //no need to fill holes if one dimension is size 0 if(height==0 || width==0 || depth==0) return; //read number of segments in each direction heightSeg = Node.Value(owner,"Height segments"); widthSeg = Node.Value(owner,"Width segments"); depthSeg = Node.Value(owner,"Depth segments"); //not enough elements to create a hole if(heightSeg < 2 || widthSeg < 2 || depthSeg < 2) return; numcopies = pointmesh.GetNumVertices(); //create xyz arrays to build from //first get max and min xyz - hole values not at the extremes maxx = -10000; maxy = -10000; maxz = -10000; minx = 10000; miny = 10000; minz = 10000 for(i=0;i<numcopies;i++) { xval = rawpoints.x(i); yval = rawpoints.y(i); zval = rawpoints.z(i); if(xval > maxx) maxx = xval; if(yval > maxy) maxy = yval; if(zval > maxz) maxz = zval; if(xval < minx) minx = xval; if(yval < miny) miny = yval; if(zval < minz) minz = zval; } // //build arrays of all possible x,y and z values // xarr = new Array(widthSeg-1); yarr = new Array(depthSeg-1); zarr = new Array(heightSeg-1); //initialize the array indices curxi=0; curyi=0; curzi=0; small = 0.00001;//floats dont compare well so do differences for(j=0;j<numcopies;j++) { xval = rawpoints.x(j); yval = rawpoints.y(j); zval = rawpoints.z(j); //difference between x value and max and min x dmax = Math.abs(xval - maxx); dmin = Math.abs(xval - minx); if(dmax > small && dmin > small) { //not max or min so check against array value if(curxi==0) { xarr[0] = xval; curxi++; } else { //not found in x array yet found=false; //compare to previous values and if very close then it is found for(t=0;t<curxi;t++) { dx = xval - xarr[t]; if(dx < small) found=true; } //not found in the array so add it and update the index if(!found) { xarr[curxi] = xval; curxi++; } } } //difference between y value and max and min y dmax = Math.abs(yval - maxy); dmin = Math.abs(yval - miny); if(dmax > small && dmin > small) { //not max or min so check against array value if(curyi==0) { yarr[0] = yval; curyi++; } else { found=false; for(t=0;t<curyi;t++) { dy = yval - yarr[t]; if(dy < small) found=true; } if(!found) { yarr[curyi] = yval; curyi++; } } } //difference between z value and max and min z dmax = Math.abs(zval - maxz); dmin = Math.abs(zval - minz); if(dmax > small && dmin > small) { //not max or min so check against array value if(curzi==0) { zarr[0] = zval; curzi++; } else { found=false; for(t=0;t<curzi;t++) { dz = zval - zarr[t]; if(dz < small) found=true; } if(!found) { zarr[curzi] = zval; curzi++; } } } } // //build new points from all combinations of x,y and z arrays // holepoints = System.CreateDO("Space 3D Package/Vertex Stream Data"); holepoints = pointmesh.GetVertices(); numholecopies = (widthSeg-1) * (depthSeg-1) * (heightSeg-1); holepoints.SetNumVertices(numholecopies); //initialize the hole point index holei = 0; for(xi=0;xi<widthSeg-1;xi++) { for(yi=0;yi<depthSeg-1;yi++) { for(zi=0;zi<heightSeg-1;zi++) { holepoints.x(holei) = xarr[xi]; holepoints.y(holei) = yarr[yi]; holepoints.z(holei) = zarr[zi]; holei++; } } } //transform the points pivotMatrix = Node.Value(owner + "/Plane/Pivot","Matrix"); objMatrix = Node.Value(owner + "/Plane","ObjMatrix"); finalMatrix.LoadIdentity(); finalMatrix.SetPitch(objMatrix.GetPitch()); finalMatrix.SetYaw(objMatrix.GetYaw()); finalMatrix.SetRoll(objMatrix.GetRoll()); //transform the point values based on the point source local rotation for(m=0;m<numholecopies;m++) { //base point positions are offset by the pivot so that the point at index 0 is at the location of the source object myVector.x = holepoints.x(m)-pivotMatrix.GetTransX(); myVector.y = holepoints.y(m)-pivotMatrix.GetTransY(); myVector.z = holepoints.z(m)-pivotMatrix.GetTransZ(); transVect = finalMatrix.TransformPoint(myVector); points.x(m) = transVect.x ; points.y(m) = transVect.y ; points.z(m) = transVect.z ; } // //copy original mesh to the point locations // //pre-existing node count after only original object copied into the array encapsulator numNotCopy = 4+7+1+3+1+2+1;//transform, point template, original, script, 7 watchdogs, script2, //3 absval, cleaner node, 2 coord conversion nodes, fillitup node //how many nodes now numsub = Node.SubObjectCount(owner); //the original object to be copied orig = owner + "/meshObj"; //indicates the original object count - always one numorig = 1; //how many copies of the original are needed? //dont assume that they are not already in place deltacopy = (numcopies + numNotCopy - numorig) - numsub + numholecopies; //only do if extras to copy - prevent double run if(deltacopy > 0) { origMatrix = Node.Value(orig,"ObjMatrix"); for(i=0;i<deltacopy;i++) { //copy the original mesh node - copy will automatically name to the first free postfix numerical value cpy = Node.Copy(orig,owner); //create a new matrix based on transformed point locations newmat.LoadIdentity(); newmat.SetTransX(points.x(i)); newmat.SetTransY(points.y(i)); newmat.SetTransZ(points.z(i)); //add rotations to the matrix for world coord mode //local coord mode will inherit orientation if(worldcoord) { newmat.SetPitch(origMatrix.GetPitch()); newmat.SetRoll(origMatrix.GetRoll()); newmat.SetYaw(origMatrix.GetYaw()); } //preserve original scale values newmat.SetScaleX(origMatrix.GetScaleX()); newmat.SetScaleY(origMatrix.GetScaleY()); newmat.SetScaleZ(origMatrix.GetScaleZ()); //apply the matrix and connect to the group transform node Node.Value(cpy,"Matrix") = newmat; Node.ConnectTo(owner + "/Transform", "WldMatrix", cpy, "OwnerMatrix"); } } } NScript Object Package/jScript language~൱D@ j#^c6Space 3D Package/Mesh Datapointmesh >W5f@(䐈Ɍ{K`DLS stringobjectName8M1hs$ booleanworldcoord wBg'JNjn*pnoDCb@@X@2|=Bynj|?z@Hoۙ>?wBg'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?{K`DLS -1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?8M1hs$  Conez@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ ^INewCommandG// update copies // refresh the array based on input values and preexisting array elements // Dec 2 2010 // Clinton Reese - clintons3d.com // // Execute // Called to execute the command function Execute(params) { //the point mesh contains the points used as copy locations for the grid array elements var pointmesh = params.ConValue('pointmesh'); var worldcoord = params.ConValue('worldcoord'); objectName = "meshObj";//original object for the array myVector = System.CreateDO('Math Package/Point Data'); transVect = System.CreateDO('Math Package/Point Data'); points = System.CreateDO("Space 3D Package/Vertex Stream Data"); rawpoints = System.CreateDO("Space 3D Package/Vertex Stream Data"); rawpoints = pointmesh.GetVertices(); points = pointmesh.GetVertices(); pivotMatrix = System.CreateDO("Math Package/Matrix Float Data");//pivot of the point source objMatrix = System.CreateDO("Math Package/Matrix Float Data"); finalMatrix = System.CreateDO("Math Package/Matrix Float Data"); origMatrix = System.CreateDO("Math Package/Matrix Float Data"); newmat = System.CreateDO("Math Package/Matrix Float Data"); idmat = System.CreateDO("Math Package/Matrix Float Data"); idmat.LoadIdentity(); owner = System.ThisOwner(); //return if the template, not the actual array object in the scene snowner = Node.ShortName(owner); if(snowner == "rectangleGridTemplate") return; pivotMatrix = Node.Value(owner + "/Plane/Pivot","Matrix");//get the pivot of the point source object objMatrix = Node.Value(owner + "/Plane","ObjMatrix"); //local transform of the point source //get rotation values of the point source finalMatrix.LoadIdentity(); finalMatrix.SetPitch(objMatrix.GetPitch()); finalMatrix.SetYaw(objMatrix.GetYaw()); finalMatrix.SetRoll(objMatrix.GetRoll()); numcopies = pointmesh.GetNumVertices();//object will be copied to each point location //transform the point values based on the point source local rotation for(m=0;m<numcopies;m++) { //base point positions are offset by the pivot so that the point at index 0 is at the location of the source object myVector.x = rawpoints.x(m)-pivotMatrix.GetTransX(); myVector.y = rawpoints.y(m)-pivotMatrix.GetTransY(); myVector.z = rawpoints.z(m)-pivotMatrix.GetTransZ(); transVect = finalMatrix.TransformPoint(myVector); points.x(m) = transVect.x ; points.y(m) = transVect.y ; points.z(m) = transVect.z ; } //if any zero value sizes in the array definition then a new list for points needed //the array will have repeating point locations, so process to remove the repeats myVec = System.CreateDO('Math Package/Point Data'); myVec2 = System.CreateDO('Math Package/Point Data'); goodbad = new Array(numcopies); uncleannumcopies = numcopies;//original unmodified number of copies //read the physical dimensions of the grid array height = Node.Value(owner,"Height"); width = Node.Value(owner,"Width"); depth = Node.Value(owner,"Depth"); //start assuming all segment counts are zero //if any sizes are zero will compute as if segments are also zero heightSeg = 0; widthSeg = 0; depthSeg = 0; //dont allow an array with a single element if(height==0 && width==0 && depth==0) return; //if at least one dimension is zero process to remove repeating source points if(height==0 || width==0 || depth==0) { //if not zero read actual segment values, height, width and depth can go negative on the ui to invert the direction of the array if(height != 0) heightSeg = Node.Value(owner,"Height segments"); if(width != 0) widthSeg = Node.Value(owner,"Width segments"); if(depth != 0) depthSeg = Node.Value(owner,"Depth segments"); for(p=0;p<numcopies;p++) { //copy all transformed points back to rawpoints while testing for repeat values rawpoints.x(p) = points.x(p); rawpoints.y(p) = points.y(p); rawpoints.z(p) = points.z(p); //assume point is not repeating until proven otherwise - good point is true goodbad[p] = true; //no need to check first point for repeats if(p!=0) { myVec.x = rawpoints.x(p); myVec.y = rawpoints.y(p); myVec.z = rawpoints.z(p); for(i=0;i<p;i++) { //read previous point locations myVec2.x = points.x(i); myVec2.y = points.y(i); myVec2.z = points.z(i); //difference between current point and previous points dx = Math.abs(myVec2.x - myVec.x); dy = Math.abs(myVec2.y - myVec.y); dz = Math.abs(myVec2.z - myVec.z); //use threshold to compare float values if(dx<0.0001 && dy<0.0001 && dz<0.0001) { goodbad[p] = false;//small difference = same point so mark it as bad break; } } } } //copy first instance of each location to the beginning of the points stream and calculate a new number of copies //reduced value for the number of copy points numcopies = (depthSeg+1) * (heightSeg+1) * (widthSeg+1); //points.SetNumVertices(numcopies); //current index into the reduced point list curindex = 0; //look at each point ignoring the points at repeating location for(q=0;q<uncleannumcopies;q++) { //if a good point save it and update the index if(goodbad[q]) { points.x(curindex) = rawpoints.x(q); points.y(curindex) = rawpoints.y(q); points.z(curindex) = rawpoints.z(q); curindex++; } } } //pre-existing node count after only original object copied into the array encapsulator numNotCopy = 4+7+1+3+1+2+1;//transform, point template, original, script, 7 watchdogs, script2, //3 absval, cleaner node, 2 coord conversion nodes, fillItUp //how many nodes now numsub = Node.SubObjectCount(owner); //the original object to be copied orig = owner + "/" + objectName; //indicates the original object count - always one numorig = 1; //how many copies of the original are needed? //gives the change in the number of copies deltacopy = (numcopies + numNotCopy - numorig) - numsub ; //delete extra copies - number of array elements has been reduced if(deltacopy < 0) { //get range of postfix values to remove from the array encapsulator end = numsub-numNotCopy; start = end + deltacopy + numorig;//note negative delta added //original has no postfix, copies are "objMesh, 1" "objMesh, 2" etc. for(k=start;k<=end;k++) { nodeName = owner + "/" + objectName + ", " + k; Node.Delete(nodeName); } } //get fresh count after any deletion of nodes above numsub = Node.SubObjectCount(owner); //recalculate the change in the number of copies deltacopy = (numcopies + numNotCopy - numorig) - numsub ; //if no change or positive change in number of copies need to update existing node positions if(deltacopy >= 0) { origMatrix = Node.Value(orig,"ObjMatrix");//for world matrix calculations if array in world mode //move old nodes into new positions //if(numsub>numNotCopy) //{ for(j=0;j<=(numsub-numNotCopy);j++) { //create a new matrix based on transformed point locations newmat.LoadIdentity(); newmat.SetTransX(points.x(j)); newmat.SetTransY(points.y(j)); newmat.SetTransZ(points.z(j)); //add rotations to the matrix for world coord mode if(worldcoord) { newmat.SetPitch(origMatrix.GetPitch()); newmat.SetRoll(origMatrix.GetRoll()); newmat.SetYaw(origMatrix.GetYaw()); } //preserve original object scale values newmat.SetScaleX(origMatrix.GetScaleX()); newmat.SetScaleY(origMatrix.GetScaleY()); newmat.SetScaleZ(origMatrix.GetScaleZ()); //get the node name based on the index and apply the new matrix to it if(j==0) nodeName = owner + "/" + objectName ; else nodeName = owner + "/" + objectName + ", " + j; Node.Value(nodeName,"Matrix") = newmat; } //} } //if positive change in number need to add in the new copies if(deltacopy > 0) { //calculate the first index of the new copies start = numsub - numNotCopy + numorig; for(i=start;i<numcopies;i++) { //copy the original mesh node - copy will automatically name to the first free postfix numerical value cpy = Node.Copy(orig,owner); //create a new matrix based on transformed point locations newmat.LoadIdentity(); newmat.SetTransX(points.x(i)); newmat.SetTransY(points.y(i)); newmat.SetTransZ(points.z(i)); //add rotations to the matrix for world coord mode //local coord mode will inherit orientation if(worldcoord) { newmat.SetPitch(origMatrix.GetPitch()); newmat.SetRoll(origMatrix.GetRoll()); newmat.SetYaw(origMatrix.GetYaw()); } //preserve original scale values newmat.SetScaleX(origMatrix.GetScaleX()); newmat.SetScaleY(origMatrix.GetScaleY()); newmat.SetScaleZ(origMatrix.GetScaleZ()); //apply the matrix and connect to the group transform node Node.Value(cpy,"Matrix") = newmat; Node.ConnectTo(owner + "/Transform", "WldMatrix", cpy, "OwnerMatrix"); } } } NScript Object Package/jScript language~൱D@ j#^c6Space 3D Package/Mesh Datapointmesh >W5f@(䐈Ɍ{K`DLS booleanworldcoord wBg'JNjn*pnDCb@@T@2|=Bynj|?z@Hoۙ>?wBg'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?{K`DLS -1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho8ʯȥJH|o7 gH]kDwPFM`d8pM*#ͺO/tfѭ8Lwb"qQZgi