gH]kDwP|trueSpace7.6[VS_O93Y*I Clinton Reese, RUR`d8pM*#ͺOD$PNG  IHDR`ZIDATx1 0@1B>2z*Xyq]` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5k hpIENDB`/tfѭ8Lwb"qvx܂dKu=6doom3 MD5 Mesh Import v1.6(.;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects"HX8Xh}xμ!3X4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$-1OSM n-1OSM n"LayoutLayout 럆L<_ї"(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p"hNffMCONffMCODMyFileName\8[ ;@z@Hoz@Ho Control InTransitionIn` [jdOA#}[jdOA#}DstatusLine\#[jdOA#}TMD5MeshSkinning - MESH IMPORT IS COMPLETE(XFҦV>g'JNjn*p^BDC~@@\@tveDCE`"IWJ}? B?NffMCOvC:\Documents and Settings\Clinton\Desktop\pendulum.md5mesh-1OSM n 럆L<_їI  Default Asp4  GFʠN=F G5 }}MeNffMCOZ`Ez]UO1釥GP>aHG,NffMCOZ`Ez]UO GFʠN=X ? }}Me MyFileNameNffMCOZ`Ez]UO1釥GP>aX ,NffMCOZ`Ez]UO#nKSM2P@ $\VVNffMCOZ`Ez]UOOˁ CRih[P@ fActivity.Run('%THIS_NAME%' + '/MD5SkeletonImport')ImportZ`Ez]UO GFʠN=@ a}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO GFʠN=@`P 5 }}Me[jdOA#}Z`Ez]UO1釥GP>a`@P ,[jdOA#}Z`Ez]UOz@Ho_pG܂dKu=Tdoom3jointgeo H.;]kI 忞@"H%h+4W}@O{$ G?ŋ G?ŋ tSObjLtrueSpace object synchronization data W5f@(䐈Zsy Q׊;Jf|ڢ׊;Jf|ڢBWldMatrixWorld matrix `^02eE{|@Zrx y Q偢jD%~`8偢jD%~`8BObjMatrix Object's matrix `^02eE{|@ZpWAGWAGOwnerMatrixOwner's matrix `^02eE{|@p"P<ĠF姁J]<ĠF姁J]DMatrix,Object's input matrix `^02eE{|@\( 0-V?XM%-V?XM%Material ListMaterial List +N⩊s(XFҦV"-V?XM%偢jD%~`8(XFҦV>g'JNjn*pF4Cb@ b@?׊;Jf|ڢWAG`^02eE{|@B???? G?ŋl罸[Hq2>$?>^?>$"?>#!??UnitObRQOLayOLayeMat1Z)pa ?fff?ShBxZZplaincolourW5f@(䐈pH4W}@O{$VIQGіF͡T>W5f@(䐈ɬٸ*ćIC7lq2l=>l=[H=q2> h* 6H?BJ8{EE%D7[LjUb)R ʽt Aqry'HNű_,lLo '89Ig"$?&?^?{?$"??#!??ZpߘHXO YW?Yx>YW?Yx>YW?Yx>B[x?cnB[x>B[x?cnB[x>B[x?cnB[x>YWYx>YWYx>YWYx>qwB]zJ4 t>]zJ4 (VertexColorStrength(VertexColorStrengthO0SJ.HE /*gtJ.HE /*gShininessShininessOT8VnZN:W pt8VnZN:W p DiffuseStrength DiffuseStrengthOVll-#Ez k^tll-#Ez k^"SpecularStrength"SpecularStrengthOW4W}@O{$XK#uiL$tK#uiL$AlphaTestAlphaTest :KrbSxOX,L?D}t,L?D}AlphaTestValueAlphaTestValueOJ.HE /*g@@>]zJ4 n%⟀A}aJ-n,NjlpgLt'޽lL]>L NameShader namert4W}@O{$ u!agNc +At!agNc +Acolour0colour : Shader - Color -n,Njlpgr{[f(@-L*;'޽lL]>L plain!agNc +A-n,NjlpgLp{}4W}@O{$h~oF5SO/toF5SO/ambient factor@ambient factor : Shader - Model{{a>% AGJXs>{t{a>% AGJXs>{diffuse factor@diffuse factor : Shader - Model{f`e'O@tf`e'O@ specular factorBspecular factor : Shader - Model{A퉠C i 8tA퉠C i 8exponent4exponent : Shader - Model{Kj=N1RtKj=N1R specular colourBspecular colour : Shader - Model -n,Njlpg{oF5SO/f`e'O@='޽lL]>L phongA퉠C i 8@@r鷅wOq=0Kj=N1R-n,Njlpg????{a>% AGJXs>{fff? 7G5fT2PureLWDisplacementShaderHI˕XMӍJS9TI˕XMӍJS9,LWDisplacement_shader2Pure Displacement shader yᮍGM޴"l@'޽lL]>LpH 4W}@O{$'޽lL]>LI˕XMӍJS9 EvmE|Kc\\2PureLWTransparencyShaderPfO*EI,STfO*EI,S,LWTransparency_shader2Pure Transparency shader yᮍGM޴"i'޽lL]>LpPp4W}@O{$fO*EI,S'޽lL]>L܂dKu=䗹Skeletonؘ.;]kI 忞@"۹4Ip@vH4W}@O{$(XFҦV"-1OSM n"Ȝ׊;Jf|ڢZshy Q`偢jD%~`8Z<ĠF姁J]\׹WAG ٹ G?ŋ tveDCE`"IWJZ sy QS $hKnPSVmS $hKnPSVm"RenderAttributes"RenderAttributes HEoq5vsУd_@ cB8Ed_@ cB8ESkeleton*Skeleton data object [}Nj2P 2"IM6 Ex>"IM6 ExRot color(Rotation lock color -n,NjlpgƒsF2ƒsF2Dynamic LocksLSet of active locks for dynamic tools u|H '$H(IДl/(IДl/Show locksShow IK locks p('a#G @=^V("'a#G @=^V("Show handlesShow handles Pw`ZL. 5w`ZL. 5Show structure>Show skeleton joints and bones 0>"IM6 Ex-n,Njlpg%?>h>? 6Jѳ( S $hKnPSVmw`ZL. 5 'a#G @=^V(" 偢jD%~`8m6EfH-n,Njlpg???~?JmCb4IP}K^:KrbSxSolid defaultSolid diamondWire diamondWire thinSolid defaultd_@ cB8E(XFҦV>g'JNjn*pFgD~Ck@ a@5CC?n1LH_r-n,Njlpg!? ?>~? 2>'??WAG`^02eE{|@B????(IДl/  G?ŋfdN*5Ւh , v[IL'KIZ`Ez]UOͽ>fdN*5Ւh 0, (IДl/Z`Ez]UO GFʠN= p05 }}?(IДl/Z`Ez]UOͽ>fdN*5Ւhp 0, 'a#G @=^V("Z`Ez]UO GFʠN= 05 }}?'a#G @=^V("Z`Ez]UO GFʠN= 2}}? Show SkeletonZ`Ez]UOͽ>fdN*5Ւhp , w`ZL. 5Z`Ez]UOͽ>fdN*5Ւh8H, 6Jѳ(Z`Ez]UO GFʠN=8HX }}?#Use Character Editor color settings 6Jѳ(Z`Ez]UO B>IHHpX%\VVn1LH_rZ`Ez]UO GFʠN=HHX5 }}?n1LH_rZ`Ez]UO B>IHX%\VVm6EfHZ`Ez]UO GFʠN=pHX5 }}?m6EfHZ`Ez]UO B>IHXph%\VVq\7LO#Z`Ez]UO GFʠN=XHhB }}? Position lockq\7LO#Z`Ez]UO GFʠN=hHxB }}? Rotation lock>"IM6 ExZ`Ez]UO B>IHhpx%\VV>"IM6 ExZ`Ez]UO GFʠN=pXh> }}? Full lock졉E/~ݾZ`Ez]UO B>IXh%\VV졉E/~ݾñZ`Ez]UO GFʠN=phx%}}?Z`Ez]UO GFʠN=08%}}?Z`Ez]UOv[IL'KI q\7LO#-n,Njlpg>"?I??,$s47m2O L׹Transform׹<ĠF姁J]pDڹڹ ٹWAGpڹڹ偢jD%~`8PB`ڹ׊;Jf|ڢPBȜ/۹4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pFX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї, qU F3f2Object Render AttributesS $hKnPSVmP8Ns2]t8Ns2] Surface Opacity Surface Opacity`^mګA~Ksi[t^mګA~Ksi[Points opacityPoints opacity@(lrsGrt(lrsGrPoints Size>Point Size in Point rendering. \Eh{5t\Eh{5Points ColorLColor of points during the rendering. -n,Njlpg"PbEGDߗrt"PbEGDߗr0Ignore mesh point color0Ignore mesh point color F?N dtF?N d.Ignore mesh point size.Ignore mesh point size p]*qBCxt]*qBCxEdges opacityEdges opacityP\J:I%7ut\J:I%7uEdges ColorEdges Color -n,NjlpghiA޲1rIK>XtiA޲1rIK>X0Ignore mesh edges color0Ignore mesh edges color H,ot"AaYt,ot"AaY$Show hidden lines`Do not use ZBuffer in point and wireframe modes (^RI8ÿRt^RI8ÿRShow backfaceslEnable two-sided rendering when Color mode is enabled çwH5#VtçwH5#V0Ignore layer attributesvDo not combine render attributes with layer defined values 4W}@O{%J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*p-1OSM n#(XFҦV"W0@zdW0@zd%VersionVersion%ȅ8vDCxZtȅ8vDCxZInvisibleInvisible flag F+2MGtF+2MGCast shadows$Cast shadows flag I2GWM:).$tI2GWM:).$ Receive shadows Receive shadows mBޖw ptmBޖw pLayer index(Modeler layer indexo[nfFto[nfF Overlay opacity Overlay opacityzgGFohN)tzgGFohN)Overlay ColorOverlay Color. -n,NjlpghvhD zʔtvhD zʔ4Ignore mesh overlay color6Ignore mesh overlay color. fB #^tfB #^$Transparency Mode@Quality of transparency solving :KrbSxh|$}mK;)t|$}mK;) OverlayEnable*Enable color overlay  Hrg@*oHtrg@*oH OverlayColor*Color of the overlay -n,Njlpg (!eLZE^Nt!eLZE^N OverlayStrengthJStrength (visibility) of the overlay zgGFohN)I2GWM:).$ vhD zʔ]*qBCx?S $hKnPSVmrg@*oHçwH5#V 4W}@O{fB #^:KrbSxv No Hidden FacesNo SortTriangle SortNo Sort\J:I%7u-n,Njlpg?\Eh{5-n,Njlpg?(XFҦV>g'JNjn*pF X@>@?F?N d ȅ8vDCxZ 8Ns2]?F+2MG "PbEGDߗr J@#QL>g'JNjn*pFCBb@ h@?(lrsGr?^mګA~Ksi[o[nfFW0@zdmBޖw p-1OSM n 럆L<_ї   DefaultAdvanced GFʠN=0(@: }}?Color\J:I%7uZ`Ez]UO B>I(0h@%\VV\J:I%7uZ`Ez]UO GFʠN=@(P< }}?Opacity]*qBCxZ`Ez]UON\q+nN-K^(@hPA}}?]*qBCxZ`Ez]UOY@ GFʠN=h@PD }}?Enable Obj ModeçwH5#VZ`Ez]UOͽ>fdN*5Ւh@P( çwH5#VZ`Ez]UO GFʠN=h : }}?Color\Eh{5Z`Ez]UO B>I %\VV\Eh{5Z`Ez]UO GFʠN=h 0< }}?Opacity^mګA~Ksi[Z`Ez]UON\q+nN-K^ 0A}}?^mګA~Ksi[Z`Ez]UOY@ GFʠN=h0@9 }}?Size(lrsGrZ`Ez]UON\q+nN-K^0@A}}?$@(lrsGrZ`Ez]UOY@ GFʠN=( < }}?Opacity8Ns2]Z`Ez]UON\q+nN-K^(h A}}?8Ns2]Z`Ez]UOY@ GFʠN=h,}}?SurfaceZ`Ez]UO GFʠN= h0*}}?EdgesZ`Ez]UO GFʠN=h+}}?PointsZ`Ez]UO GFʠN=Ph`5 }}?fB #^Z`Ez]UOnevG4'hP`̎ `$ fB #^VNo hidden faces No solving Triangle sortZ`Ez]UO GFʠN=5 }}?^RI8ÿRZ`Ez]UOͽ>fdN*5Ւh, in^RI8ÿRϱZ`Ez]UO GFʠN= 5 }}?,ot"AaYZ`Ez]UOͽ>fdN*5Ւh , in,ot"AaYZ`Ez]UO GFʠN= 05 }}?ȅ8vDCxZZ`Ez]UOͽ>fdN*5Ւh 0, inȅ8vDCxZZ`Ez]UO GFʠN=0@5 }}?F+2MGZ`Ez]UOͽ>fdN*5Ւh0@, inF+2MGZ`Ez]UO GFʠN=@P5 }}?I2GWM:).$Z`Ez]UOͽ>fdN*5Ւh@P, inI2GWM:).$Z`Ez]UO GFʠN=P`5 }}?mBޖw pZ`Ez]UO1釥GP>aP`,mBޖw pZ`Ez]UO,ot"AaY !eLZE^N|$}mK;)^RI8ÿR iA޲1rIK>X qNoJi:,Skeleton root -BL=ew!4tBL=ew!4TagSkeleton tag12..0F $1LӤt.0F $1LӤSymmetry$Skeleton symmetry 120_BEP1@0_BEP1@"SklMatrix@Skeleton space transform matrix `^02eE{|@"/WAGp6׊;Jf|ڢB1ݫK^BUTݫK^BU Joint"Joint parameters jh/L/VVv2d_@ cB8EPУ<ĠF姁J]D44W}@O{$(XFҦV"-1OSM n"6BUJztBUJz"SkelParSpc,Skeleton parent space `^02eE{|@" d_@ cB8E(XFҦV>g'JNjn*pFX@1@?BL=ew!4׊;Jf|ڢ`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=@?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?WAG.0F $1LӤ <ĠF姁J]`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?-1OSM n 럆L<_ї    GFʠN=C }}Root transform<ĠF姁J]Z`Ez]UO GFʠN= G }}Skeleton transformWAGZ`Ez]UO GFʠN= 05 }}.0F $1LӤZ`Ez]UOͽ>fdN*5Ւh 0, in.0F $1LӤZ`Ez]UO GFʠN=0F@5 }}BL=ew!4Z`Ez]UO1釥GP>aF0@,BL=ew!4Z`Ez]UO GFʠN=@P> }} Root boneݫK^BUZ`Ez]UO GFʠN=P`5 }}d_@ cB8EZ`Ez]UO GFʠN=`p5 }}׊;Jf|ڢZ`Ez]UOݫK^BUBUJz܂dKu=G$Skeleton materialG.;]kI 忞@"H`HpʺݺI4W}@O{$I.F_P#.F_P#Material Output material __W8E#(pU@Ra.U@Ra.LE2Data, 7$LE2 Data for node >g'JNjn*p՞'fA5-_՞'fA5-_D3DEYED3DEYE =xNT{-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pF@X@>@BA?՞'fA5-_.F_P#J@#QL>g'JNjn*pF4CtCd@@@?.;]kI 忞@-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]2WMaterialX.F_P#T.F_P#Material Output material __W8E#(I8ZS^M~b tS^M~b Alpha_shaderAlpha shader RnчINNX[5OD.GWf5t5OD.GWf5Color_shaderColor shader zdU@AUʂ*X[qΤIGGItqΤIGGIModel_shaderModel shader @SrE8㲻tX],S@vTVt,S@vTVNormal_shaderNormal shader Xb"ٲN+4Xh_зVJiltзVJil Texcoord_shader Texcoord shader lrMH;eXH`4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"bkF_dkF_Vertex_shaderVertex shader k|eKwj9CqVertexShaderX`ct@*Ntt@*N Constant_shader Constant shader QVO Pk@Xd<;vHwt<;vHwAlphaTest Alpha Test type :KrbSxXxe 0S̤@+Rt 0S̤@+RAlphaTestValue"Alpha Test ValueX,S@vTV 0S̤@+R #<5OD.GWf54W}@O{зVJil(XFҦV>g'JNjn*pFDCX@@@?<;vHw:KrbSxdDisabledEnabledAs OpaqueAs OpaqueS^M~b .F_P#t@*NkF_-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI/|V FK|sShaderInput?ڵfA'7(?ڵfA'7(EyePos8Eye position in world space F 1+5?N>/u%dLrQn0%dLrQn0EyeDirNormalized eye vector in world space. Note that this is vector pointing from surface to the eye F 1+5?N>/ǺpiDM7piDM7EyeDistNDistance from current point to the eye F 1+5?N>/^@A툷^@A툷PositionNShading point position in world space. F 1+5?N>/p1M@o=p1M@o=TexCoords3D texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated vertex texture coords. Replaced by output of TextCoord shader. F 1+5?N>/(x}E[2CV)}E[2CV) ColornColor specified by color shader. RGB portion is used to specify color (and is not limited to range 0-1). Initialized to interpolated vertex color. Replaced by output of Color shader. F 1+5?N>/z`MOWIB"ѥ`MOWIB"ѥNormalNormalized normal of the surface for given pixel. Normal vector is expected to be in world space. Initialized with denormalized interpolated vertex normal. Replaced by output of Normal shader. F 1+5?N>/źHtO{/(HtO{/(TangentNormalized tangent of the surface for given pixel. Tangent vector is expected to be in world space. Initialized with denormalized interpolated vertex tangent. Replaced by output of Normal shader. F 1+5?N>/h{ qQ@Rj qQ@Rj AlphaZTransparency specified for given pixel. Value should be specified in range 0...1 (full transparency ... fully opaque). Initialized to 1. Replaced by output of Alpha shader. F 1+5?N>/|ҥY@e&ҥY@e&LightDirNormalized light direction vector for given pixel. Light vector is expected to be in world space. Note that this is vector pointing from surface to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/ǺB_;OKFJ*rB_;OKFJ*rLightDistDistance of the current point to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/}HRSEpFCHRSEpFCLightColorLight color for given pixel. Replaced by output of Light shader. F 1+5?N>/Ⱥ~__um1CR¬5~__um1CR¬5TangentToWorldTransformation matrix from tangent space to world space for vectors. F 1+5?N>/ٻzEuSٻzEuSWorldToObjectnTransformation matrix from world space to object space F 1+5?N>/SaI7֏bSaI7֏bObjectToWorldTransformation matrix from object space to world space. Note that this is inverse matrix to WorldToObject. F 1+5?N>/H4W}@O{$%%u5E b%%u5E bLE2Data$LE2 Data for node >g'JNjn*p-1OSM n"(XFҦVLE2Data, 1"y"WMB]y"WMB]*ObjectToWorld_NormalA 3x3 Transformation matrix for normal and tangent vectors from object space to world space. F 1+5?N>/)5FYP)5FYPObjectToClipPerspective transformation matrix from object space to screen space. F 1+5?N>/x*yIx*yIWorldToClipPerspective transformation matrix from world space to screen space. F 1+5?N>/#h"mO('#h"mO('TexCoords2`A secondary set of texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated second vertex texture coords. F 1+5?N>/B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4%%u5E b>g'JNjn*pFC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4(XFҦV>g'JNjn*pFCAX@1@?#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& InputFloat+kCY5]BtOt+kCY5]BtO FloatInput floatuM@n;LATuM@n;LAFloatBrickFloat brick F 1+5?N>/ĺ\/3Kf͈,t\/3Kf͈,oFloatOutput floatGqiFE0IN tGqiFE0IN Input usageVThe usage specification for this parameterp4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SHININESS%%u5E b>g'JNjn*pFPb@X@?4W}@O{+kCY5]BtOA(XFҦV>g'JNjn*pFCCX@1@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, ]IDjdcԮInputColorȯ"uI̎4)]t"uI̎4)] ColorInput color -n,Njlpg\PtIL;I1T\PtIL;I1ColorBrickColor brick F 1+5?N>/ºq\W D ɭtq\W D ɭoColorOutput color -n,NjlpgGqiFE0IN p4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SPECULARCOLOR\PtIL;I1"uI̎4)]-n,Njlpg>>>?%%u5E b>g'JNjn*pFX@@b@X@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?q\W D ɭ-1OSM n 럆L<_ї, L{0nBg)`! TPhong Lighting P)\Fvq3P)\Fvq3$PrivateShaderData$PrivateShaderData wk0.DX?_:6~KAMt:6~KAMDiffuseColorzDiffuseColor : RtFloat4 - The four component vector or color F 1+5?N>/ɺºR]JĀ7tR]JĀ7SpecularColor|SpecularColor : RtFloat4 - The four component vector or color F 1+5?N>/ɺĺvJ ~~tvJ ~~ShininessdShininess : RtFloat - Scalar floating point value F 1+5?N>/ɺź$&*2HӁdńt$&*2HӁdńNormalVectorjNormalVector : RtFloat3 - The three component vector F 1+5?N>/ɺǺZ[G {/,tZ[G {/,EyeDirectionjEyeDirection : RtFloat3 - The three component vector F 1+5?N>/ɺǺ zE%Sft zE%SfLightDirectionnLightDirection : RtFloat3 - The three component vector F 1+5?N>/ɺȺw!XCLtw!XCLLightColorvLightColor : RtFloat4 - The four component vector or color F 1+5?N>/ɺɺ B#A)[(dT B#A)[(dResultColorxResultColor : RtFloat4 - The four component vector or color F 1+5?N>/ܺʺ4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1" %%u5E b>g'JNjn*pFCLb@d@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?Z[G {/,:6~KAM B#A)[(dP)\Fvq3wk0.DX?_|X?dK;,w!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї,  zE%SfR]JĀ7fC{oٺShaderModelںqΤIGGIP[ܺC/-~CxrEtC/-~CxrE Color$Input color brick F 1+5?N>/ںݺ4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pF DA`@P@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?C/-~CxrE-1OSM n 럆L<_ї, qΤIGGIWG.3;WShaderAlphaS^M~b P8Z;MF~Bt;MF~B Alpha$Input alpha brick F 1+5?N>/4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pFLD`B`@P@?4W}@O{(XFҦV>g'JNjn*pFCAX@1@?S^M~b ;MF~B-1OSM n 럆L<_ї, MYMJJ>zV"Skeleton display:D x&t:D x&SkeletonSkeleton [}Nj2v[IL'KIp 6Jѳ(phJmCb4IP}K^pPn1LH_rpm6EfHpq\7LO#p>"IM6 Exp졉E/~ݾpp(IДl/pP'a#G @=^V("p0w`ZL. 5ptveDCE`"IWJPB  2"IM6 Ex 6Jѳ( w`ZL. 5 'a#G @=^V(" m6EfHJmCb4IP}K^(XFҦV>g'JNjn*pFX@>@? 2Y `CG%S;>tY `CG%S;>AngSprZ*Z angle limit spread.*ÿ@;ft.*ÿ@;fAngCntX*X angle limit center׾JBoͰwt׾JBoͰwAngCntY*Y angle limit centerh gIR"q3tgIR"q3AngCntZ*Z angle limit centerP"xf?Iq -txf?Iq -AngSprX*X angle limit spread0#@:WvZD,t@:WvZD,AngSprY*Y angle limit spread$}ITBKt}ITBKAngStiX$X angle stiffness$r<|ݔK .ǻKtr<|ݔK .ǻKAngStiY$Y angle stiffness%te6N'tte6N'AngStiZ$Z angle stiffness&BI zztBI zzAngDamX X angle damping''7=B;;t'7=B;;AngDamY Y angle dampingp)/6zsMf6 t/6zsMf6 AngDamZ Z angle damping@,6[v!Dt6[v!DMovMinX2X movement limit minimum - @N1vxt @N1vxMovMinY2Y movement limit minimum.ﶌWMS'tﶌWMS'MovMinZ2Z movement limit minimum.avE/b+ tavE/b+ MovMaxX2X movement limit maximum80u'eDgutu'eDguMovMaxY2Y movement limit maximum1R<&d@ d|tR<&d@ d|MovMaxZ2Z movement limit maximum1!lMp[msdt!lMp[msdMovStiX*X movement stiffness2~Nc>I=ܯt~Nc>I=ܯMovStiY*Y movement stiffness5гh@jtгh@jMovStiZ*Z movement stiffness7bb Bu4Ǫ/tbb Bu4Ǫ/MovDamX&X movement damping8g^0A p Ytg^0A p YMovDamY&Y movement damping`9(roACp"G,1t(roACp"G,1MovDamZ&Z movement damping0_BEP1@"<ĠF姁J]D >׊;Jf|ڢpB(XFҦV"#bb Bu4Ǫ/? @N1vxg^0A p Y?6[v!DrcAۏO'7=B;;?gIR"q3.*ÿ@;fO ,LJavE/b+ (XFҦV>g'JNjn*pF Db@@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?xf?Iq -4CWAG`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=@?-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B????~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_їˏ  . GFʠN=00@$}}MinZ`Ez]UO GFʠN=@0P$}}MaxZ`Ez]UO GFʠN=`0p*}} StiffnessZ`Ez]UO GFʠN= 00)}}PositionZ`Ez]UO GFʠN=P0`(}}DampingZ`Ez]UO GFʠN=@9 }}Limb tagrcAۏOZ`Ez]UO1釥GP>a@,rcAۏOZ`Ez]UO GFʠN=@ 1 }}d'kJ^U*Z`Ez]UO GFʠN= 1 }}-5bACuۚZ`Ez]UO1釥GP>a ,-5bACuۚZ`Ez]UO GFʠN=p0)}}RotationZ`Ez]UO GFʠN=0 h0"}}XZ`Ez]UO GFʠN=h 0"}}YZ`Ez]UO GFʠN= 0"}}ZZ`Ez]UO GFʠN=0ph"}}XZ`Ez]UO GFʠN=hp"}}YZ`Ez]UO GFʠN=p"}}ZZ`Ez]UO GFʠN=0'}}CenterZ`Ez]UO GFʠN=0'}}SpreadZ`Ez]UO GFʠN=0(}}DampingZ`Ez]UO GFʠN=0*}} StiffnessZ`Ez]UO1釥GP>a00h@,6[v!DZ`Ez]UO1釥GP>ah0@, @N1vxZ`Ez]UO1釥GP>a0@,ﶌWMS'Z`Ez]UO1釥GP>a0@hP,avE/b+ Z`Ez]UO1釥GP>ah@P,u'eDguZ`Ez]UO1釥GP>a@P,R<&d@ d|Z`Ez]UO1釥GP>a0Ph`,bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`,g^0A p YZ`Ez]UO1釥GP>aP`,(roACp"G,1Z`Ez]UO1釥GP>a0`hp,!lMp[msdZ`Ez]UO1釥GP>ah`p,~Nc>I=ܯZ`Ez]UO1釥GP>a`p,гh@jZ`Ez]UO1釥GP>a0h,.*ÿ@;fZ`Ez]UO1釥GP>ah,׾JBoͰwZ`Ez]UO1釥GP>a,gIR"q3Z`Ez]UO1釥GP>a0h,xf?Iq -Z`Ez]UO1釥GP>ah,@:WvZD,Z`Ez]UO1釥GP>a,Y `CG%S;>Z`Ez]UO1釥GP>a0h,BI zzZ`Ez]UO1釥GP>ah,'7=B;;Z`Ez]UO1釥GP>a,/6zsMf6 Z`Ez]UO1釥GP>a0h,}ITBKZ`Ez]UO1釥GP>ah,r<|ݔK .ǻKZ`Ez]UO1釥GP>a,te6N'Z`Ez]UOnevG4'@ P H+d'kJ^U*right leftZ`Ez]UOR<&d@ d|i@ﶌWMS'i@/6zsMf6 ?ݫK^BUгh@j?u'eDgur<|ݔK .ǻK? ZoUF_KACGUܩHL:MyBone .;]kI 忞@"@v4W}@O{$v.(ѻD3Ϳ.(ѻD3Ϳ RootHRoot joint. Attach to parent joint. jh/L/VV@wg!JTg!J Bone Bone parameters DZ5 O*\ xIbEM K1gtIbEM K1g MassBone mass@wy}\L 5t}\L 5Virtual$Make bone virtual @wh{=}(siHa^t=}(siHa^Envelope skinNEnable envelope skinning for this bone @wH|"Ydg'JNjn*pFyCg'JNjn*pF@DX@1@?IbEM K1g?׊;Jf|ڢ`^02eE{|@B??o:?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?ۻJfHkG/.(ѻD3Ϳ"Ydpp(.*ÿ@;fpp׾JBoͰwpp諻gIR"q3ppЭxf?Iq -pp@:WvZD,pp}ITBKpppr<|ݔK .ǻKppte6N'ppBI zzpph'7=B;;ppH/6zsMf6 pp6[v!Dppp @N1vxppPﶌWMS'pp0avE/b+ ppu'eDgupphR<&d@ d|ppH!lMp[msdpp(~Nc>I=ܯppгh@jpp迻bb Bu4Ǫ/ppg^0A p Ypp(roACp"G,1pp0_BEP1@"<ĠF姁J]D Ļ׊;Jf|ڢPB Q(XFҦV"#bb Bu4Ǫ/? @N1vxg^0A p Y?6[v!DrcAۏO'7=B;;?gIR"q3.*ÿ@;fO ,LJavE/b+ (XFҦV>g'JNjn*pFD<b@@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?xf?Iq -4CWAG`^02eE{|@B????-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B????~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_їˏ  . GFʠN=00@$}}MinZ`Ez]UO GFʠN=@0P$}}MaxZ`Ez]UO GFʠN=`0p*}} StiffnessZ`Ez]UO GFʠN= 00)}}PositionZ`Ez]UO GFʠN=P0`(}}DampingZ`Ez]UO GFʠN=@9 }}Limb tagrcAۏOZ`Ez]UO1釥GP>a@,rcAۏOZ`Ez]UO GFʠN=@ 1 }}d'kJ^U*Z`Ez]UO GFʠN= 1 }}-5bACuۚZ`Ez]UO1釥GP>a ,-5bACuۚZ`Ez]UO GFʠN=p0)}}RotationZ`Ez]UO GFʠN=0 h0"}}XZ`Ez]UO GFʠN=h 0"}}YZ`Ez]UO GFʠN= 0"}}ZZ`Ez]UO GFʠN=0ph"}}XZ`Ez]UO GFʠN=hp"}}YZ`Ez]UO GFʠN=p"}}ZZ`Ez]UO GFʠN=0'}}CenterZ`Ez]UO GFʠN=0'}}SpreadZ`Ez]UO GFʠN=0(}}DampingZ`Ez]UO GFʠN=0*}} StiffnessZ`Ez]UO1釥GP>a00h@,6[v!DZ`Ez]UO1釥GP>ah0@, @N1vxZ`Ez]UO1釥GP>a0@,ﶌWMS'Z`Ez]UO1釥GP>a0@hP,avE/b+ Z`Ez]UO1釥GP>ah@P,u'eDguZ`Ez]UO1釥GP>a@P,R<&d@ d|Z`Ez]UO1釥GP>a0Ph`,bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`,g^0A p YZ`Ez]UO1釥GP>aP`,(roACp"G,1Z`Ez]UO1釥GP>a0`hp,!lMp[msdZ`Ez]UO1釥GP>ah`p,~Nc>I=ܯZ`Ez]UO1釥GP>a`p,гh@jZ`Ez]UO1釥GP>a0h,.*ÿ@;fZ`Ez]UO1釥GP>ah,׾JBoͰwZ`Ez]UO1釥GP>a,gIR"q3Z`Ez]UO1釥GP>a0h,xf?Iq -Z`Ez]UO1釥GP>ah,@:WvZD,Z`Ez]UO1釥GP>a,Y `CG%S;>Z`Ez]UO1釥GP>a0h,BI zzZ`Ez]UO1釥GP>ah,'7=B;;Z`Ez]UO1釥GP>a,/6zsMf6 Z`Ez]UO1釥GP>a0h,}ITBKZ`Ez]UO1釥GP>ah,r<|ݔK .ǻKZ`Ez]UO1釥GP>a,te6N'Z`Ez]UOnevG4'@ P H+d'kJ^U*right leftZ`Ez]UOR<&d@ d|i@ﶌWMS'i@/6zsMf6 ?ݫK^BUгh@j?u'eDgur<|ݔK .ǻK? ZoUF_KA48@J g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %4W}@O{$(XFҦVLE2Data, 1#J@#QLLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pNffMCOD2|=Bynj2|=Bynj Control OutTransitionOut|z@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ DhNewCommandVg// MD5MeshImport // first command script of mesh importer activity loop // // // March 10 2009 - material works but is not correct uses tS7.5 convention // // Doom3 md5mesh import for trueSpace 7.6 // February 26 2008 // // by Clinton Reese // // // // The entire import program is broken up into seperate command scripts with pause activities so tS scene can update, tS scene only updates after exiting a command script // // July 24 2008 // export material connector, also added alpha texture shader // March 22 2008 // use script to create shape and transform nodes // // NOTE: need parseInt(), parseFloat() in some cases to make sure saved as a number // any time you add 2 things they both must be numbers or they add as strings // // would also like to import shaders incl normal map // // // // Nov 19 2006 // start first ts75 version // if joints not connected to bones then positioning is perfect // joint positions a little crazy when connected to bones // ? // Reason Found - matrix def changes when bones are involved - only true when set matrix programatically // joint position is absolute when no bones are attached // with bones attached position is relative to parent // // Dec 22 2007 - important discovery need to make initial "empty" skeleton in front view drawn top to bottom // then rename and delete extra joint and reset matrix and move skeleton to origin and will line up with mesh // also changed so initial skeleton template has a joint and bone already, so can rotate origin // // // file format for md5mesh(all translations and rotations are in world coordinates // header section // number joints // number meshes // joint information and hierarchy // name, parent index, translation, rotation, parent name // mesh section(maybe more than one) // mesh name // shader name // number of uv coordinates // list of uv's including the weight index and number of weights(skinning weights) // number of triangles // triangle definition defined by uv coordinates which in turn refer to actual xyz values // number of weights // list of weights - index, joint index, weight, position(xyz) rel to joint - final position is joint(xyz) + [weight(xyz) rotated by joint orientation] // note: only one joint/weight(xyz) is needed to get the position // // Execute // Called to execute the command function Execute(params) { scene = Space.CurrentScene(); owner = System.ThisOwner(); //get current mesh index from the activity loop counter currentMesh = Node.Value(owner + "/ActvLoop","Current iteration"); MyFileName = params.conValue('MyFileName'); System.Trace("start of mesh import"); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); //boneFullName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vert weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments scene = Space.CurrentScene(); //process the file one line at a time for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); //number of joints if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; } //number of meshes if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; } //mesh line found update count if (msgtag[0] == "mesh") { curmesh = curmesh + 1; } //only process mesh for current iteration of activity loop if(currentMesh==curmesh) { if (msgtag[0] == "\t//") { if (msgtag[1] == "meshes:") { meshName[curmesh] = msgtag[2]; System.Trace("mesh name is " + meshName[curmesh]); Node.Value(owner,"statusLine") = "MD5MeshImport - " + meshName[curmesh]; scene = Space.CurrentScene(); encapsO = Node.Create('Kernel Package/Object', scene);//create empty node in scene for the mesh encaps = Node.Rename(encapsO, meshName[curmesh]); owner = System.ThisOwner(); //Node.Copy(owner + "/doomShape", encaps);//copy blank mesh in to new node //Node.ExportConnector(encaps + "/doomShape","Mesh","",1,1); myshape = Node.Create('Space 3D Package/Shape',encaps); Node.ExportConnector(encaps + "/Shape","Mesh","",1,1) //Node.Copy(owner + "/doomTransform", encaps);//copy transform in to new node //Node.Rename(encaps + "/doomTransform", "Transform"); mytrans = Node.Create('Space 3D Package/Transform', encaps); Node.ExportConnector(encaps + "/Transform","Matrix","",1,1); Node.ExportConnector(encaps + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","OwnerMatrix","",1,1); //curShader = Node.Copy(owner + "/doomBlankDXMaterial", encaps);//copy material in to new node //Node.ExportConnector(encaps + "/doomBlankDXMaterial","Material","",1,1); curShader = Node.Copy(owner + "/Material List", encaps);//copy material in to new node Node.ExportConnector(encaps + "/Material List","Material List","",1,1); } } //shader if (msgtag[0] == "\tshader") { msgtagSub = msgtag[1]; shaderName = msgtagSub.substr(1,msgtagSub.length-2); re = /\//g; shaderName = shaderName.replace(re,"%"); //Node.Rename(curShader,shaderName); Node.Rename(curShader + "/Material 0/doomBlankDXMaterial",shaderName); System.Trace(shaderName); } //number of uv vertices if (msgtag[0] == "\tnumverts") { var numverts = msgtag[1]; vertCnt = 0; dT = System.CreateDO("Space 3D Package/UV Coordinate Stream Data"); dT.SetNumUVCoords(numverts); } //uv vertices processing - also read weights which have xyz info if (msgtag[0] == "\tvert") { //read uv and index vertCnt = msgtag[1]; dT.u(vertCnt) = msgtag[3]; dT.v(vertCnt) = msgtag[4]; //xyz stored in weights firstWeight[vertCnt] = parseInt(msgtag[6]);// index of first weight for vertex weightElem[vertCnt] = msgtag[7]; // number of weights assigned to vertex } //start reading triangle data - number of traiangles if (msgtag[0] == "\tnumtris") { numtris = msgtag[1]; triCnt = 0; // define faces triface[curmesh] = System.CreateDO("Space 3D Package/Triangle Vertices Stream Data"); UVTri[curmesh] = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); UVTri[curmesh].SetNumUVTripleIndices(numtris); triface[curmesh].SetNumTripleIndices(numtris); triface[curmesh].BeginWrite(); } //read triangle definition if (msgtag[0] == "\ttri") { triCnt = msgtag[1]; triface[curmesh].i(triCnt) = msgtag[4];//reverse order so face normal is good triface[curmesh].j(triCnt) = msgtag[3]; triface[curmesh].k(triCnt) = msgtag[2]; UVTri[curmesh].i(triCnt) = msgtag[4]; UVTri[curmesh].j(triCnt) = msgtag[3]; UVTri[curmesh].k(triCnt) = msgtag[2]; //done reading triangles if ( triCnt == numtris-1) { triface[curmesh].EndWrite(); } } //read number of weights if (msgtag[0] == "\tnumweights") { numweights = msgtag[1]; weightCnt = 0; } //process weights if (msgtag[0] == "\tweight") { weightCnt = msgtag[1]; //weight index wtJoint[weightCnt] = msgtag[2];//joint index weight[weightCnt] = msgtag[3]; //weight value - sum to value of one wtX[weightCnt] = msgtag[5]; //xyz position values relative to joint wtY[weightCnt] = msgtag[6]; wtZ[weightCnt] = msgtag[7]; //build mesh after all weights have been read if ( weightCnt == numweights - 1) { //build mesh dV = System.CreateDO("Space 3D Package/Vertex Stream Data"); dV.SetNumVertices(numverts); dV.BeginWrite(); for (vt = 0; vt < numverts ; vt++) { posX = 0; posY = 0; posZ = 0; wtCnt = weightElem[vt];//number of weights on this uv vertex fw = firstWeight[vt];//first weight index from uv vert load for (wt = 0; wt < wtCnt; wt++) { //find vertex from weight, weightXYZ, joint pos and joint quatuaternion rotation //joint rotation matrix(quaternion) wi = fw + wt;//weight index = first weight + current weight count jointIndex = wtJoint[wi]; qx = xq[jointIndex]; qy = yq[jointIndex]; qz = zq[jointIndex]; qw = wq[jointIndex]; rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; // rm dot XYZ = rotated position rposX = rm11*wtX[wi] + rm21*wtY[wi] + rm31*wtZ[wi]; rposY = rm12*wtX[wi] + rm22*wtY[wi] + rm32*wtZ[wi]; rposZ = rm13*wtX[wi] + rm23*wtY[wi] + rm33*wtZ[wi]; //relative to joint position(all calculated but only one w/o weight is really needed(I think) posX = posX +(jx[jointIndex] + rposX)*weight[wi]; posY = posY +(jy[jointIndex] + rposY)*weight[wi]; posZ = posZ +(jz[jointIndex] + rposZ)*weight[wi]; } dV.x(vt) = posX * myScale; dV.y(vt) = posY * myScale; dV.z(vt) = posZ * myScale; } // vertices done - create mesh in scene dV.EndWrite(); dM = System.CreateDO("Space 3D Package/Mesh Data"); dM.AttachVerticesStream(dV); dM.AttachTrianglesStream(triface[curmesh]); dM.AttachCustStream(dT); dM.AttachTrianglesStream(UVTri[curmesh]); //Node.Value(encaps + "/doomShape","Mesh") = dM; Node.Value(encaps + "/Shape","Mesh") = dM; //shape not sticking try this Feb 23 2008 //Node.Value(encaps + "/doomShape","Input Mesh") = dM; Node.Value(encaps + "/Shape","Input Mesh") = dM; myMatrix.LoadIdentity(); Node.Value(encaps, "Matrix") = myMatrix; } } } // read joint data if (jointCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); parentName = ""; if(jointCnt != 0) parentName = msgtag[11].substr(0,msgtag[11].length);//april //april boneName[jointCnt] = jointName; //boneFullName[jointCnt] = "error"; if(jointCnt == 0) { pBoneIndex[jointCnt] = -1;//first bone no parent //boneFullName[jointCnt] = jointName ; } else { for(ii=0; ii<jointCnt; ii++) { if(parentName == boneName[ii]) { parentIndex = ii; pBoneIndex[jointCnt] = parentIndex;//save for leaf joint creation //zscale = (msgtag[4]-jz[parentIndex])*myScale; // this works but scale from center need pivot point //boneFullName[jointCnt] = boneFullName[ii] + "/" + jointName ; } } } // save joint position - unscaled jx[jointCnt] = parseFloat(msgtag[2]); jy[jointCnt] = parseFloat(msgtag[3]); jz[jointCnt] = parseFloat(msgtag[4]); xq[jointCnt] = msgtag[7];//rotation of joint in quaternion form yq[jointCnt] = msgtag[8]; zq[jointCnt] = msgtag[9]; wq[jointCnt] = 1 - xq[jointCnt]*xq[jointCnt] - yq[jointCnt]*yq[jointCnt] - zq[jointCnt]*zq[jointCnt]; if (wq[jointCnt] < 0) { wq[jointCnt] = 0; } else { wq[jointCnt] = Math.sqrt(wq[jointCnt]) } jointCnt = jointCnt + 1; //all joint data read - get out of joint read mode if (jointCnt == numJoints) { jointCnt = -1; } } //enter joint read mode if (msgtag[0] == "joints") { jointCnt = 0; } } System.Trace("end of mesh import"); //next command node MD5initialSkin }NScript Object Package/jScript language4XstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pn-Dtb@@P@2|=Bynj|?z@Hoۙ>?NffMCOvC:\Documents and Settings\Clinton\Desktop\pendulum.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@HoddKtN4 ActvLoop `2|=BynjX<X4W}@O{$(XFҦV"t|Iet|Ie Iteration count Iteration counth#nFO&h#nFO&LE2Data$LE2 Data for node >g'JNjn*p; `A$%}; `A$%}LoopBodyLoopBody,hML,hML$Current iteration$Current iteration-1OSM n#z@HouB!#~}uB!#~}LE2Data, 2$LE2 Data for node >g'JNjn*p asvHhTG asvHhTG$NodeIconNodeIcon eSBgc$ 2|=Bynj4W}@O{(XFҦV>g'JNjn*pnCAb@@X@; `A$%}ߒ$)?? asvHhTGeSBgc$ 9K^掅x]y\q׼]B@Z]sIB7@d$F>bl8N!8PIS1!(qHlvm\B"m{Ǽ7켙7ZVu_w~FmFmFmFmv텵kÊ1|0aYs ÿ߰П`cmpW9L3< DQAt2e*Ys`˖ sQo杇j0l0D$P_&1lh|h=.F K,g{B6ܹAQT@nA,EAͼΓ>f s>RPOC2I0ck!kL8̞=f~߳RWU hZ03%sSdϥ;JP,(D@"{8q>^ÖL66mwqw}㦛S )C,,Sؼ$2 ׉FO%,XRطп; /_i$ͅh1^?~qܯ7])kw}^&(ŒB@v ?I>Ӡ ź^ЇrWs[$fѯNvׅ+Vȷ=z Tz2g'֐e3Y,bڂ^NuPܥ*~1G#y]φm YPK k˙-H$p㍷ OU\}&x~xO1{[b;/J}-ZH.xQT%,r.c:fͶ@;-}&=ojz.Vl:=uʠ{q 3F={*n:uOoz^jj,Wp ;Y dvl&{.ؽ-pW0{/|}39Z]3xq4ދ|8%6C<}?d3YzZm%/cj :::Q[ ˖t"2 ԓIM3[sWBdq(hr~%d0HTvN+/gG<Hdu+D/X<"0iW"żG˂,ޅ}7 UdŲ/2{cفZ޽A̕E@_Z}UqG00gS?#߱C{ptD9 02@{-bR=y~قq!E_Ws==!&D 烑>_{_'Uص9O= Xۍ>ݛ{ 8c$_{nnY$e|G4hg}G>hC9]^w)afcۙyAucǞ6'N²vx>F@O<,=ܷ`MEus,/#4m_ed_^i)_@ݶtɒp%\,Z30t}[pς$`tB/UG\:kbϗ.]Q]}Ff /Z+2TZ#x}Gچk1h̙| IgAS@悪]1:ԟ=˟lG>a.hl y@TO F% ڸBW#$ނhh;Xg5T[CuއCY6oMem dW6o!ڭ>9??ʄ~t]AoyWc} !KwQm 0;(yO1JN|qg1O7$x .~ԗ5=>oVRC|c˖#і/xڟZڈ׉ܧTM<= 5P˿˪E-_0öm;BǟUoj?[oꪫ]yc./`⢭OOcVa] \pqH df 9pc?|H 2ɀ}\x9>$/A]8V?şkr-w~_nwu-gV?"*~j +b`T}3ߔ͍3[rgsϩdo]mh'[]gZ迾Xӱ_ĽAO~^EcQs1b 9; F{<-?q_r= #'osV_fz-}-ÿ zo\Xjo sezs-~>}g5wAloΖ=7Lx~dSezO5gy'r.7nH'q?}ݯi.{yr}1~^W}D1s]?>O}7,\zkcqWZz_W{']>l)$~3cVcQEe^wF[{PH{s?ڼjNZfX/p;Coܵ^[zU "´r`ػ5c7ԫi).䧯rQ&/!W;xݶks/ۧ DN5pٟrϮMF=U`Yn=@D˾hiqa ֞J6c0X^{0Ǻbr:~xc=Y?q<3i~[K<_M{N^ϲ{ /$i[sl+ (S5\ ϠQQ>jwq}Um+//ul+b̼TTlީĉ#\'sǐY@\F0_!g@Rݏm4aݺ lΣ$WW3 좆e=Giln-S }и^ϽwU ޚAܧfQ,Q5gzqf~<~e=@P˟Ÿ`k$vT͉hL=bvz(oeefVkH~ ہW}ͮ$OzODksl d<~ެ]o=M1گK}N{ gp E\%?؜Fٹ,Zso`F]:_n.{ҳhcGVw[`q JR4[0uӓbI+\aS 5՗,ɂ3R]mur~'#$^bۻ{wӠYU(G{ 2O|mQ;5S5lOο9p%HZאa=1sIM{AWIYKs$[oW~o2i @|<˅w={ kko`FSQ= }P6Ϛo}w hO?n~# j@5wf=zn8 נWyWȗ~d+ bRmYdo9a vޭ%cѢMbߑ%쟰9ȿU(߀`ϜdWwܾ Z>_S6HN1?{cy`d63ۛKk]w?vLvßmY%=/^=΁z }+Kg5P>n1vqR Z8H|S.?l̿:?(xl 0TdǏ=^GRDǝ^'~majs.(?V5Ȕe '[Mdq0F]??ʣ H+4f1lnk^X:zr{E:STȀx@(ʫ{yF.gn8,Ni@$> K7[yDι7VǑÐ~2OA,00ߎuTUGX!|O9Q:Olx_.DKڳQsǓ|t&yě`_d ?-] ~0b="`*G9ӜDj ɓGB ,$oB=,{F'Eg}YޛwD*˻84Xǿ|ޘ7 Oym>O={Sj̿'gUἧjiF]ЙT[hNff?'EOZڻX/16{ &5|V}ol~ :b,ߖ{eSBuƌYcuW0Tԗjhi 9hIL}Z6t>^s ۨw=\w9`d_qah~%繦O}ɓ;صwAf12}'g~ WfΜݐw3xܸMqeՕ>$zۊ'.?/i5_=O:O+;X*SEwdOt+\oxJN]u`Oވrd9~rFPrV5g&͎S ʃQ\c,D;;S+eI"` 7uy+:g<^4, `B穑1b@M<xkXQP=>ojY<6/L@T;cBY'6O7H,^^,)aqR NlN,kQlpqilK5h{!f џCU,EFXk\B͝V_h^|P[DK?S?/}ejO>Gjg.+P{9mom豝hgɟEc-rsTja%KmlF5\.ݏr&{ p*Ǚ8䱎@ַ-P^Ǡ9>x}]o܆Wt`+ժ :37P jxcgu +06娇@%u7/6'}}KOC{as6kw7rFks+s{σ}k _)4Ļ^c|4jƤVߪ< y t~wmU+jBlZ1\`P4罙;g{EٗsgE`Ӧ-sP>z 6 l m5Jo堟)ٻ̾|M:Ur>@P-\w-ec-F{ F~_>T5_-b?f/M_dnUhePmye@5ںfe~Ơ Ƣ%+I]';Y:@5 B|^OªU}kpDzFl|k{ d 6 n(`ٲ|Pg>1ǧAO~ݏ[P+pӒBz}Y#qԌjol@6Gvg7>TO4~8Y {zھ`@vλexìyNN'*qYPn'{w\|BP\Gs4sc'as*3Lp 5Py>Q>Sf~2Xd@C*\˩ғnnjǝ魓zh'8`WnCiSAm</*堧h5cXHd&aZhyg|mי<Ϲű"|h _&WtfC֏t7 t^XjJ}Hv;\,׉A^RbhjD:jeAB_q$ &[3^mrrՠ^oߚ0u!Y{*ɨ/`Bh|=$2}:џ?KPREANbcAd:C(C3f~3ICvn{zC(@' OB[R1F: .f_g4t~ 3~ofDCa=g=CTsJܭ^ڣt}l>œTGgĶyz< ͩ%̚5ƌ&LfygY#FmFmFm ?Yڏt|Ieh#nFO&>g'JNjn*pFCC@f@X@?; `A$%},hML-1OSM n 럆L<_ї6  Activity GFʠN= H0@ }}Me Control Inz@HoZ`Ez]UO GFʠN=PD }}MeIteration countt|IeZ`Ez]UO1釥GP>aP,t|IeZ`Ez]UO GFʠN=H 0A }}Me Control Out2|=BynjZ`Ez]UO GFʠN=` F }}MeCurrent iteration,hMLZ`Ez]UO1釥GP>a` ,,hMLZ`Ez]UO GFʠN=0@= }}MeLoopBody; `A$%}Z`Ez]UOz@HouB!#~}>g'JNjn*pnC:Cb@T@; `A$%}ߒ$)??48@J g'JNjn*p ;NffMCOD2|=BynjX<z@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ LNewCommandK// MD5MeshSkinning // last command script of mesh importer activity // // apply the skinning weight values from the md5mesh file // // Doom3 md5mesh import for trueSpace 7.6 // February 26 2008 // // by Clinton Reese // // // // The entire import program is broken up into seperate command scripts with pause activities so tS scene can update, tS scene only updates after exiting a command script // // // NOTE: need parseInt(), parseFloat() in some cases to make sure saved as a number // any time you add 2 things they both must be numbers or they add as strings // // would also like to import shaders incl normal map // // // // Nov 19 2006 // start first ts75 version // if joints not connected to bones then positioning is perfect // joint positions a little crazy when connected to bones // ? // Reason Found - matrix def changes when bones are involved - only true when set matrix programatically // joint position is absolute when no bones are attached // with bones attached position is relative to parent // // Dec 22 2007 - important discovery need to make initial "empty" skeleton in front view drawn top to bottom // then rename and delete extra joint and reset matrix and move skeleton to origin and will line up with mesh // also changed so initial skeleton template has a joint and bone already, so can rotate origin // // // file format for md5mesh(all translations and rotations are in world coordinates // header section // number joints // number meshes // joint information and hierarchy // name, parent index, translation, rotation, parent name // mesh section(maybe more than one) // mesh name // shader name // number of uv coordinates // list of uv's including the weight index and number of weights(skinning weights) // number of triangles // triangle definition defined by uv coordinates which in turn refer to actual xyz values // number of weights // list of weights - index, joint index, weight, position(xyz) rel to joint - final position is joint(xyz) + [weight(xyz) rotated by joint orientation] // note: only one joint/weight(xyz) is needed to get the position // // Execute // Called to execute the command function Execute(params) { scene = Space.CurrentScene(); owner = System.ThisOwner(); skinstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); skinparam = System.CreateDO('Space 3D Package/Skinning parameters DO'); outstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); System.Trace("adjust skin weights now"); Node.Value(owner,"statusLine") = "MD5MeshSkinning - adjust skin weights now"; MyFileName = params.conValue('MyFileName'); System.Trace("start of import"); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); //boneFullName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vertex weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments scene = Space.CurrentScene(); for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); //read number of joints if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; } //read number of meshes if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; } //start mesh section update current mesh index if (msgtag[0] == "mesh") { curmesh = curmesh + 1; } //get mesh name if (msgtag[0] == "\t//") { if (msgtag[1] == "meshes:") { meshName[curmesh] = msgtag[2]; System.Trace("mesh name is " + meshName[curmesh]); //scene = Space.CurrentScene(); //owner = System.ThisOwner(); } } //get num uv vertices in mesh if (msgtag[0] == "\tnumverts") { var numverts = msgtag[1]; vertCnt = 0; } //read uv verts including references to vertex xyz stored in weights if (msgtag[0] == "\tvert") { //read uv and index vertCnt = msgtag[1]; firstWeight[vertCnt] = parseInt(msgtag[6]);// index of first weight for vertex weightElem[vertCnt] = msgtag[7]; // number of weights assigned to vertex //if (vertCnt == numverts-1) //{ // vertCnt = -1; //} } //start of weights get count of weights if (msgtag[0] == "\tnumweights") { numweights = msgtag[1]; weightCnt = 0; System.Trace("num weights = " + numweights); } //read weight data if (msgtag[0] == "\tweight") { weightCnt = msgtag[1]; wtJoint[weightCnt] = msgtag[2]; weight[weightCnt] = msgtag[3]; //dont need for skinning //wtX[weightCnt] = msgtag[5]; //wtY[weightCnt] = msgtag[6]; //wtZ[weightCnt] = msgtag[7]; //all weights read in so process and apply skinning if ( weightCnt == numweights - 1) { Node.Value(owner,"statusLine") = "MD5MeshSkinning - calculate weights for " + meshName[curmesh]; //for each bone calculate each vertex weight for(jind=0;jind<numJoints;jind++) { System.Trace("calc weights for bone " + jind); //default indexless weights to zero for each vertex for current bone for(ii=0;ii<numverts;ii++) tsBoneWeights[ii]=0; //for each uv vertex get the weights and see if applies to current bone for(vind=0;vind<numverts;vind++) { wtCnt = weightElem[vind]; fw = firstWeight[vind]; //check each weight on the vertex for (wtt = 0; wtt < wtCnt; wtt++) { wi = fw + wtt;//weight index jIndex = wtJoint[wi]; if(jIndex==jind) { //match found store weight value tsBoneWeights[vind] = weight[wi]; } } } //do skinning here for current mesh and bone theBoneName = boneName[jind] + "Bone"; System.Trace("skin " + meshName[curmesh] + " " + theBoneName); skinparam = Node.Value(scene + "/doomActor/" + meshName[curmesh] + "/Skinning","Weights"); skinstream = skinparam.GetSkinningData(scene + "/doomActor/Skeleton/" + theBoneName); outstream.SetNumSkinWeights(numverts); for(skw=0;skw<numverts;skw++) { outstream.weight(skw) = tsBoneWeights[skw]; } skinparam.SetSkinningData(scene + "/doomActor/Skeleton/" + theBoneName,outstream); Node.Value(scene + "/doomActor/" + meshName[curmesh] + "/Skinning","Weights") = skinparam; } } } // read joint data if (jointCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); parentName = ""; if(jointCnt != 0) parentName = msgtag[11].substr(0,msgtag[11].length);//april //april boneName[jointCnt] = jointName; //boneFullName[jointCnt] = "error"; if(jointCnt == 0) { pBoneIndex[jointCnt] = -1;//first bone no parent //boneFullName[jointCnt] = jointName ; } else { for(ii=0; ii<jointCnt; ii++) { if(parentName == boneName[ii]) { parentIndex = ii; pBoneIndex[jointCnt] = parentIndex;//save for leaf joint creation //zscale = (msgtag[4]-jz[parentIndex])*myScale; // this works but scale from center need pivot point //boneFullName[jointCnt] = boneFullName[ii] + "/" + jointName ; } } } // save joint position - unscaled jx[jointCnt] = parseFloat(msgtag[2]); jy[jointCnt] = parseFloat(msgtag[3]); jz[jointCnt] = parseFloat(msgtag[4]); xq[jointCnt] = msgtag[7];//rotation of joint in quaternion form yq[jointCnt] = msgtag[8]; zq[jointCnt] = msgtag[9]; wq[jointCnt] = 1 - xq[jointCnt]*xq[jointCnt] - yq[jointCnt]*yq[jointCnt] - zq[jointCnt]*zq[jointCnt]; if (wq[jointCnt] < 0) { wq[jointCnt] = 0; } else { wq[jointCnt] = Math.sqrt(wq[jointCnt]) } jointCnt = jointCnt + 1; if (jointCnt == numJoints) { jointCnt = -1; } } if (msgtag[0] == "joints") { jointCnt = 0; } } System.Trace("end of skin weight assignment"); Node.Value(owner,"statusLine") = "MD5MeshSkinning - MESH IMPORT IS COMPLETE"; }NScript Object Package/jScript languageF ~stringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pn1D8Cb@@P@2|=Bynj|?z@Hoۙ>?NffMCOvC:\Documents and Settings\Clinton\Desktop\pendulum.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ #NewCommand,"// MD5initialSkin // second command script of mesh importer activity loop // // do initial skinning on mesh // later read weights from md5mesh file and reset to these values // // Doom3 md5mesh import for trueSpace 7.6 // February 26 2008 // // by Clinton Reese // // // // The entire import program is broken up into seperate command scripts with pause activities so tS scene can update, tS scene only updates after exiting a command script // // // NOTE: need parseInt(), parseFloat() in some cases to make sure saved as a number // any time you add 2 things they both must be numbers or they add as strings // // would also like to import shaders incl normal map // Execute // Called to execute the command function Execute(params) { owner = System.ThisOwner(); scene = Space.CurrentScene(); currentMesh = Node.Value(owner + "/ActvLoop","Current iteration"); iterCount = Node.Value(owner + "/ActvLoop","Iteration count"); //System.Trace("mesh create " + currentMesh); //return; MyFileName = params.conValue('MyFileName'); // TODO: put your action code here System.Trace("start of import"); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); //boneFullName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vert weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments scene = Space.CurrentScene(); for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; System.Trace("numJoints = " + numJoints); } if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; System.Trace("numMeshes = " + numMeshes); } if (msgtag[0] == "mesh") { curmesh = curmesh + 1; } //only process mesh(skin it) for current iteration of activity loop if(currentMesh==curmesh) { if (msgtag[0] == "\t//") { if (msgtag[1] == "meshes:") { meshName[curmesh] = msgtag[2]; scene = Space.CurrentScene(); owner = System.ThisOwner(); if(currentMesh==0) { System.Trace("skin and create actor" + meshName[curmesh]); Node.Value(owner,"statusLine") = "MD5initialSkin - skin " + meshName[curmesh] + " and create actor"; CharacterEditor.AttachSkinToSkeleton(Space.CurrentScene() + "/" + meshName[curmesh],Space.CurrentScene() + "/Skeleton",0.400,25.000,4); } else { System.Trace("skin " + meshName[curmesh]); Node.Value(owner,"statusLine") = "MD5initialSkin - skin " + meshName[curmesh]; CharacterEditor.AttachSkinToSkeleton(Space.CurrentScene() + "/" + meshName[curmesh],Space.CurrentScene() + "/doomActor/Skeleton",0.400,25.000,4); } } } } } System.Trace("end of initial skinning"); }NScript Object Package/jScript languageW= d stringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pn Db@@P@2|=Bynj|?z@Hoۙ>?NffMCOvC:\Documents and Settings\Clinton\Desktop\pendulum.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =tuPause Activityk@ BLpA,k@ BLpA,Keep period<Keep constant period in cycle uW}Mzq>uW}Mzq>Period&Timer period in ms|2|=Bynj\|z@Hoh}4W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF_D c@@P@?uW}Mzq> asvHhTGeSBgcR 9K^掅xRxe|U=yd%x;. wq7݋;w(:uZpcL2.IÇ7+k96d.FP++++++++ҿ*QuR^IՅy4$;FdFӘ4>'MNJӒ@ Y P| 4О$u=h\Z_AC'Ru`B_+I "B3ibJ(M8OZJ+hC-mMm P%L]Iۮ|Ɗ[ҦXZkOKchnM)!46} e/ITM#hZFcЩl{:gOofTJ=rTAg.]|Vl;:=؎Үx+cKKivMDihn:U~OVeP0ϡaQ4"3MQzz-Ίҩt sF:ӷc .h 2Ņ Ms%Wzg?wp/8GtXOaSh퍷47&DQ)ih^&UWOQeI)Ue%ѐzkMSl |:_H9w`Dg-͂BEnDK܉y-V2B n{l#.D`?F8jG̑.ĆSQ4/ҝtaT]T@J~7UQUZ4 lK39Ϭhw@LC.cDErh8A=6ymx{;k=S|ϱ 1F87OKЦKvt,ɆvFYAzG#АW s/HHц(Kڃ>=eK7*34Mcυ`lVh3 LwB>AgWKsJf㺜?8->D: Ą36t a MM#RuA+;x H4-FO %~*|3Cvod:t:NBQ lmKyn"pM>ڡʉo{8cC`Sp2B]WI]hZ_=dE{Pgv#j/'i,v2b&|p xx efG4i9/@FTogwT{`[8$ϻ!kVr~5hb[ >j;Yz:z1Šq*3g׉%TߏFri#r^)S>!yפ_^NI}kR+R.i>w^ڂՉ e2 &v~|{fG6ٽ4,*^:ZȁŃ|@{fiA;C0ØL)>%drL̝}ܻUt]xM4;LOCcè?.DИP{ZׂvD4翩rFT}]ҕym?Qׯ>u6p6 hzgiczFQ/]aO*0n=ŽhA%Ў_:?CyTگ-M @-]EPg+xuj ]KG5~?/}_^ױPlߡj>`[滋$BGr|Ü3*qYTC3CLi@:[َ O_#km_?|본?/&ܨ_pLƀ^ 2Gnz]ɚ`4; ujfFЦ0sәRb06>(?-*Cio`E'l.VOtsjeTo}˱w-3ښO}mwYN<6<+c@]{y#M إu&7X&mi.p5aTLs=ͨSU@7#VV}JUМfq ;зh`u~e98uN˩5g6yrErݿ1@[֌T?$5sޢ[d {b^%8=]=w=t*u!E32lW36- zz'ˑg#dh dpā`  liA3J8PAe!n4 b5J߃w|sK${7)c{sʜ/LA'?"tY%-vvZ ill @hh7^#b/5rm`QhO,izU k| sr;MbBZ8{}PW惡׬խIT:< ãt:].Ax ؁b e?+z:A{h+Ikނ.]u!!wtr-m 1T/=.(/ԡcEGmNس}Ns" d>d +7>"GB ڂE{6e tnYll X|U>"֜ƹNvxۅkŵ@C^c7y #_z:_,}džUP3}{36) qY*-,42 -Ct=Ձ8 qn㺘6s<">:_ &]&̡k!`Mw`r߻QSy*H)\$t=솶BG0mރ=lAlڈCK=u#Y+c st#֞e]h$bkE[jFA4dKWl'z\"lZ|xM>H^o缹c)0xGѿgRVӇ.w[=q{w`w8|PuPאָ}?tc9\l\w|. B;΢=gSx}m:g;О hjoν[g_&ja^/}}ȅ8g)7^TQPҹIN4mcMgQ T,Ʒx|yxh'SOvo·N.'ѯ7o4;D݋{^? v6lno@S֭չ+}E}y= p h%\ _FAhõ\B$lm:6B;;Ͱ鵰Ǖ82LB3e0IW 9˙atf =0.hN=>ؗ̾0'r=[Ӛ^6z=MM~ee=G(E~zy>Rx}|ߋ'<\‰~.|_ޣL D߃ñ 5qv|oq_?ϟG.tcBt0]CMf hDt1b/b6zg5οYQ/kA98ict Cіʒc_*J mO[Ҳ]Mp ޥs]>EZ}NcwNG:p\AwV{kwߦ} |w&@, u~//ǖ<8?s\=]Il<}r\v-7FAH5?G>:Aİ]hf{.j2""W~{ih\UcpQ ;'qt<hB"͛ӊt4܁JvP(.T71ޛ/q,ß {;zb˳ț7b*MMHoiMz,m5ғL,̞gD_#s"yK5}Ե~Y-/o<F^|0Fzjnn\Jih5jcCzO[PCM;6!ƭB{%dTc@=(= uh]))޿'+~e3=a߯;Ql =b| 1D_Ok˺Ss/''G2֓1#qy>| ?}5<#/tηP}A6FS^N[jnnK=Ybi ι_T?ϙW@3}@z41МJc%sC(- 9ǘuz#}RTj|ʟ]5ݟ bI ˛4#+5>v1yUxC_$n"v_S|ۧfo G<"|C /72M̎;✻Q}C؂6.A[1L1/>M?cjRP3=D=P 5.t9Y4&z9%P95Qֲ$ޯнvX{_+#'Fl<}b.MJL~?AЯb}2o+6؅~Jr{]ZQYD//)GO DƴLٖ3ЦW1)>~n򌖗._E1ԕ}Kws0@z:k+OJƚ=꾎ۃ|r4&ցnGڴihgW/Υ;КuGdO&:/ۡ3u]^ssɿ[oQ'hyVK֠M?գ&W}Ear>J(Jqc rnm cJmHcgVzz`ٞJYb[M `sxi_<1/{ ;Ab>UrGa',g1E[ ?naK`[{?CZoj NsߞXv4הyaϕGy~4miG#~B9):'׼^(#z;a/5?K_ ~ {Խ\>bq?_}]*Tߩ^_!؏~}5ԀE2dBINt?ܞ.ђf^3XVVM ]ʫ-lEӛ;cb9G ?5LWc|^J4o% gD5䣸~rd++{( O%; WU#ρ~ߌsĹ`3לQ%QT?Dӭ6t9`jkO9ܺ@nveX8ִa=AQ?1%( ^fۘ?'QKibbeDO1x]F?;}D{KU{5{Ny/ V߂=};+TYC_jW|YyV*rge0r;)ۖNb:ДFy~P7cbnjP;H_$: %w*m8S,A_$p=C.O1_ׂ̐J{ UnUִu^zD%y)w1kl@j [́2^d7x]b_-/`{w}s{յh:#߱7ii/ε5bĩ>Y á!u[yP1Thᘏc5׃t(َ(pzۊnX^Ԁ2ЖʲeIc}LhMWވ1;SHKp)cg *U̍52z?%ݒOF=eςٛ;::P 3[I?$l`'jUy?=m1`pL3ǸKhh%ے ܧ rkNE1FrxҴSڄq`r *sh?^m-0]K}.D_o !- _Y]~oVImewyўb-jXޗ5i J߯J`[P.E{f:8+l Zn2FnmJnP"Д(Q |= 3{tu$צT։*Gu"dN;o; <5hKze]Ǹ Zykݹ^ z Gkן ^)࿿[O"ݢy^ž}޻<e=ƆR6ؔB/î&E=2?H@D·[= Sס$Cp7bHQ_==iMvmM۷;4ݭ)t ,-~T&Lficdim@r?s/u7^*ǘj r%>ǔ~m࿛#_ީ%q>βSؐ%YXX(GbC,9v[?_{C yʂ2?dM4>C>P(l=ܔkA>%fe6hM|r(ÊFXنr)9jY uR KM$m`X^ k)k?t5/zE *x:}| w{O]E$2Vx iӆo}z8?Y/q3{?SIF<8JQP8 7 f`Sג;6¸(*/oUPFj:x~ҙ>S?ԥfkQr{K͘p|օs{%!K ^ nUyKZ|ZYy_kQItFaoeeʽEԴiSjܸ1t:um] 5$=~f+G@~t'Ȑ6UNT71 )͔`[בDXU_%* Dv~{ 6~?j/!ޓDد_o`nC&dfff7o\anhhHO;g-;ڈ؟R{)j7uWs[ϝ :c@ݛ$H%q染9RQ)0vtv͟K T=$uLb3s/O5?y^;GUY3 y/k>@z7iUvYq6 }Ȩ;0Y Os=vZ {*(#F4ѐڻQqdzLL^!TnB-h=HD;ϑ?2Thl`F؀2@Os <&<y=]v<3?sB}OKǹv#IT:Q-ɰq2ohfE8T?!ӡԦ"'@5UBd&w5'9fH3%TүGFSL *A_`ING'Iujrij-.x !/k(}t]_e^w˽K.{xm=;s X4jkB#Ln%ԖroXU=`>_?۩ ZF?C_8 [I-<ca~=07| h9Qss*_o!(՚ZӊVt>@9ZOsdƁJMM8^uo,b_'#߭$ B6̟5E7|i>X}q@[l'[`3shQ}ۂ4(O97y>3Z Ƶs55d/s?v9g'!:anh5Wrh4`2x cPgǁʙ1{5zoK>s6v#/d24 Pf Ct?7U԰|*o@W h!gv:*iZo)(޶  =-9Y'X=5lj`3]ji4?=? C[Nq,O$?~_7I?Nj=.: Γl(65nOqQ_i Thl@rcG b6;#*o3)z`>m2Gm_Wg@ef~ߦ }9ׂ,hK9l/ }륀ch|59hbUOwo0 J7zz7pIH{r|j>`ο?k[ n־}g"؏C^ ; d,Zhx`3QO- ?mY3О̟΢hGb+a82+5wh@ 6 o ִ:Nt(xU'k&p=03 }w޼nz [?XX jp2G5Fhbm+o_SG Νɸ^< Qu">L^~n<#*OHڹ-#]l0zc=Q=Ub<TjZx\sb_xBNd7!W?`Ͽ P_Mzh[u}X#e,.JF80ʿӃش㿃 o#iΝ I^,T4>aP3Uo+b?w}'wp3*u2ft5B  [g q\]js_#l:ب;چL, K(ho 쩫_}6#χkרP)bCb0|~ϵF~h/ǃ2NDu#uyaZWk|#_Bڃ!w?w(E8Ru7^fK_Fݬ 5u@@zj56P{`0& ׂUJc"_gSkυ5YXR6fݙO0ڈ9Ǡ4|- ^>W h27O߃@KѦɰj7hS T0h?׀>k\_-x]kČ0 gzc7 uD1_.ג6uaK|W6sG1?c+6X_ێkā;ɯk=m\Z= c3[4fJE=:֛fR 4š)m5`Q%N"$9.Ld.qu]qlF!OBՒRޕYwfkB6nd{z**O 6:BeE\q? vk ?xJϕc?mߤffPSwþd_?ܿNGS9QQeg A)۾hg+:hIv`ѧ8'1: I@s h@[(1_ %ؽFLML,mkSf͚=]?QfxO }]`&0\{/rofq|.ӜA!`; mAf?>.o-$kC*lNE?7cb)]ߜF7e.頏 mgNoza=q JcIT〳 kǀ|/˜p>92 ޯ2U[Z=V[׆Xq?7jd7WZc9ƀۺ5sBJn-׷`- EG?\o0s -s? [ggcb X7D17e?Z[_OW`_1^`)rfw՞ӭ[|Y q!߂€ 6w75+ 0ލŹV0IW{lqf h,0au]eΣ2t#ڀk߁ |d>PmO;?1b8EJoP,? ? W,tb ?KDm+d879O2π>J3@Lc)]MWsgAҋ6ؿ>2Ɣ>a*-sGmf?}6]Q>|#QHkn9<Ds5 y>ɽKs01! ۈqIގoH}P5)3G{75k9/Ah5~%oA\Pjl,0 PlCp6lGWe8 v9~>f; ~O8E4:"~m(`9>p0ڍ )ŸT0ɿCӚ:Oz*{>Bw7HS?AK(SOEfkmutw 6𥓴M/I-(6a&d*?0~B9m1_?S?#`3zkUb.6׋ UyFY{d 5:B]KMW =Ms:L̶%yzaX:Zi[x,!mW;f{׀??WyiR??>d(bpWy/޿{(s1yq^o~k(`Ahc25&TE%8QR7ֆy(t NF8?hSk_,/Lia PKģ}tpvhS~RoqhfQ9?!3ezІŰÝ?.mGN^}5p[+$b)꿉?1Î~OOwkb!{j!T)lb? y޼ӿ- Mmq-_ q~$}9lk}Eh/{PyޟDK*3E s7/\b.X#m@ ! ? FW!}Fk}׌z >X_ 6P|_1 {WDmiH ,uvy|AƬg|/vFk".OƂ_Վqyi oZM*ub..d?}8dڣ|9 kMލkJ|B' :%hUUdPlM]FW`A?=UځJ,;bm_G1TO(͖}V}k0p[됦5*ꪋNu`3vg{IYОR@bgwo{ܷޤU2+Q+؀x@ӡ2T0h_71H73ahh ym }i#&H \jjC2y%Cd X᠃T}GXӏ#gƹm#ƙݍ:'VʺXtXM.!8OIQ4(뿿&~JO0+aKS&q O\DzwEsҀ60!Z<Sr4qe: 8[v Jmz˿%C/)pѿ82/Uk-]=|cT856e<&mM菾O>|ex4U:z< /Ox]8[ ^ȳ0 ];6|y:תKʚ4K;/,c Tܛ6boٲ9ESBa'm B<&Gް_}sq|)l3Ztk  'unOYm0D}2cR^>sJLS/?ρ?B\^(7xjҘA|-g!D؋yNZMjԬsMl'j!˜ׅFVxBPǥ>R< !?w].KR:O=)њv8FhbD ;y 4 [j gؤ['3ޟ;Uj+#+/mq߀TR٫JL4 Jh {*(1z?}JEmϭ/kxjSkk|1NBCvكh]ݕŇнu/>ޏ w#;ӷ1eza-7i4M4[|Kqhz<#P༗Y*MBF4A`ۇagx>ca ?"f?mek;gü<˓12Ǣ}<98eV1%Uj8^Bxݚzy3zԈ~qB-#%sڂX_{)w; 2s(+[Xh%~XGo7saOY29{k0f0e@l7 &ys`oR6>Q3ͤ5ЮhO31d5c#}KkϹu#ofc=Pq~1euhKmpTbw^ yWS|!; I* 5HTq=dTGzO+ )z"/?>EM:h"pw1R3^:?CEe#rlMh|}Ncr 5]螁Ed F>$wnǚϩYÜmky=ܞ}d{o~秷@ llDT\XS9X02)' ٙ0$:e<s@e<ݖ1}𵴅41Bk?=G?k|[w|l_9s>@:㪁ÜNh#ھBs3a]$G(UTRQ\V2'6p<0yMOI_*#|&vPgz(8D=y97q]wBqncQͨσJ""_l_I )?۴QƊ?aP pOCio>[Kxmlg3ڶul)hSE-I*/(Uֻ:Q xŒJ,\+ydrVbxuK궴&MW_Ün\5< ;v1@*4 ^qo7LJS)?;z:S1:uX+9]"ᘌHgiwF~Qy>s>?s|_ \?m{2]Tܵ3'PE~K,;##)s{*rSW-iSXubxM{>%}^9+?&cg5ηgxv Ƭ+\lP+1<=U]ge3DEQ ޮThEC,iTK#< ׎ Zq2 ׫\ UOefbvn3q ;Ҵ [Pt Dgː#{0xS3U:P[SaтFiL0  Cxyxa4ɨF4P]U;vn>^(A3I⚡qJRmP{P z8)*[r)jRATکvF}PiT4\{WzWzWzWzWzWzS?-1OSM n 럆L<_ї"   GFʠN= P0@ }}? Control Inz@HoZ`Ez]UO GFʠN= O }}?Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , u k@ BLpA,Z`Ez]UO GFʠN=85 }}?uW}Mzq>Z`Ez]UO1釥GP>ap,uW}Mzq>Z`Ez]UO GFʠN=P 0A }}? Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA}}.@p@uW}Mzq>Z`Ez]UOY@z@Ho1(ssD =l$Pause Activity, 1k@ BLpA,uW}Mzq>2|=Bynj(z@Ho4W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF`DHc@@P@? asvHhTGeSBgc8 9K^掅uW}Mzq>-1OSM n 럆L<_ї"   GFʠN= P0@ }}? Control Inz@HoZ`Ez]UO GFʠN= O }}?Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , u k@ BLpA,Z`Ez]UO GFʠN=85 }}?uW}Mzq>Z`Ez]UO1釥GP>ap,uW}Mzq>Z`Ez]UO GFʠN=P 0A }}? Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA}}.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandb// renameActor // third command script of mesh importer activity loop // // if first mesh then rename the default "Actor, 1" // later read weights from md5mesh file and reset to these values // // Doom3 md5mesh import for trueSpace 7.6 // February 26 2008 // // by Clinton Reese // // // // The entire import program is broken up into seperate command scripts with pause activities so tS scene can update, tS scene only updates after exiting a command script // // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); scene = Space.CurrentScene(); currentMesh = Node.Value(owner + "/ActvLoop","Current iteration"); iterCount = Node.Value(owner + "/ActvLoop","Iteration count"); if(currentMesh==0) { Node.Value(owner,"statusLine") = "rename the actor"; temp = Node.Rename(scene + "/Actor, 1", "doomActor"); } } NScript Object Package/jScript language%. 4}d 4W}@O{(XFҦV>g'JNjn*pn@DBb@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їn  ControlOˁ CRih[ eм8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0e:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =ż$Pause Activity, 2k@ BLpA,uW}Mzq>̼2|=Bynjͼz@Hoμ4W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF`DSCc@@P@?uW}Mzq> asvHhTGeSBgc8 9K^掅-1OSM n 럆L<_ї"   GFʠN= P0@ }}? Control Inz@HoZ`Ez]UO GFʠN= O }}?Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , u k@ BLpA,Z`Ez]UO GFʠN=85 }}?uW}Mzq>Z`Ez]UO1釥GP>ap,uW}Mzq>Z`Ez]UO GFʠN=P 0A }}? Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA}}.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Doom3 md5mesh import // nov 2005 // clinton reese // // joint position is good // no way to parent in script // next do mesh // mesh more involved than I thought // test mesh with cubes first, uses quat rotation to position points relative to the joints // // nov 19 - file data is all being read properly // next get actual point positions and create a box at each vertex(or every other or third or fourth...) // // NOTE: need parseInt(), parseFloat() in some cases to make sure saved as a number // any time you add 2 things they both must be numbers or they add as strings // // mesh successful // but how handle multiple meshes - test has 4 meshes // would also like to import shaders incl normal map // PLAN: // get textures for test model // do uv assignment // try use normal map with color map etc // multiple mesh creation on the fly or select single mesh to load via list box // problem: invisible in player unless copy, then can see copy in player // // multi-mesh problem solved, objects created outside via node create and // copy mesh, material and transform nodes from within owner of this script // use registered mesh attribute so dont need copy and hookup shape node // meshes still not vivible in player without copy or modeller mesh edit // uv harder than expected - little info available // got info but looks like uv stuff is broken // do bones as group object next // // April 22 // build heiarchy of skeleton // hiearchy is good now attach transform to geo // Hierarchy of md5mesh import is good, joints are all in the correct locations // *geo is for looks only, manipulate the group/encapsulated node // can't do much more until ts7.5 skeleton is done // // April 23 // new skeleton geometry requires import with player view not model view // loads much faster if set matrix of objects // all is good one thing left rotate the joints // ROTATE JOINTS WONT WORK PUT BACK TO SIMPLE GEOMETRY // // Nov 19 2006 // start first ts75 version // if joints not connected to bones then positioning is perfect // joint positions a little crazy when connected to bones // ? // reason unknown // Reason Found - matrix def changes when bones are involved - only true when set matrix programatically // joint position is absolute when no bones are attached // with bones attached position is relative to parent // it's weird but should make the animation import easier - assuming nothing changes(it is tS75 BETA) // // TODO - clear out code for fake skeleton // LATER - skin the skeleton when possible // // May 27 2007 - prepare ts75 non beta release // // Dec 22 2007 - important discovery need to make initial "empty" skeleton in front view drawn top to bottom // then rename and delete extra joint and reset matrix and move skeleton to origin and will line up with mesh // also changed so initial skeleton template has a joint and bone already, so can rotate origin // // Execute // Called to execute the command function Execute(params) { MyFileName = params.conValue('MyFileName'); // TODO: put your action code here System.Trace("start of import"); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); boneFullName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vert weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments //testing //skinstrm = System.CreateDO("Space 3D Package/Skinning stream Data");//weights and xyz //skinparam = System.CreateDO("Space 3D Package/Skinning parameters DO");//skin parameters - has more functions than docs say //skinindstrm = System.CreateDO("Space 3D Package/Skinning index stream Data");//has index and weight is this "Space3D.RdSkinWeightIndexed"? //skininddir = System.CreateDO("Space 3D Package/Skinning direct stream data");//no index only weights so maybe "Space3D.RdSkinWeightDirect"? //skinpa //end testing scene = Space.CurrentScene(); for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; System.Trace("numJoints = " + numJoints); } if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; System.Trace("numMeshes = " + numMeshes); } if (msgtag[0] == "mesh") { curmesh = curmesh + 1; } if (msgtag[0] == "\t//") { if (msgtag[1] == "meshes:") { meshName[curmesh] = msgtag[2]; System.Trace("mesh name is " + meshName[curmesh]); scene = Space.CurrentScene(); encapsO = Node.Create('Kernel Package/Object', scene);//create empty node in scene encaps = Node.Rename(encapsO, meshName[curmesh]); owner = System.ThisOwner(); Node.Copy(owner + "/doomShape", encaps);//copy blank mesh to new node Node.ExportConnector(encaps + "/doomShape","Mesh","",1,1); Node.Copy(owner + "/doomTransform", encaps);//copy transform to new node Node.Rename(encaps + "/doomTransform", "Transform"); Node.ExportConnector(encaps + "/Transform","Matrix","",1,1); Node.ExportConnector(encaps + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","OwnerMatrix","",1,1); Node.Copy(owner + "/doomBlankDXMaterial", encaps);//copy material to new node } } if (msgtag[0] == "\tnumverts") { var numverts = msgtag[1]; vertCnt = 0; System.Trace("numverts = " + numverts); dT = System.CreateDO("Space 3D Package/UV Coordinate Stream Data"); dT.SetNumUVCoords(numverts); } if (msgtag[0] == "\tvert") { //read uv and index vertCnt = msgtag[1]; dT.u(vertCnt) = msgtag[3]; dT.v(vertCnt) = msgtag[4]; firstWeight[vertCnt] = parseInt(msgtag[6]);// index of first weight for vertex weightElem[vertCnt] = msgtag[7]; // number of weights assigned to vertex if (vertCnt < 2) System.Trace("firstWeight=" + firstWeight[vertCnt] + " count=" + weightElem[vertCnt]); if (vertCnt == numverts-1) { vertCnt = -1; } } if (msgtag[0] == "\tnumtris") { numtris = msgtag[1]; triCnt = 0; // define faces triface[curmesh] = System.CreateDO("Space 3D Package/Triangle Vertices Stream Data"); // testdUV = System.CreateDO("Space 3D Package/UV Coordinate Stream Data"); UVTri[curmesh] = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); UVTri[curmesh].SetNumUVTripleIndices(numtris); triface[curmesh].SetNumTripleIndices(numtris); triface[curmesh].BeginWrite(); System.Trace("num triangles = " + numtris); } if (msgtag[0] == "\ttri") { triCnt = msgtag[1]; triface[curmesh].i(triCnt) = msgtag[4];//reverse order so face normal is good triface[curmesh].j(triCnt) = msgtag[3]; triface[curmesh].k(triCnt) = msgtag[2]; UVTri[curmesh].i(triCnt) = msgtag[4]; UVTri[curmesh].j(triCnt) = msgtag[3]; UVTri[curmesh].k(triCnt) = msgtag[2]; if (triCnt < 2) System.Trace("face ijk= " + triface[curmesh].i(triCnt) + ", " + triface[curmesh].j(triCnt) + ", " + triface[curmesh].k(triCnt)); if ( triCnt == numtris-1) { triCnt = -1; triface[curmesh].EndWrite(); } } if (msgtag[0] == "\tnumweights") { numweights = msgtag[1]; weightCnt = 0; System.Trace("num weights = " + numweights); } if (msgtag[0] == "\tweight") { weightCnt = msgtag[1]; wtJoint[weightCnt] = msgtag[2]; weight[weightCnt] = msgtag[3]; wtX[weightCnt] = msgtag[5]; wtY[weightCnt] = msgtag[6]; wtZ[weightCnt] = msgtag[7]; if (weightCnt < 2) { System.Trace("index,joint,weight=" + weightCnt + ", "+ wtJoint[weightCnt] + ", " + weight[weightCnt]); System.Trace("XYZ=" + wtX[weightCnt] + ", " + wtY[weightCnt] + ", " + wtZ[weightCnt]); } if ( weightCnt == numweights - 1) { //build mesh System.Trace("build the mesh"); dV = System.CreateDO("Space 3D Package/Vertex Stream Data"); dV.SetNumVertices(numverts); dV.BeginWrite(); for (vt = 0; vt < numverts ; vt++) { posX = 0; posY = 0; posZ = 0; wtCnt = weightElem[vt]; if (vt<2) System.Trace("weight count=" + wtCnt); fw = firstWeight[vt]; if (vt<2) System.Trace("first weight=" + fw); for (wt = 0; wt < wtCnt; wt++) { //find vertex from weight, weightXYZ, joint pos and joint quat //joint rotation matrix(quaternion) wi = fw + wt;//weight index jointIndex = wtJoint[wi]; if(vt<2) System.Trace("wi, joint index=" + wi + ", " + jointIndex); qx = xq[jointIndex]; qy = yq[jointIndex]; qz = zq[jointIndex]; qw = wq[jointIndex]; if(vt<2) System.Trace("xyzw=" + qx + ", " + qy + ", " + qz +", " + qw); rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; // rm dot XYZ = rotated position rposX = rm11*wtX[wi] + rm21*wtY[wi] + rm31*wtZ[wi]; rposY = rm12*wtX[wi] + rm22*wtY[wi] + rm32*wtZ[wi]; rposZ = rm13*wtX[wi] + rm23*wtY[wi] + rm33*wtZ[wi]; posX = posX +(jx[jointIndex] + rposX)*weight[wi]; posY = posY +(jy[jointIndex] + rposY)*weight[wi]; posZ = posZ +(jz[jointIndex] + rposZ)*weight[wi]; } dV.x(vt) = posX * myScale; dV.y(vt) = posY * myScale; dV.z(vt) = posZ * myScale; //create cube at position of vertex posXYZ if (vt < 0) { curCube = Space.Cube(0.1, 0.1, 0.1, 1, 1, 1); Node.Value(curCube, "tx") = posX * myScale; Node.Value(curCube, "ty") = posY * myScale; Node.Value(curCube, "tz") = posZ * myScale; System.Trace("vert position = " + posX + ", " + posY + ", " + posZ); } } // verts done, triangles done try create TS mesh dV.EndWrite(); dM = System.CreateDO("Space 3D Package/Mesh Data"); dM.AttachVerticesStream(dV); dM.AttachTrianglesStream(triface[curmesh]); dM.AttachCustStream(dT); dM.AttachTrianglesStream(UVTri[curmesh]); Node.Value(encaps + "/doomShape","Mesh") = dM; //shape not sticking try this Feb 23 2008 Node.Value(encaps + "/doomShape","Input Mesh") = dM; myMatrix.LoadIdentity(); Node.Value(encaps, "Matrix") = myMatrix; //the mesh is built so now do the skinning here //move object into actor mInActor = Node.Move(encaps,doomAct); //add skinning node Node.Copy(owner + "/Skinning",mInActor); //"skin is stored inside skinning node skin connector. it contains IRdSkinningParameters. //use AddBone(bone node, binding matrix) to add new bone. //then use SetSkinningData to define skinning weights. parameters are (bone node name, skinning stream) //skinning stream is Space3D.RdSkinWeightIndexed which stores (vertex indes, skinning weight) pairs or Space3D.RdSkinWeightDirect which contains per vertex skinning weights directly." //if(curmesh==1) return; System.Trace(numJoints); System.Trace(numverts); System.Trace(wtCnt); for(jind=0;jind<numJoints;jind++) { System.Trace("calc weights for bone " + jind); for(ii=0;ii<numverts;ii++) tsBoneWeights[ii]=0;//default indexless weights to zero for each vertex for current bone of interest for(vind=0;vind<numverts;vind++) { wtCnt = weightElem[vind]; fw = firstWeight[vind]; for (wtt = 0; wtt < wtCnt; wtt++) { wi = fw + wtt;//weight index jIndex = wtJoint[wi]; if(jIndex==jind) { //match found store weight value tsBoneWeights[vind] = weight[wi]; } } } //*************************************************************now use bone name along with weights to skin the bone //skinstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); //skinparam = System.CreateDO('Space 3D Package/Skinning parameters DO'); //outstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); //var outstrm2 = System.CreateDO('Space 3D Package/Skinning direct stream data'); //var outstrm3 = System.CreateDO('Space 3D Package/Skinning index stream Data'); //scene = Space.CurrentScene(); //skinparam = Node.Value(scene + "/testActor/Cube/Skinning","Weights"); //numBones = skinparam.GetNumBones(); //skinstream = skinparam.GetSkinningData(scene + "/testActor/Skeleton/Bone"); //outstrm2 = skinparam.GetSkinningData(scene + "/testActor/Skeleton/Bone"); //outstrm3 = skinparam.GetSkinningData(scene + "/testActor/Skeleton/Bone"); //verts = skinstream.GetNumSkinWeights();//good even if weight=0 shows in list //i=0; //for(j=0;j<verts;j++) //{ // output = 'w=' +skinstream.weight(j); //} //outstream.SetNumRecords(verts); //for(k=0;k<verts;k++) //{ // outstream.weight(k) = 0.5; //} //skinparam.SetSkinningData(scene + "/testActor/Skeleton/Bone",outstream); //Node.Value(scene + "/testActor/Cube/Skinning","Weights") = skinparam; //*************************************************************end of skinning code } } } // read joint data if (jointCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); parentName = ""; if(jointCnt != 0) parentName = msgtag[11].substr(0,msgtag[11].length);//april //april boneName[jointCnt] = jointName; boneFullName[jointCnt] = "error"; if(jointCnt == 0) { pBoneIndex[jointCnt] = -1;//first bone no parent //dec 2007 comment out the old //Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene //Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); ////donet add new bone use skeleton bone for 1st 2 joints ////Node.Copy(owner + "/Bone", scene + "/characterBase");//copy bone in ////temp = Node.Rename(scene + "/characterBase/Bone", jointName + "Bone"); //// note: order of arguments matters in ConnectTo, order of connections may matter ////todo connect origin joint and skeleton bone node //Node.ConnectTo(scene + "/Skeleton/" + "skeletonBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); ////todo connect origin joint and origin bone ////Node.ConnectTo(scene + "/characterBase/" + jointName + "Joint","Joint",scene + "/characterBase/" + jointName + "Bone","Root"); //temp = Node.Rename(scene + "/Skeleton/skeletonBone", jointName + "Bone"); //dec 2007 use existing MyJoint and MyBone in Skeleton Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.Copy(owner + "/doom3jointgeo", scene); jointMesh[jointCnt] = Node.Rename(scene + "/doom3jointgeo", "theJoint"); boneFullName[jointCnt] = jointName ; encaps1 = Node.Create('Kernel Package/Object', encaps); //encaps is the root node of the skeleton encapsCurrent = Node.Rename(encaps1, jointName); Node.Copy(owner + "/doomTransform", encapsCurrent);//copy transform to new node Node.Rename(encapsCurrent + "/doomTransform", "Transform"); Node.ExportConnector(encapsCurrent + "/Transform","Matrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","OwnerMatrix","",1,1); Node.ConnectTo(encaps + "/Transform","WldMatrix",encaps + "/" + jointName,"OwnerMatrix"); } else { for(ii=0; ii<jointCnt; ii++) { if(parentName == boneName[ii]) { parentIndex = ii; pBoneIndex[jointCnt] = parentIndex;//save for leaf joint creation zscale = (msgtag[4]-jz[parentIndex])*myScale; // this works but scale from center need pivot point Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //todo connect joint Joint to bone Root //order of ConnectTo args is important, order of connections may be important test now // connect bone Bone to joint Bone Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.Copy(owner + "/doom3jointgeo", scene); jointMesh[jointCnt] = Node.Rename(scene + "/doom3jointgeo", "theJoint"); boneFullName[jointCnt] = boneFullName[ii] + "/" + jointName ; encaps1 = Node.Create('Kernel Package/Object', encaps + "/" + boneFullName[ii]); //encaps is the root node of the skeleton encapsCurrent = Node.Rename(encaps1, jointName); Node.Copy(owner + "/doomTransform", encapsCurrent);//copy transform to new node Node.Rename(encapsCurrent + "/doomTransform", "Transform"); Node.ExportConnector(encapsCurrent + "/Transform","Matrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","OwnerMatrix","",1,1); Node.ConnectTo(encaps + "/" + boneFullName[ii] + "/Transform","WldMatrix",encapsCurrent,"OwnerMatrix"); } } } //System.Trace(boneName[jointCnt]); //System.Trace(boneFullName[jointCnt]); jointMesh[jointCnt] = Node.Rename(jointMesh[jointCnt], jointName + "geo"); //the joint positions are in absolute world space so take diff to get local space myMatrix.LoadIdentity(); if(jointCnt == 0) { myMatrix.SetTransX(msgtag[2]*myScale); myMatrix.SetTransY(msgtag[3]*myScale); myMatrix.SetTransZ(msgtag[4]*myScale); //set joint move limits xlim = msgtag[2]*myScale; ylim = msgtag[3]*myScale; zlim = msgtag[4]*myScale; } else { myMatrix.SetTransX((msgtag[2]-jx[parentIndex])*myScale); myMatrix.SetTransY((msgtag[3]-jy[parentIndex])*myScale); myMatrix.SetTransZ((msgtag[4]-jz[parentIndex])*myScale); //set joint limits xlim = (msgtag[2]-jx[parentIndex])*myScale; ylim = (msgtag[3]-jy[parentIndex])*myScale; zlim = (msgtag[4]-jz[parentIndex])*myScale; } Node.Value(encapsCurrent,"Matrix") = myMatrix; // save joint position - unscaled jx[jointCnt] = parseFloat(msgtag[2]); jy[jointCnt] = parseFloat(msgtag[3]); jz[jointCnt] = parseFloat(msgtag[4]); //set joint move limits(local space) dec 2007 Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxZ") = zlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinZ") = zlim; xq[jointCnt] = msgtag[7];//rotation of joint in quaternion form yq[jointCnt] = msgtag[8]; zq[jointCnt] = msgtag[9]; wq[jointCnt] = 1 - xq[jointCnt]*xq[jointCnt] - yq[jointCnt]*yq[jointCnt] - zq[jointCnt]*zq[jointCnt]; if (wq[jointCnt] < 0) { wq[jointCnt] = 0; } else { wq[jointCnt] = Math.sqrt(wq[jointCnt]) } //dec 2007 rotate root joint if(jointCnt == 0) { qw = wq[jointCnt]; qx = xq[jointCnt]; qy = yq[jointCnt]; qz = zq[jointCnt]; sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; sqw=qw*qw; //try pure transform myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,msgtag[2]*myScale);//x myMatrix.SetAt(3,1,msgtag[3]*myScale);//y myMatrix.SetAt(3,2,msgtag[4]*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); // end pure transform test //true bone Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts75 root joint //end true bone } else { //joint position is absolute when no bones are attached //with bones attached position is relative to parent myMatrixA.LoadIdentity(); myMatrixA.SetTransX(msgtag[2]*myScale); myMatrixA.SetTransY(msgtag[3]*myScale); myMatrixA.SetTransZ(msgtag[4]*myScale); //myMatrixA.SetScaleX(2.0); myMatrixA.SetScaleY(2.0); myMatrixA.SetScaleZ(2.0);//set size of floating test joints to 4 Node.Value(scene + "/Skeleton/" + jointName + "Joint","Matrix") = myMatrix;//set matrix of ts75 joint - try rel } Node.Copy(jointMesh[jointCnt], encapsCurrent); Node.Delete(jointMesh[jointCnt]); // hook up transform to geometry Node.ConnectTo(encapsCurrent + "/Transform","WldMatrix",encapsCurrent + "/" + jointName + "geo","OwnerMatrix"); //march 2007 get transform from fake skel myMatrix = Node.Value(encapsCurrent,"ObjMatrix"); Node.Value(scene + "/Skeleton/" + jointName + "Joint","Matrix") = myMatrix; //dec 2007 rotate root joint if(jointCnt == 0) { } jointCnt = jointCnt + 1; if (jointCnt == numJoints) { jointCnt = -1; myMatrix.LoadIdentity(); Node.Value(encaps, "Matrix") = myMatrix; //add leaf joints for(cj=0;cj<numJoints;cj++) { //check if exist in parent list - if it's the parent of someone then not a leaf leafBone = 1; for(ci=0;ci<numJoints;ci++) { if(pBoneIndex[ci]==cj) { leafBone = 0; } } //if not then needs a leaf joint if(leafBone==1) { System.Trace(boneName[cj] + "Leaf"); //new joint pos at joint + joint - parent //note march 2007 orientation of joints is not set only position //so import is not good for later export //leaf orientation not matter in any case //Node.Copy(owner + "/Joint", scene + "/characterBase");//copy joint in //temp = Node.Rename(scene + "/characterBase/Joint", boneName[cj] + "Leaf");//add leaf postfix //Node.ConnectTo(scene + "/characterBase/" + boneName[cj] + "Bone","Bone",scene + "/characterBase/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone //myMatrixA.LoadIdentity(); //myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); //myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); //myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); //Node.Value(scene + "/characterBase/" + boneName[cj] + "Leaf","Matrix") = myMatrix; //copy leaf joint in to skeleton Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", boneName[cj] + "Leaf"); Node.ConnectTo(scene + "/Skeleton/" + boneName[cj] + "Bone","Bone",scene + "/Skeleton/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone myMatrixA.LoadIdentity(); myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); Node.Value(scene + "/Skeleton/" + boneName[cj] + "Leaf","Matrix") = myMatrix; } } //copy doomActor into scene doomAct = Node.Copy(owner + "/doomActor", scene); doomsk = Node.Move(scene + "/Skeleton", doomAct); Node.ConnectTo(doomAct + "/Transform","WldMatrix",doomsk,"OwnerMatrix"); } } if (msgtag[0] == "joints") { jointCnt = 0; scene = Space.CurrentScene(); encapsO = Node.Create('Kernel Package/Object', scene);//create empty node in scene encaps = Node.Rename(encapsO, "doomSkeleton"); //transform node owner = System.ThisOwner(); Node.Copy(owner + "/doomTransform", encaps);//copy transform to new node Node.Rename(encaps + "/doomTransform", "Transform"); Node.ExportConnector(encaps + "/Transform","Matrix","",1,1); Node.ExportConnector(encaps + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","OwnerMatrix","",1,1); } // vertex position is weighted sum of weights relative to the bone // need to use quat rotation of bone on point, weight it and add them together // weights add to a value of 1.0 // // // } System.Alert("wait see if pause helps"); CharacterEditor.AttachSkinToSkeleton(Space.CurrentScene() + "/" + meshName[0],Space.CurrentScene() + "/Skeleton",0.400,25.000,4);//test attach skin to skeleton, 3 parameters are unknown System.Trace("end of import"); }NScript Object Package/jScript language~൱D@ j#^cstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnDCb@@P@2|=Bynj|?z@Hoۙ>?NffMCOC:\Documents and Settings\Clinton\My Documents\doom3\lostsoul\lostsoul.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ BjNewCommandTi// MD5SkeletonImport // first command script of mesh importer // // Doom3 md5mesh import for trueSpace 7.6 // February 26 2008 // // by Clinton Reese // // // July 30 2008 - modify so not have "Joint" in the joint name, make more compatible // // // Dec 22 2007 - important discovery need to make initial "empty" skeleton in front view drawn top to bottom // then rename joints and bone ,delete extra joint, reset matrix and move skeleton to origin and will line up with imported mesh // also changed so initial skeleton template has a joint and bone already, so can rotate origin bone of doom character // // // The entire import program is broken up into seperate command scripts with pause activities so tS scene can update, tS scene only updates after exiting a command script // // // file format for md5mesh(all translations and rotations are in world coordinates // header section // number joints // number meshes // joint information and hierarchy // name, parent index, translation, rotation, parent name // mesh section(maybe more than one) // mesh name // shader name // number of uv coordinates // list of uv's including the weight index and number of weights(skinning weights) // number of triangles // triangle definition defined by uv coordinates which in turn refer to actual xyz values // number of weights // list of weights - index, joint index, weight, position(xyz) rel to joint - final position is joint(xyz) + [weight(xyz) rotated by joint orientation] // note: only one joint/weight(xyz) is needed to get the position // // Execute // Called to execute the command function Execute(params) { owner = System.ThisOwner(); MyFileName = params.conValue('MyFileName'); System.Trace("start of MD5SkeletonImport"); Node.Value(owner,"statusLine") = "MD5SkeletonImport"; var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vert weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments parentMat = System.CreateDO("Math Package/Matrix Float Data"); parentMatInv = System.CreateDO("Math Package/Matrix Float Data"); childMat = System.CreateDO("Math Package/Matrix Float Data"); scene = Space.CurrentScene(); //process the file data //header info is ignored for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); //read total number of joints if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; } //read total number of meshes and initialize activity loop if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; Node.Value(owner + "/ActvLoop","Iteration count") = numMeshes - 1; } // anything but -1 indicates joint data reading mode //process next joint line if (jointCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); parentName = ""; if(jointCnt != 0) parentName = msgtag[11].substr(0,msgtag[11].length);//everyone except first joint has a parent boneName[jointCnt] = jointName; // save joint position - unscaled jx[jointCnt] = parseFloat(msgtag[2]); jy[jointCnt] = parseFloat(msgtag[3]); jz[jointCnt] = parseFloat(msgtag[4]); //read quaternion rotation and build a matrix from it xq[jointCnt] = msgtag[7];//rotation of joint in quaternion form yq[jointCnt] = msgtag[8]; zq[jointCnt] = msgtag[9]; wq[jointCnt] = 1 - xq[jointCnt]*xq[jointCnt] - yq[jointCnt]*yq[jointCnt] - zq[jointCnt]*zq[jointCnt]; if (wq[jointCnt] < 0) { wq[jointCnt] = 0; } else { wq[jointCnt] = Math.sqrt(wq[jointCnt]) } qw = wq[jointCnt]; qx = xq[jointCnt]; qy = yq[jointCnt]; qz = zq[jointCnt]; sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; sqw=qw*qw; myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,msgtag[2]*myScale);//x myMatrix.SetAt(3,1,msgtag[3]*myScale);//y myMatrix.SetAt(3,2,msgtag[4]*myScale);//z //build rotation matrix rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); if(jointCnt == 0) { pBoneIndex[jointCnt] = -1;//first bone no parent //dec 2007 use existing MyJoint and MyBone in Skeleton Node.Copy(owner + "/Skeleton", scene);//copy ts76 skeleton to scene //copy joint and bone and rename them Node.Copy(owner + "/Joint", scene + "/Skeleton"); //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); temp = Node.Rename(scene + "/Skeleton/Joint", jointName); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //set joint move limits(local space same as world for first joint) //restrict to rotation movement only to keep skeleton from exploding xlim=msgtag[2]*myScale; ylim=msgtag[3]*myScale; zlim=msgtag[4]*myScale; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxX") = xlim; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxY") = ylim; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxZ") = zlim; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinX") = xlim; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinY") = ylim; //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinZ") = zlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMaxX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMaxY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMaxZ") = zlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMinX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMinY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"MovMinZ") = zlim; //set matrix of joint and connect joint with bone to non animated root bone("MyBone") //Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts76 root joint //Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); //Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.Value(scene + "/Skeleton/" + boneName[jointCnt] ,"Matrix") = myMatrix;//set matrix of ts76 root joint Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName ,"Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName ,"Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); } else { // not first joint process here //search for parent name then process when match for(ii=0; ii<jointCnt; ii++) { if(parentName == boneName[ii]) { parentIndex = ii; pBoneIndex[jointCnt] = parentIndex;//save for leaf joint creation //zscale = (msgtag[4]-jz[parentIndex])*myScale; // this works but scale from center need pivot point //copy a joint and bone in to the skeleton with renaming Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); temp = Node.Rename(scene + "/Skeleton/Joint", jointName ); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //inverse parent wldmatrix multiplied by child gives needed relative matrix for the joint and limits //parentMat = Node.Value(scene + "/Skeleton/" + parentName + "Joint","WldMatrix"); parentMat = Node.Value(scene + "/Skeleton/" + parentName ,"WldMatrix"); parentMatInv = parentMat.Invert(); childMat = myMatrix; childMat.Mult(parentMatInv); //apply corrected matrix to joint //Node.Value(scene + "/Skeleton/" + jointName + "Joint","Matrix") = childMat; Node.Value(scene + "/Skeleton/" + jointName ,"Matrix") = childMat; //connect new joint and bone to parent bone //Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); //Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName ,"Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName ,"Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); //set limits to same as joint matrix xlim = childMat.GetTransX(); ylim = childMat.GetTransY(); zlim = childMat.GetTransZ(); //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMaxX") = xlim; //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMaxY") = ylim; //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMaxZ") = zlim; //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMinX") = xlim; //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMinY") = ylim; //Node.Value(scene + "/Skeleton/" + jointName + "Joint","MovMinZ") = zlim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMaxX") = xlim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMaxY") = ylim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMaxZ") = zlim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMinX") = xlim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMinY") = ylim; Node.Value(scene + "/Skeleton/" + jointName ,"MovMinZ") = zlim; } } } jointCnt = jointCnt + 1; //last joint processed? if (jointCnt == numJoints) { //get out of joint process mode jointCnt = -1; myMatrix.LoadIdentity(); //add leaf joints for(cj=0;cj<numJoints;cj++) { //check if exist in parent list - if it's the parent of someone then not a leaf leafBone = 1; for(ci=0;ci<numJoints;ci++) { if(pBoneIndex[ci]==cj) { leafBone = 0;//parent found - not a leaf joint } } //if not then needs a leaf joint if(leafBone==1) { //copy leaf joint in to skeleton Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", boneName[cj] + "Leaf"); Node.ConnectTo(scene + "/Skeleton/" + boneName[cj] + "Bone","Bone",scene + "/Skeleton/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone //place it in same general direction with length of 1/4 last parent to child in chain myMatrix.LoadIdentity(); myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); Node.Value(scene + "/Skeleton/" + boneName[cj] + "Leaf","Matrix") = myMatrix; } } } } //found start of joints section if (msgtag[0] == "joints") { jointCnt = 0;//start joint count and processing scene = Space.CurrentScene(); owner = System.ThisOwner(); } } System.Trace("end of MD5SkeletonImport"); // next script - MD5MeshImport }NScript Object Package/jScript language~൱D@ j#^cstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnAb@@P@2|=Bynj|?z@Hoۙ>?NffMCOvC:\Documents and Settings\Clinton\Desktop\pendulum.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Hoͤ*EgbĬdstatus2AEHM'ceZU@䑧r%!4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n##[jdOA#}D2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ |NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var statusLine = params.ConValue('statusLine'); // TODO: put your computation here } NScript Object Package/jScript languagestringstatusLine[jdOA#}4W}@O{[jdOA#}TMD5MeshSkinning - MESH IMPORT IS COMPLETE(XFҦV>g'JNjn*pFqCBb@@@?-1OSM n 럆L<_ї, .;]kI 忞@48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ R{NewCommanddz// Doom3 md5mesh import // nov 2005 // clinton reese // // // Dec 22 2007 - important discovery need to make initial "empty" skeleton in front view drawn top to bottom // then rename and delete extra joint and reset matrix and move skeleton to origin and will line up with mesh // also changed so initial skeleton template has a joint and bone already, so can rotate origin // // Execute // Called to execute the command function Execute(params) { owner = System.ThisOwner(); MyFileName = params.conValue('MyFileName'); // TODO: put your action code here System.Trace("start of import"); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read entire file then process while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file now process data var msg = ""; var jointCnt = -1; var vertCnt = -1; var numtris = -1; var curmesh = -1; jointMesh = new Array(); firstWeight = new Array(); weightElem = new Array(); //number of weights assigned to vertex triface = new Array(); UVTri = new Array();//uv triangles like triface but with uv instead of vertices meshes = new Array(); meshName = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); // weight arrays wtJoint = new Array();//joint index weight = new Array(); //weight value(add to 1 for single vertex) wtX = new Array(); // XYZ relative to joint position and orientation wtY = new Array(); wtZ = new Array(); //april boneName = new Array(); boneFullName = new Array(); //march2007 pBoneIndex = new Array(); //feb2008 tsBoneWeights = new Array();//list of all vert weights for a bone myMatrix = System.CreateDO("Math Package/Matrix Float Data"); myMatrixA = System.CreateDO("Math Package/Matrix Float Data");//absolute for ts75 matrix - no local space adjustments scene = Space.CurrentScene(); for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; //System.Trace("numJoints = " + numJoints); } if (msgtag[0] == "numMeshes") { var numMeshes = msgtag[1]; //System.Trace("numMeshes = " + numMeshes); Node.Value(owner + "/ActvLoop","Iteration count") = numMeshes - 1; } // read joint data if (jointCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); parentName = ""; if(jointCnt != 0) parentName = msgtag[11].substr(0,msgtag[11].length);//april //april boneName[jointCnt] = jointName; boneFullName[jointCnt] = "error"; if(jointCnt == 0) { pBoneIndex[jointCnt] = -1;//first bone no parent //dec 2007 comment out the old //Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene //Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); ////donet add new bone use skeleton bone for 1st 2 joints ////Node.Copy(owner + "/Bone", scene + "/characterBase");//copy bone in ////temp = Node.Rename(scene + "/characterBase/Bone", jointName + "Bone"); //// note: order of arguments matters in ConnectTo, order of connections may matter ////todo connect origin joint and skeleton bone node //Node.ConnectTo(scene + "/Skeleton/" + "skeletonBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); ////todo connect origin joint and origin bone ////Node.ConnectTo(scene + "/characterBase/" + jointName + "Joint","Joint",scene + "/characterBase/" + jointName + "Bone","Root"); //temp = Node.Rename(scene + "/Skeleton/skeletonBone", jointName + "Bone"); //dec 2007 use existing MyJoint and MyBone in Skeleton Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.Copy(owner + "/doom3jointgeo", scene); jointMesh[jointCnt] = Node.Rename(scene + "/doom3jointgeo", "theJoint"); boneFullName[jointCnt] = jointName ; encaps1 = Node.Create('Kernel Package/Object', encaps); //encaps is the root node of the skeleton encapsCurrent = Node.Rename(encaps1, jointName); Node.Copy(owner + "/doomTransform", encapsCurrent);//copy transform to new node Node.Rename(encapsCurrent + "/doomTransform", "Transform"); Node.ExportConnector(encapsCurrent + "/Transform","Matrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","OwnerMatrix","",1,1); Node.ConnectTo(encaps + "/Transform","WldMatrix",encaps + "/" + jointName,"OwnerMatrix"); } else { for(ii=0; ii<jointCnt; ii++) { if(parentName == boneName[ii]) { parentIndex = ii; pBoneIndex[jointCnt] = parentIndex;//save for leaf joint creation zscale = (msgtag[4]-jz[parentIndex])*myScale; // this works but scale from center need pivot point Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //todo connect joint Joint to bone Root //order of ConnectTo args is important, order of connections may be important test now // connect bone Bone to joint Bone Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.Copy(owner + "/doom3jointgeo", scene); jointMesh[jointCnt] = Node.Rename(scene + "/doom3jointgeo", "theJoint"); boneFullName[jointCnt] = boneFullName[ii] + "/" + jointName ; encaps1 = Node.Create('Kernel Package/Object', encaps + "/" + boneFullName[ii]); //encaps is the root node of the skeleton encapsCurrent = Node.Rename(encaps1, jointName); Node.Copy(owner + "/doomTransform", encapsCurrent);//copy transform to new node Node.Rename(encapsCurrent + "/doomTransform", "Transform"); Node.ExportConnector(encapsCurrent + "/Transform","Matrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encapsCurrent + "/Transform","OwnerMatrix","",1,1); Node.ConnectTo(encaps + "/" + boneFullName[ii] + "/Transform","WldMatrix",encapsCurrent,"OwnerMatrix"); } } } //System.Trace(boneName[jointCnt]); //System.Trace(boneFullName[jointCnt]); jointMesh[jointCnt] = Node.Rename(jointMesh[jointCnt], jointName + "geo"); //the joint positions are in absolute world space so take diff to get local space myMatrix.LoadIdentity(); if(jointCnt == 0) { myMatrix.SetTransX(msgtag[2]*myScale); myMatrix.SetTransY(msgtag[3]*myScale); myMatrix.SetTransZ(msgtag[4]*myScale); //set joint move limits xlim = msgtag[2]*myScale; ylim = msgtag[3]*myScale; zlim = msgtag[4]*myScale; } else { myMatrix.SetTransX((msgtag[2]-jx[parentIndex])*myScale); myMatrix.SetTransY((msgtag[3]-jy[parentIndex])*myScale); myMatrix.SetTransZ((msgtag[4]-jz[parentIndex])*myScale); //set joint limits xlim = (msgtag[2]-jx[parentIndex])*myScale; ylim = (msgtag[3]-jy[parentIndex])*myScale; zlim = (msgtag[4]-jz[parentIndex])*myScale; } Node.Value(encapsCurrent,"Matrix") = myMatrix; // save joint position - unscaled jx[jointCnt] = parseFloat(msgtag[2]); jy[jointCnt] = parseFloat(msgtag[3]); jz[jointCnt] = parseFloat(msgtag[4]); //set joint move limits(local space) dec 2007 Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMaxZ") = zlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinX") = xlim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinY") = ylim; Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","MovMinZ") = zlim; xq[jointCnt] = msgtag[7];//rotation of joint in quaternion form yq[jointCnt] = msgtag[8]; zq[jointCnt] = msgtag[9]; wq[jointCnt] = 1 - xq[jointCnt]*xq[jointCnt] - yq[jointCnt]*yq[jointCnt] - zq[jointCnt]*zq[jointCnt]; if (wq[jointCnt] < 0) { wq[jointCnt] = 0; } else { wq[jointCnt] = Math.sqrt(wq[jointCnt]) } //dec 2007 rotate root joint if(jointCnt == 0) { qw = wq[jointCnt]; qx = xq[jointCnt]; qy = yq[jointCnt]; qz = zq[jointCnt]; sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; sqw=qw*qw; //try pure transform myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,msgtag[2]*myScale);//x myMatrix.SetAt(3,1,msgtag[3]*myScale);//y myMatrix.SetAt(3,2,msgtag[4]*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); // end pure transform test //true bone Node.Value(scene + "/Skeleton/" + boneName[jointCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts75 root joint //end true bone } else { //joint position is absolute when no bones are attached //with bones attached position is relative to parent myMatrixA.LoadIdentity(); myMatrixA.SetTransX(msgtag[2]*myScale); myMatrixA.SetTransY(msgtag[3]*myScale); myMatrixA.SetTransZ(msgtag[4]*myScale); //myMatrixA.SetScaleX(2.0); myMatrixA.SetScaleY(2.0); myMatrixA.SetScaleZ(2.0);//set size of floating test joints to 4 Node.Value(scene + "/Skeleton/" + jointName + "Joint","Matrix") = myMatrix;//set matrix of ts75 joint - try rel } Node.Copy(jointMesh[jointCnt], encapsCurrent); Node.Delete(jointMesh[jointCnt]); // hook up transform to geometry Node.ConnectTo(encapsCurrent + "/Transform","WldMatrix",encapsCurrent + "/" + jointName + "geo","OwnerMatrix"); //march 2007 get transform from fake skel myMatrix = Node.Value(encapsCurrent,"ObjMatrix"); Node.Value(scene + "/Skeleton/" + jointName + "Joint","Matrix") = myMatrix; //dec 2007 rotate root joint if(jointCnt == 0) { } jointCnt = jointCnt + 1; if (jointCnt == numJoints) { jointCnt = -1; myMatrix.LoadIdentity(); Node.Value(encaps, "Matrix") = myMatrix; //add leaf joints for(cj=0;cj<numJoints;cj++) { //check if exist in parent list - if it's the parent of someone then not a leaf leafBone = 1; for(ci=0;ci<numJoints;ci++) { if(pBoneIndex[ci]==cj) { leafBone = 0; } } //if not then needs a leaf joint if(leafBone==1) { //System.Trace(boneName[cj] + "Leaf"); //new joint pos at joint + joint - parent //note march 2007 orientation of joints is not set only position //so import is not good for later export //leaf orientation not matter in any case //Node.Copy(owner + "/Joint", scene + "/characterBase");//copy joint in //temp = Node.Rename(scene + "/characterBase/Joint", boneName[cj] + "Leaf");//add leaf postfix //Node.ConnectTo(scene + "/characterBase/" + boneName[cj] + "Bone","Bone",scene + "/characterBase/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone //myMatrixA.LoadIdentity(); //myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); //myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); //myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); //Node.Value(scene + "/characterBase/" + boneName[cj] + "Leaf","Matrix") = myMatrix; //copy leaf joint in to skeleton Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", boneName[cj] + "Leaf"); Node.ConnectTo(scene + "/Skeleton/" + boneName[cj] + "Bone","Bone",scene + "/Skeleton/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone myMatrix.LoadIdentity(); myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); Node.Value(scene + "/Skeleton/" + boneName[cj] + "Leaf","Matrix") = myMatrix; } } //copy doomActor into scene //doomAct = Node.Copy(owner + "/doomActor", scene); //doomsk = Node.Move(scene + "/Skeleton", doomAct); //Node.ConnectTo(doomAct + "/Transform","WldMatrix",doomsk,"OwnerMatrix"); } } if (msgtag[0] == "joints") { jointCnt = 0; scene = Space.CurrentScene(); encapsO = Node.Create('Kernel Package/Object', scene);//create empty node in scene encaps = Node.Rename(encapsO, "doomSkeleton"); //transform node owner = System.ThisOwner(); Node.Copy(owner + "/doomTransform", encaps);//copy transform to new node Node.Rename(encaps + "/doomTransform", "Transform"); Node.ExportConnector(encaps + "/Transform","Matrix","",1,1); Node.ExportConnector(encaps + "/Transform","WldMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","ObjMatrix","",1,1); Node.ExportConnector(encaps + "/Transform","OwnerMatrix","",1,1); } // vertex position is weighted sum of weights relative to the bone // need to use quat rotation of bone on point, weight it and add them together // weights add to a value of 1.0 // // // } //CharacterEditor.AttachSkinToSkeleton(Space.CurrentScene() + "/" + meshName[0],Space.CurrentScene() + "/Skeleton",0.400,25.000,4);//test attach skin to skeleton, 3 parameters are unknown System.Trace("end of skeleton import"); }NScript Object Package/jScript language] 4(stringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnKDCb@@P@2|=Bynj|?z@Hoۙ>?NffMCOC:\Documents and Settings\Clinton\My Documents\doom3\lostsoul\lostsoul.md5meshJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}Me<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=Material List(c.;]kI 忞@"r׈X4W}@O{$(XFҦV"`o-V?XM%-V?XM%(XFҦV>g'JNjn*pFCwCb@@P@?܂dKu=$RMaterial 0&.;]kI 忞@"Pr4W}@O{$(XFҦV"'gYأC۲+?(XFҦV>g'JNjn*pFC~Cb@@@?gYأC۲+?܂dKu=g'JNjn*p՞'fA5-_-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pFCrCd@@@B0?՞'fA5-_.F_P#J@#QL>g'JNjn*pF4CtCd@@@?.;]kI 忞@-1OSM n 럆L<_їˣ   Main GFʠN= 5 222.F_P#Z`Ez]UOU@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]2aMaterialb.F_P#T.F_P#Material Output material __W8E#(`Q8dS^M~b pbe5OD.GWf5pbfqΤIGGIpbg,S@vTVpbhiзVJilpbHj4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"lkF_`VertexShaderb`mt@*Ntt@*N Constant_shader Constant shader QVO Pk@bn<;vHwpbp 0S̤@+Rpb,S@vTV 0S̤@+R5OD.GWf54W}@O{зVJil(XFҦV>g'JNjn*pFDnCb@{@?<;vHw:KrbSxbDisabledEnabledAs OpaqueDisabledS^M~b .F_P#t@*NkF_-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI܂dKu=t&TextureModelShader R:>a[EH*M\R:>a[EH*M\LE2Data, 2$LE2 Data for node >g'JNjn*p7wCH7wCHLE2Data$LE2 Data for node >g'JNjn*py݀J}Ny݀J}N FloatInput floatShininessP4W}@O{$)rޙG )rޙG ˣLE2Data, 2$LE2 Data for node >g'JNjn*p(XFҦVLE2Data, 3"%%u5E bLE2Data, 6QA@y:l1QA@y:l1LE2Data, 5$LE2 Data for node >g'JNjn*pL QNIM5G&L QNIM5G&BitmapInput bitmap eSBgc$Q/G|]8$Q/G|]8LE2Data, 1$LE2 Data for node >g'JNjn*p-1OSM n#.;]kI 忞@"xн(0qΤIGGIf R:>a[EH*M\>g'JNjn*pFCA`@T@?L QNIM5G&eSBgcL 9K^掅 @xc` @7wCH>g'JNjn*pF[C)C`@T@?%%u5E b>g'JNjn*p^CCb@T@y݀J}N Ԡ>KC~B?4W}@O{y݀J}NA(XFҦV>g'JNjn*p^BCb@ `@y݀J}N Ԡ>BC?)rޙG >g'JNjn*pFCA`@T@?$Q/G|]8>g'JNjn*pFC`B`@T@?QA@y:l1>g'JNjn*pFAC`@@@?.;]kI 忞@-1OSM n 럆L<_їx  Default GFʠN=f0H1 }}L QNIM5G&Z`Ez]UOٓ PM>1wdf0H%\VVL QNIM5G&Z`Ez]UO GFʠN=0P@H1 }}y݀J}NZ`Ez]UO1釥GP>aP0@H,y݀J}NZ`Ez]UO GFʠN=@fpH1 }}qΤIGGIZ`Ez]UO}4կMj=+h@pH0qΤIGGI\VVqΤIGGIL{0nBg)`! ĨPhong Lighting P)\Fvq30:6~KAMpR]JĀ7pvJ ~~pЬ$&*2HӁdńp`Z[G {/,p@ zE%Sfp w!XCLp B#A)[(dP4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1" %%u5E b>g'JNjn*pFCLb@d@?4W}@O{(XFҦV>g'JNjn*pF@DHb@ b@?Z[G {/,:6~KAM B#A)[(dP)\Fvq3wk0.DX?_|X?dK;,w!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї,  zE%SfR]JĀ7/|V FK|$ýShaderInput?ڵfA'7(Ľ%dLrQn0`piDM7^@A툷ƽp1M@o= .ǽ}E[2CV)0Ƚ`MOWIB"ѥЬHtO{/( qQ@RjʽҥY@e&@B_;OKFJ*rͽHRSEpFC ~__um1CR¬5ٻzEuSSaI7֏bxн4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4%%u5E b>g'JNjn*pFC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4(XFҦV>g'JNjn*pFCrb@t@?#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& \InputFloatP+kCY5]BtOpxuM@n;LAPx\/3Kf͈,pHGqiFE0IN p(4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SHININESS%%u5E b>g'JNjn*pFPb@X@?4W}@O{+kCY5]BtOA(XFҦV>g'JNjn*pFBb@@T@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, fC{oShaderModelqΤIGGIPC/-~CxrEp4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pF DA`@P@?4W}@O{(XFҦV>g'JNjn*pFND,b@@T@?C/-~CxrE-1OSM n 럆L<_ї, qΤIGGInE InputBitmapL QNIM5G&p885%Kլy|T5%Kլy|SamplerBrickBitmap brick (TpFޚ@',Q])JNЈtQ])JNЈoBitmapOutput bitmap eSBgcGqiFE0IN p8A ?gŘrtA ?gŘrMinFilterbMinification filter (Point, Linear, Anisotropic)8X5 B%OKt5 B%OKMagFilterdMagnification filter (Point, Linear, Anisotropic)88Muf2BޠQTtMuf2BޠQTMipFilter^Mipmapping filter (Point, Linear, Anisotropic)8 T?cCx%Kt T?cCx%KU_AddressModexU Addressing mode (Wrap, Mirror, Clamp, Border, MirrorOnce)8QnfM9M$ tQnfM9M$ V_AddressModexV Addressing mode (Wrap, Mirror, Clamp, Border, MirrorOnce)89QbJF}~b{t9QbJF}~b{Border colorBorder color -n,Njlpg8TKAIzc(tTKAIzc(MaxAnisotropy2Maximum anisotropy level8 b/IG t b/IG MipMapLODBias"Mip map LOD Bias8xЎeJf6KtЎeJf6KMaxMipLevel*Maximum mipmap level8XhdzCqIjAthdzCqIjA$EnableCompressionEnable the DirectX texture compression to save memory and increase speed (details of the texture might be decreased) 88oC~Oܝ3 toC~Oܝ3  GenerateMipMapsPGenerate mip-maps to increase the speed 84W}@O{$(XFҦV"9QbJF}~b{-n,Njlpg????GqiFE0IN 5%Kլy|L QNIM5G&QnfM9M$  WrapQ])JNЈhdzCqIjA  b/IG ЎeJf6KoC~Oܝ3 (XFҦV>g'JNjn*pF(BPAb@t@?Muf2BޠQTLinear5 B%OKAnisotropicA ?gŘrAnisotropicTKAIzc( T?cCx%K WrapL{0nBg)`! \*Color textureP)\Fvq3, 1frHsOP5t 1frHsOP5ColorSamplerrColorSampler : RtSampler2D - The two dimensional sampler (TpFޚ@'X/ .PR3HBPtPR3HBP&TextureCoordinatesvTextureCoordinates : RtFloat3 - The three component vector F 1+5?N>/X/X/z(J.ĎTz(J.Ď ColorlColor : RtFloat4 - The four component vector or color F 1+5?N>/04W}@O{$(XFҦV"z(J.Ď(XFҦV>g'JNjn*pFC^Cb@@P@?P)\Fvq3wk0.DX?_К~k,J6 PR3HBP 1frHsOP5܂dKu=6TextureShader7.;]kI 忞@"R0tH94W}@O{$9L QNIM5G& %%u5E b-1OSM n#<5OD.GWf5e(XFҦVLE2Data, 1#L QNIM5G&eSBgc>n C:\Development\Caligari\cvs\tS7\Runtime\Common\Scripts\D3D\DefaultMap.dds9K^掅jmx}l[םMw,j;f-`LiSOْe˲iӦiQhQDѢDĉ5n8ZQ± cmz@+T[l3;8,;KK9W<0>8E^wgGlXe2rHOJWA?+{oՑJK i <3_R_NM;|oO}?y '>)p?9̏ή&3?%LOM;d'gWa[dv;|O299yD&VoJ q)7B؈r85%y1*}<0::08Rpz5k8V+qVX9rlxexf RzK}8 8,aa!)+{vh;w8lÑgM}ލc} h1!Cw@{f8yf `@fT|@C*(=EK[{u*vG66 ; pІuza(1sC x6 wylGSW=Xcvcq_b#8v|nՌͥ?~'ށO˔#oW@$-kwo%DyP9Pq8 6hJ!Lڽߌ:࿍hp܍|1 u³{m߫^C/Q42\pý1P^6P5lU=}磭94EmH3~)\b ~/$D" `?"~{zlv҅k΅áQDy1oF撝96*8\9i܌wącɟT>|*~䙁f.#`Tswwr\em"ΤM[\>]Ty?B k,c؇*>6EzׂpO//`y| ;$^pG]?۴Ăk?>~=(@@] |1o/5-T1Pyϸ;#eݻ ~WrRa__y6x]4{1ghp;Gb( EG`}8ox U;E>7* 'yQS1p?tzXض?tXLK-g"ݣ1%7{ XgC];gxsc{՝'tO ;7Y,po8ϛyný6y}>P r'Ν 3@}k<{C\ӭ1Pu@=_I-1W,2_k {Eӿ忙11@'%@ccQ0Y[M_7K_F_ 8NងY%?ǿb?w^OOw|뽂 ^kz:G',\Icٯ?{ޭ ޴\mȥĿOxko(Z&0e_wꁻu:|K/O_ee/?Ϻmz?["oY/Ϳ,KQyl{6gߞ:JWR@=x'8s&6yodq:s佫q\?*܏X!yo (·z=eY"f~u}OPpc hshx  V*+|dk8fW }|z/Ϲt"ϼQeqWWR:a;ꄪ BMuA_wdyY7 !oeڲSӏ| 1?|lx +?=|zL%f׆(-}_(X 7<GUnxp_Ma^8BXDp|*>\z8`{Y_Z >^#,4p},"x_IItDyOJ\sZ/[ X;;e׼wiU 4/߻ĿUSUFb`ee#;ޗ KWF>ۑpߌBtO$P1R@-F>G/?J/[t{?}GKxu{@t/y=m30*t>\DOWu9ϡ@^'  {bd?YS3/-owsz ǿ0Jp972oq'3{v -zFWBv8}(Y+ ctO=pWPz@R:K 8ps=n/ot 9s}Y r)1e/ה6g߇Ye9Ż})o)RzYIWf&([] DOlɑO;:ymuЈ ?RR˭ZދxXϓI%ҹ헫AN}rkv^kk.[pS7ɞ-g ց-+ة?A"&_9jS ת~vγbT!X?X7_q&ׁ, (f'd^˶2h&h;(8 q7oۤ{́LyY\=: J;<ߗ7@<-x_T1@w=Gdw>m{,Ch( F߷*|bvoW [>l[O1 ''491cs@(*?=IKόOhG(ѕ,/[<NfŀnU7#-/ ҟ3eq@3ׂȒt'1#M D?ݣ\{S8{0GuK 1L*0@r.x_'8ə=y}f]s =n@+܈aPyw\EgӽFb9,`8yFsVtWqj [ޣ Q=1:rb*Qp[罺qp U {NE>ݏo^}w~"WſrgdQg:cޜr#Hѵ9%ʿQǁϧVy<; <ǒ:wXo~:G8no-HxgDF' iX8a g*Vynn>3Єrw7^K VE5֚e| ϟ ~WΟL`{_빩B:^|E\W/ajK^[l._ޚޚyԷ1W}by{Pν:$D3!LH7< dRmG \` }O c?(Kk,n'ڽPbu8XZ" :0?f18ipܛ(WwkfMprY\c >9/붶2^ gk3&3m{ù\lW~/8U/ЯOE?3` 0 K poo?\8ym ]3}?A_; /(]tǒ߁t=T <}$ZTi+J<:~~//Q~880H~8]Dp&t}+ `ΑdgWN_$ȇ E.Kt{xߥp}q1z oIJۅ|qJ8yxC}prJ=_+7b@K%q-{>puΡ >.s'8\>Cfϣ1@ %{#O}?o?ԡ??ľ'_Hkϧ`o/X5=ýOϱWF7 #>+&eo|uGٖ9mz&5'<kAk~RI/ƴOwݟ| `uOL-43{k׌>&pL1㣯NH厩n=خ=4㵕'uVLMtyz(IK8>ڊեRVbڊȹ0+{A< wGU|8Xm(K@ qO(;kߢwJ! : t?S홳ۻ'u=컃'&{3?:Xh6G k1=ƁES3ywwvj(qߜX!:nY*PV"L{ wNudxd/Gvc >*X$= k.]C vvU C ۋsd9rz/``7ƀ"z)FVpu:5}ε$kQw?s>yPL6ཫYo> '3w8$}wWO}C? vE~(v< ($#z~tXxw ?r!"]W!WF$;)DR .B  Pe8E]K̳.Ālwyݛ'ٟ.~۹EgKJM͸f፠.pM}L}Es/+$2! 1t]<>3 V> ]hO ɕ{z]o&p}ia$596=>nO`4kYB{W =7bttt3f?s{38?±Fi6= ک^O(@=y1ݡa?iMw½kp=֎kfs;A9(O7Eowq*Phrb2+QaƂ~ⵉpqcU+~継ޥ7#w/ā=3cQG lhQ[>3;?ݧ%v8f >W8ovzG=Pr?GWXx߈2 Joӹ#!x߄܎Y $up3+}- BǾJt=?2ցOVgA T@~cT;D8Mw#ZAt@=PwwN,l@ 8lF6mxdz*ޯFT_xw7|.R o=l{ov;X$;[6 ? xOm ׸ .T#Mk(qxwy5mA[mE#W48]ScDB$ 9k\G:x4r BJS?Ξ=6I'9;#vxn+Wx[DPq3XM> znqo,+e xxz)U3~>̞K=Q^K' |qOPl_w/&H^}w\ygnl3bʿo 6`kuƶwXZ_a`M5.zw?~ 1ݣrZ_ϴ,ؿ]Vպ59R_oxto׽ 1pO~wvrIUEo׬Y_A;RBܼZJ / {6We[ uJi?{?k|)lD!x8HO̞%"(  xϫv98wPc0G+ _Gn~=Q?s+?tn<՟=xO&c_˪ eg&~+3K[<v |>`?p_`+iϿ3=#aC3@YxB{ob1dD3r}r@;3ynyhM^S~ml-漞gk紷m{dӬA]U} mKO!(rIZ8b1$3zθghkYΛ{.#? ;':޿+>X3h}gϿ>׿?K| 9z@g̋G/>p|gBswgs~1xiWo/6` ڿw{=9MQ:$:'i: s\8p. F^p#=lzwx o>O^ߢzOz>1>oH P/F_?^cZU;IOI'?_r^鞠 >X!^เqy(ߎO9]Y(K5;ym濌1Q1{ƀ+9&/ 5ʿ$|:XlYD@:Z=&?[0ٱu.=>x<q ݫ~W` q.KuGd<"s .x{eS/{l-/sBs9]k\FHp]}t#PHc ڊGG"ODT*.6^7`O$<xqS$] YЮνwv 5*wסL9UbGl][nҹΝ*k6eo+;|L9M.ps|b1_OVRҝs asܖض+\7˹_l7p|#Dw8.,mg9X m܆z~3g/#]WaO5uO(^M㞗 R_RrU1E=l.^1˶?yrW,z{t;h{ʸNù|wB<@> rx3±(o/&jF眽R5Blw&sK:x{]j$ -nR0oA^#稈x;<+f (z-sh;:I/gCF˿3ϼ_91C{.497VL_ֿv|XT-=^ONu<3-?y;u ѵwg<ݳ`Y/(f__K%cn͹|Pu9ýΧ{Bts |9&kcc |`<#bQyוw oW+uD989sl;gĩ]WqU#}\uoZ fߜ̔gد!NԁGⱻkK#>E_փv_'O>n&g~lOe:;b[x526z5r'Ze)]4#rG~E'gOIOB D7ĩ3m0,ȱm@(:Vh|E'xk&Uo?5mo=:l_Wѵg{bAw#zWyhNmg?$ס|DW ?R^ۧ^!2/?sA<;Jx/t#.- Vq! i+"9WoiN$@]HJ]/)=[j[86{缪 RIv7( ڿ=OLĿ89hϱD¹u MəSN{Mp/eܷb@͹fǣY7x?柅( JG^P1}߃ct .w$v}]`[E5K":RztoϽڹ\QG7P73X_1?fsڿm.Fǧosy>R'&&?=؎rXmyռ_DQ $Yj:{elg9rY7~u"kXyHro, (9-6y}e::#W_ϯ`s+Tk-s1HLlA[0\˼P~>}>y?~ߕL$"socɏO5~vUyrUxE)LNNA3wwl򾦞**v1s?$w&]~|;ʏV&CvLOM4ۿĖ_wʽW??W=˺8\H<8?9*5:eG)K9Mt_o}&`[rFFN^V W;7EYn8vCr[D\Ӌ\yMYgV?J^Sq?r_@}G_9н^_(A>^?znou ey{Yߎ:Qxyppz{99߬+|eÿGt+Y!ӵcQĵb]g_߀%{39{^C_{m sCXRϳz:mZjKW=8?Z$^{9fQT 8sMKtڿ>ODZZ{@λݫ[g{L;}N:<2'yܳg'K k ?%y eF/BuٮĜ8YOʾ S}c:9S;BSߝYF3y^sݛJۀwي`hey59urcvR4ryŊ\QnGRqgu#^?V^#낅H8Bu;ڹ/vP̼Pznnd15ߞ;Qh;rykqwvy??dq=Yߧ%z $f oc ;ϵ?k||L_>s )%P~ |J?V]_5$s^3/ߦ7s}ZsSv{zKrA^G8;3Ei)XxwJ.χY޻k}x:_R;ޛ8ߍRvǙ%BA*?{?ǿ:DO8).?'o*A_sPR\U_K}?u\تc>|.~D9\ >/A n[w߯;<9x,N z,CVu8k\9~Ǟ:>1Kj<n27>sNaa_/κu=/NLNDFGG#(Weq4aj<}TqvELf>L;:6κ ?7I7ʇ&ߚ^V6n,3M(w`[52n%Tk꘠M[ [_- ym AsT֕"ܞzkj OG6u`+ v:fl zp{@/կ 1}1v es}Mˌ^EqN7 {A`QKk0㼇 ?={^_+Ռ ?5ʿb)/j eiG3Ab`h=;&Ow)%}svlJHgNkȋ[`/ܷ0v2Y5jW1 t?KR}RR1`8>/8>_@DlV1HKpޛcXxYпrO}3?wa8(A9O 8Ok:k.8fJ|ʼW)` 41}+vλcuR E}ƀ7T?m9g;?I˩`vz~@Pt+I ;Ž`^|)m3}{D~69>l{@Ƌs=/uuϥsNAz@Ec1㓂=>[r^#fz5ĄlkυF7  .+1K/|iN#kN=-Bw%^Rc6[z}hc{},޸7cc☮qcY_=vb|{ۼ="8:dfkS6{Ą?{u5}`)?cziäJw,˜kƒbE%>7w~?ώK)u;5dz=(acWʹlR)#JǞ_P3WFkAˣ݊$h.dH<&z~sSo?cYzO(_Lc/1:ARҥD|> 1mB8H};RGSG_.`{:|8򬓨y:QW6|Kw@0`"auWљ1?ܣ|.EljDJ)>O s }pP?R~hf8#3ho%u2K~y H#qAmPpJ;1Ozr[8 Oێs^ۉx(//$z#7M?mK#c8Ŷ$^±yP2dup.}7 Q)v{>,ҙPQ/{;WȮm1- _yߝvs'bB)(% jbBI7)`- 1 k=n bx>k?AMH<1@`nض= gA @4{s|fCA>qx}7\S6sw/;*љcĀ^y?˶wûc?ܳڽKu }% "S+qΪMϺ/8@{g?+ <g 4uk.88 zg.=sqޱrAWo)PjFy?sgv ;ɶv:uҜzG 8?DSSS+=^5e\k\o jH)c@b- OnƫR݃C2ѡF2A,HX[|u[TK>_얹=9GFҝoòVꖨ֣EX$g-M/0cw%?6g< C}gv%b@ӿRiqDž<*P-{A1}:Ȝ{:$ĀkĮAhyO1rp5*,c;J{BӿRmNݞb;,`[GByX/_sY3O^NK{YqW׻r @5}MJw5瘰lQ׆E7ly4xOW+5q?wWXq_m{W3[@m_~#c_R!wD@*/}V"b;kͱy HsFuokJ]<{fIn,`N?ݳ/+{8 \-|,Ẋ#s<9_E\C]pONXv;W]/c@忥K3U?SqF,4V΃C+Կ~W:U\{΁N&?rJZ{u9'/?bc81r5ꠕ3=rKϱ@z[[p.D{qņE¢̓hh-%}Qڽ`gy1ҩWuu@'3^30fkʽ3/xU|80?z~_^\s:g*W NϔpcYk[;7ʜ;[-M1_uj\>x Μ:HS@?6L~ <D9'2}I'jnZ9_~Qϣef뜷rMX!Bә0B2utˌFGǪG~ձ+yŁ KRc6Y(迈x߈g5*;X1P[5?׽NxLcεB}_ZỦڿlMKCf{O( kyѾ 9-baݿ׿_1&R9muߒ5}~Gp^1ݫh8#q:~Vp%j; p/A=?m?lĿCrܗ>gN %Kj?:[_ǀR<1pa,p&I8?"Zs \.r-B~~mU?WN}wfxv܁k=\2# &aMsf3 ލ?*;arrkߟuىl:6^:&!d4in<[McJ{o|bONnuxx |j7hs@[q1##/q|e;їGa1`~+tm *cFG^-a{mCx6G~opyι(˕{=?I韈sb>Aݏgm*^c@}opzD{J(VÌ{u,L{8hUc[9I\ʿ9_3rAp'޴992(Ɠc23{~S .g'hAYrne33zZEׄf'7axtJ7_[S':a299١@7Q})58Ts \T d`8r(՘nfa9CJhñ X3c>P|,xp9yn#+:Yr+。NWٮpݣJC?o_QKѦApk6D 7#'Y?ze/ʝt|UŀWvQ忍~4xG^c lF=@ >f h/RF^Ns"7:Cplo,?ܯGAi3&牿ľ=^Qn{Р.؊kGu#pWl9} ʻfw5;{1Nc=x?2?u%^ChR[E Ilr }o&zZj(lwUm~7ߩƜe#/D Q>xc=[m v\ǀ1[1ي ybi/ݏ.NT ࿢t%Y21s239}oMs,|+ʿwlW||s&_s5tTyވEnϦ&\=eB]WlNH" qC{< qWԼFcr\=Q^Eϩs:_yqD3tPFo- xUpcU^p _}>D[gךmث($@~yuo]?Ĺ.rNcpZ쪚SLv/H8'\{ϵ޿_B_)xe_ZXvY-=sʹV./?# U._a'OB0.H4* j ayۑ+Wj}μa~.J^ϕ̿v;0x1Rl\zS@7;9YS835x_[=n޳< kR}lwNڿ/&o(3odm7ro ʿ hmc84zGkY?`Ϋڿ׀5s"hKH1 EψE+dڽk-8t?Zg~pfK7,/_ {lCEnڀ_->?BX˿_ru J;?#XW˿R4X?ߛwP65_Η}mqW@}/K"၅رgQk^2K/WUK9 m7=}(c\?jٙ8v]EzBiUo!y/PN)"! sbpΓplR5rGt οb\Wn ԇ(ϵ,E!P4=3Y"FFd?.Xw>W̡;3nJ=}E9b]x~|Dvޭ~kX?3Т\ӿ_o5&'b jC@Ye4-.))T$Xq%@`h&DY”YŘ93  EډۉY$ssy{_Z~9ylZ=pvNeZ/{8q_cOhҼj!_~4[<=I Ͽx JZJ{Kw'?gZ@ c2-g]1ɟZS~.܇p'{+j0?#_"sG%cT쇗.-5 @I|ß,ɞ= `DoÓ3Py%{ĿX}~|lXGr@1 }nA{附d2w|$5_;rŗϺϖ^rX~? )@yn.rǟ_d/zOu /c j>H%z˶1#w<=_t_0w;/vbI+k-9?+1P E3kW췴1F ;yNr>w &O`McM/|bHڠXC _DjgOFgGY~+33f i9(Fg d}2Y؛PPPk 6#YV)kݬw(GV {oqq ߰1`{cLwB>}A[W9 ;ɟϖmeϥ9@eXrwzlKgO}{zʽ㯍Q/17޹T)U?0|;?³(Gi+#%ޅ=soI~Bu6dv1Bx /??}E-5Kv(mǖRc^襽8pkOpυ<'y@j_3/9 p*V[߭9+5 9D7QRܟf{ +k#{ xE3C~=`[ǀ"yse {?s@  oʿ`O٫s?2!?v_;Hw;^'F7Y{# [~&U21@o8^^+7&5/^Z6{狇("|WEfQk?Wuڍǿ1u?fC@1F>~g_n:,N_9vfL\`Ezv#y$\+SO5Ps?/OM?WE7>{e6͹Q?%ȱd2c$} {h%T.o|cC~D@ߧJzW"&q^w {/#!ދYszEs`O}|y9>ǿ@+]cLvWG`oMb7"z?E?3w_46u+þ?=>5"Y'~&u ah /߭*(qG_N^s>^{|H?{aܓᏯdhیC6[&OcϸWgn]uƿ}v`A)<~#>p?F!]ARNµimkWٓ /ƿĿb놿g:'wʗi3Gs?_۰-do,}`&{f3 .-՜?w6H&EkW{S:;j ~yU1!>btσP. m~yP[~1{( n}tUW_ڈ|q9GmވF-g3z\K8I{= N 0ߘ몳ӎǬx\Hڱ֠-1γqB-`]-ǻ:Wuށ;{`=aO{vl 6dݢ!B$)_:3A0w꟬sA2DSϞw[^//xVfmhz {m*>@t6b/.t`O)pgdO}"Źc؛.9~?{r>ioH{w` H(vhw; ͻ2__(g?RɟkO9>|=3Js;>=s9Of=-α [uQ ྡBޯ  xWM﫧M7ku@~ 1>;??'{ß}`߄Mi 9d/^3:K~#G׀"6qʾ _Qrv<+Gd{gn]dO?'{5s"/vDdpQ=mX_o#[bp~P3|6ݭEڋM܇Q; q^˿_,5@_7k —b<@ {hp%4ys*:|Dz*aL}pŽlo_acFKɞ72ͰUE#6O9cΎӓi~'0f z\Zɲk~a\p:[s>P_[s,H`,hӂyQ}v1F -jlaWmr]9|2 ~z ]/0uHuף{gCUѱjѧ^b=C;0^ّΦ'ߘOubzv Mբ&&'G_o}uerj%{&27?c~~d?e>.ewN΋`^=RfvC m])7nGx̙-欿 tAt6[F~ωkT _7ծ6ͽ=0l6ւ|-daf|Ͼ}t+tj`Gvz=3g2O&Z_caub`O|eї_/ ܥ?:ө'.k]TY=Ԕð?|aŋ , X-녆(UٳywX>33sRI"?858߇I4*}#3ԐgWH=]E:DɞgA-:d}5r&'&A{<\@>QpgM(w/G_)@5>O5 U6]EP]5ػzeL`Er=er[?LmQ{Zxo>Pc,b=66#VjʵPM}{N.mQ""ZfؒLMg25ү]M c-NgLoKaľVPDx[ b3of]ëZ/OE9%%u5E b>g'JNjn*pFC\Bb@X@?5OD.GWf54W}@O{(XFҦV>g'JNjn*pFBDCb@@\@?-1OSM n 럆L<_ї, .;]kI 忞@/|V FK|HShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷 Lp1M@o=p}E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFC~__um1CR¬5ٻzEuSSaI7֏bR4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 1y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4p1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3 qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatHRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4%%u5E b>g'JNjn*pFCC`@0@?)5FYPٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x44W}@O{(XFҦV>g'JNjn*pFCC`@0@?x*yI?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3#h"mO('%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3-1OSM n 럆L<_ї, piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloat"YMڿ$ZߦqShaderColorr5OD.GWf5P<PsC/-~CxrEpr0t4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFDB`@P@?5OD.GWf54W}@O{C/-~CxrE(XFҦV>g'JNjn*pFDB`@P@?-1OSM n 럆L<_ї, L{0nBg)`! "Color texture, 1P)\Fvq3 1frHsOP5t 1frHsOP5ColorSamplerrColorSampler : RtSampler2D - The two dimensional sampler (TpFޚ@'pPR3HBPtPR3HBP&TextureCoordinatesvTextureCoordinates : RtFloat3 - The three component vector F 1+5?N>/z(J.ĎTz(J.Ď ColorlColor : RtFloat4 - The four component vector or color F 1+5?N>/Ps4W}@O{%%%u5E b-1OSM n#(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFCB`@T@?z(J.Ď4W}@O{(XFҦV>g'JNjn*pFCB`@T@?P)\Fvq3wk0.DX?_К~k,J6 PR3HBP 1frHsOP5-1OSM n 럆L<_ї, nE<InputBitmap L QNIM5G&pHhh5%Kլy|PHQ])JNЈpGqiFE0IN phA ?gŘrph5 B%OKphhMuf2BޠQTphH T?cCx%Kph(QnfM9M$ ph9QbJF}~b{ph蝿TKAIzc(phȞ b/IG phЎeJf6KphhdzCqIjAphhoC~Oܝ3 phH4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 1L QNIM5G&5%Kլy|GqiFE0IN DIFFUSEMAP9QbJF}~b{-n,Njlpg????Q])JNЈQnfM9M$  Wrap%%u5E b>g'JNjn*pFB`Bb@u@? b/IG hdzCqIjA ЎeJf6K4W}@O{oC~Oܝ3 (XFҦV>g'JNjn*pFB`Bb@u@?5 B%OKAnisotropicMuf2BޠQTAnisotropicA ?gŘrAnisotropicTKAIzc( T?cCx%K Wrap-1OSM n 럆L<_ї, ܂dKu=ĴTextureAlpha.;]kI 忞@"!3P4W}@O{$(XFҦV"S^M~b  L QNIM5G&L QNIM5G&eSBgc @@C:\Documents and Settings\Clinton\My Documents\My Pictures\white.bmp9K^掅'@x1 g ò(XFҦV>g'JNjn*pFB4Bb@@\@A?S^M~b nEInputBitmapL QNIM5G&p5%Kլy|P8JQ])JNЈpGqiFE0IN pA ?gŘrp05 B%OKpMuf2BޠQTp T?cCx%Kp QnfM9M$ p 9QbJF}~b{p TKAIzc(pp  b/IG pP ЎeJf6Kp0hdzCqIjApoC~Oܝ3 p4W}@O{$(XFҦV"9QbJF}~b{-n,Njlpg????GqiFE0IN 5%Kլy|L QNIM5G&QnfM9M$  WrapQ])JNЈhdzCqIjA  b/IG ЎeJf6K(XFҦV>g'JNjn*pFB Bb@t@?oC~Oܝ3 Muf2BޠQTLinear5 B%OKAnisotropicA ?gŘrAnisotropicTKAIzc( T?cCx%K WrapWG.3;WShaderAlphaS^M~b P ;MF~Bp!4W}@O{$(XFҦV"(XFҦV>g'JNjn*pF$DlBb@@T@?S^M~b ;MF~B/|V FK|&ShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷)p1M@o=K}E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFC~__um1CR¬5ٻzEuSSaI7֏by"WMB])5FYPx*yI#h"mO('34W}@O{$(XFҦV"B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x4SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3(XFҦV>g'JNjn*pFC Bb@t@?x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatL{0nBg)`! dH"Tex2D_ProjectionP)\Fvq38Jr BKHOj "Ѱtr BKHOj "ѰSampler2DlSampler2D : RtSampler2D - The two dimensional sampler (TpFޚ@'NKsp;H~, tsp;H~, vTexCoord3fvTexCoord3 : RtFloat3 - The three component vector F 1+5?N>/NPM n2B5INYt n2B5INYsProjectionhsProjection : RtFloat - Scalar floating point value F 1+5?N>/NNFks J|TFks J|vTextureColor4~vTextureColor4 : RtFloat4 - The four component vector or color F 1+5?N>/ P4W}@O{$(XFҦV"sp;H~, (XFҦV>g'JNjn*pFDJCb@@T@?P)\Fvq3wk0.DX?_OJ]8<ar BKHOj "Ѱ n2B5INYFks J|܂dKu=|W NormalMapShaderpX.;]kI 忞@"nhHY4W}@O{$HZL QNIM5G&NormalMapx%%u5E b%%u5E bLE2Data$LE2 Data for node >g'JNjn*p-1OSM n"0],S@vTVg(XFҦVLE2Data, 1"L QNIM5G&eSBgc C:\Development\Caligari\cvs\tS7\Runtime\Common\Scripts\D3D\DefaultNormalMap.dds9K^掅?xDwx[ו/ JKItKʻWg2'U؛#[vbYvlK;;%N)ɪrM2/_$Soƶ "s[н4~~+D [H,]1 w*?VD]rѝ"ZQXDY U"Z@Js$Tl%z+PjMw^`kGq惝#.򃼣0rF;z|`i_s闪Mo؊LuXQ2" q2aCb*l3i8~3QeF$!P?SB"Ukư߆yz+P$\a&OZ 2i3hIqVS`H" {{~v,`;%Av Ή˕HU"~c4b>aK<|.q*QU GiiC~ dY#([ *`3N{ Ga.fo T EY(% +,Y+qZ{b% syb`׀Pi˗eU ڑA9ӵ3gΕNm!gz{ĵHF;7'=UuGỲr^]Io֓K'Zϖyӹ np_k~qbIo]>=醈K8Ơ=t͂-OD,faђ>Rm2JPjE 41ΥFΝ]JgCm鷩MJeWIOcp=c`荔Um靬S%ZƑe]VDK X/!ܙ:66uԖ{*\XVxq.=K;$Wf{ؙ[K94RLCԑi9E6ѓɸVѡ6mj EikgA,W8":[io(M[m=Vk9Z}ughu6%vGm7zstVCp.z^Zg T/=J֤w[cL HZPg޲_=xƠSm]ڞ-;#[iyޝiV%O.\t`&sVH'ٶCoI8 Ԩ_c.zq;w3v!to,YQ~_bV]ZcХNQ?\Z= []Z+0sj- (ڳ{yu]C8v֡ڞ#{ ll];\Zx x}+V$Ӗ徳O||wwd[Xxf:֥ .VҦ5ZkȩJRyLdCVڕ%ٳZ$ܟf]\B/9Ҥd˭J=שՆmZ]p941.zyLku34{#Gӏ$Khf{pvdavjKݳyW%[i5GZ/`Qx2Wb]s1W==kmɏnn>[ wn~>=B!~ro|aRʎYp}m?Ol]ND ~΢S)=XNW}wҫb^V@.1U!Ooy138>:60CZ=5 96Z05Kx68^v?s.N7#_osVܦO8x0 3 Q[Kj|oz3R뿘n \j3؜LfPsjpQm&պ ~l}?f-J3N$?Cxɚ㧬*١pW^Fh0J hG[L!ox!xtPg[Σ-4 Yn|>m3sm,U߳~86%A!# W d8I!㔌>T ".2nx*A>|Gן}tB%6gNKeZdޥE )[&0Yb`$tu/eIuY.e C1R)'F%X9zoP Ƀ:o-וvޅ-9oݜ\@q- $X@`{:`,B`m'`? 5a@G%;?[^KN'# L`Ɠ%U)agLrwۙA O`_ c[?"y: S A`Sȝ U[ ߀e)534]_fdgrX~ nGq.e S<n8 `sFDB(ֆIq׀/&K%2dW6O>0]*By"^Ѕ1KLd@acca X V_}T+őyM?{W=:4E_h´CSiq<¼6r`sCLAv/2 }p~!C%DKVO1AZ;ԟUU++˝H3I8Pl w;p31">!\1>9txf^kTrC tm5GBG<0ԽKx7`>[wP2"`g  WF;3Rʋ8?u)8U0'0g.oU]=`) כ:[/Nn ^)a 'Jxa9etslҠJ17/Fl;ڻmJt% YT[;5avsFϗ=?2h<ؓp[;^`Ǽ&"[6ev*_*%6aשiJy&*z +O@bcIl X @e,puP;arkIx j*^x/G(i ̡K.Yo3hutp8*`^Tq6x/#pɬ%ʌ{dJ >bLØŹ8GD7y0BBiflj֍Dނ ,8uaBM@~@& -I}.: <+b  @up@҄h[yNs 6$*DU. .=2P9{GqbHże*!]4؜ a)GSfKJܟü0\DYJ#jśAދq bz C,?,r8ͻRCD,# n |(}j@m|[96E/OY2t2] ++{{2?p C] 9 pEm1/FK8Սef58/-ZkU ;r񸦇& "[G#pF_ͮү"0_yi)1mvS,p.eWA0 Eނs~k>;<oA\1*C*Î"ՏnJ@U6@TO)Dʭvwɭ~[`{Q*wbƊ Cl1{1d4 x~kLP&\=+ҁ*M*P?M۵]8n"͛ .a]p'anX\醚 R͇s cE|M @ PkZtvґl\bכ#Śߑ-9|t v8 +_?5 _zdӈB}# f;'$V5x Ћ*q|3׉#A,bdj4fo2T"8_J%67lƸQ!"%`[¾ɤ GAc>]~0RY#Yɪunp!CYtjʑ%Yrnu/~jK:Yc~ ip\`>0WA_^!?ӇV)1\df5TF"a֣2+Lz$5 K| WR_ԈŸ1" ) #:l[avWi]FZƒfE~jE>Q&pƘQ|'a b$wF}]Ti2}<~߶ʒ M8coh `SjabE>zw@A^vb _go Z=~),ݾ9˶JQ|ɣOGp˕ķT>t47>”x:'Q4΃e=ת v:T6^^S sy D)q2˥JQs`bK/wsSYnfX$F@bB0 Xa|732`dfPf7J[ ?6߯VZU~v!0ñ]w'}016pMH.;>5H!1זmw_J].G.Z1X ?l ]?yb`%AI Gj<̓%SA($Q!~!cM65\GBUH58 =Y_.qrJ^6O!#!C:~pL P30/Ρb'ggnp] W-6!3nUZ&0 `qޯ)O P&qo* tч@(wa`} ̇q^Y"Ҿr-˩Ě=(RK-: wx_ 4[{+}x }~sp|Vnٴ,쯂Z؉h VDU68kgm{1 ` { >8ێPjTd0prpR/ȗ)~F204ѩIm.,h,-_q =:q/!c؇w\V2=A2z1J@3 A @ |\.hH%YroN-9'V (Ԍ[1C?щR q|O"$[ 5o02 ~t?2bPn?d jNrV7 e W}ߦKu}́i)xޗ,"b6ĵ>AhKsF(FjmZJ38]X"#:Ubƥ*c`AG#ZFRW&M/~)e5Oj-<"ZH/n#Pw[H] R[9{.vfB Qa8p G}`C?>{?^h?hȀ A?Ak$V_89RM~(䣥H$$cxWڱn6=D` r|^া6e&:j_C?J(r6w"Q|=1H2u#J?pj/6/5-x醘=tq|,#9`@DWߏ/DFNj0ҙhg>ͫG5j%k:<7?͕8nq 9! U8ǏyB1dǝ(2> (ry9j.FOْ\NSU+Eit|{ ڏXqMG̗x qTcH hts2nZY ٕSv+;޶1ԗ 9`;^nt *q>ZRkǁ?7m C1y:?-2?CˑJ- ոE$mQ9wvMO^Ȍ1M~Am1b1TXA> c|yїZ( 8?82zֱOw^ ;_Nv/uq/A%B]ϋa.+ր|O'SyП3wJ )Dn4m=Nm zЂPWdz+CノK6$|S? ȉؘX} }ҵ^4<(sQ[˳.[:݉3Dpޖ&YfҪ.`|/$`8;Qme4.Bpٯ^y&U[hu/'.p7#61C7dcPǚdS5J-EJ|:N|=b?X o\ ;@~NgGOL9͞&_s^kFtfIwd:f / |sd}op.y}WD;?_gkdzuhL< EQ1dG4<6Ejp). E/9WȷTE F,F r`U19V @GE߁n#*t CC_{AMr-\TC݅SC?Nvd5 y9<`GDpQ< S | ϛs3H ZQ FDX@#ll]w2Dr-[~߼Q> [% x#ЋAQ 5)3wx ~·s)8xȴ~l_z٭vWjM\U칎k%uSRP|_G;'ٓe?7oP>Q/)s:Ō)W`|$|~o@[xo#5mǭ77|/co\y7>|B=jGo_~~d.Q =KC3O,,M&T:U =zu濽uΩ'/Ӏ४S{e5Ŏ*amSSãaL`ƕ >㙷F##KT,sc$w.H%a,{էz2G~+'>?[_1 G2_Y>:SokBy{KPo--t~ٛM"zTOg.r39erp>s{GC'G|v@&3geiMoִ^[*FÔ%;AU޼B;iRLľ4g7]ne˪OF*K:WbkÄsk9EU-']V΋`6KΚDC=eKw;QĺkKy2\{ܹsT+g}wg:GWy߽7\f/uoZ>W6LS~v&yov2Z鰪\Wf'r}(Oϟ+S~g>] 6?TޏԅC]MR:\o˝9j;c/UZu_!2 5`Ѷ}nYnߧ?s_K+эڴQԳQ?7;o̞Kܭ_6eύ/ݳ۠-3/2R*w>XII3EtD|m kNHZ4ѥT ףx])oa]ʬ}Wzpuf&Y|{O~ƟO˵ <_A״[, q)Wž̇sZZ_,&~>xPM:7ݗ#;g' 21T Wf&&j*L_꨾Q}Kkv>RҥC&etiSn|/௾zaחc6P]pǥR+w]ɓyӲK@9Kgf.YpԚeڕYTofa@f.QoKzWk;?ѧbsֳ4\VgՋ-{{%0c 4앎`K_)Ӵd:?sըs~_t&e:t)S!Of!Qդ ܘ~-Zp-ٺ8bé\ !Ҧ9U}̤er=%ƙg3Ӭ'}\aī\ 5Lzi:ѓ {ߣ.~n]zޚ{9ɭ̃?̳ՙ+Gyϣv{)FĹ2Nm/{>}?뿦\JlQY~+eiݢE@;3zY\`^{/c+Ӕg2]s_y@;.mz5KG!2 Š8}Bef0$,xAM jd=_(g0R [~qcfhx#{۰JE4P3nc*)m@|ɒEe^NePXf:252  .n`ːw0 6[=.m Asa=yǣ /7}]e/J]y{y9' -غR~')3#{֯ ov>oI>,fAjh [P'uh[Tɞ\(K^P{7#z@_ 8QND-e @?`s}-Ԇɯ?{-*թ{o'b_r#طnM( `0` ;6{ ~a=аl1kgA}dY DضpO2tb[\X2֛poJ-htȚgn#]dK~O>8v 4sw"e_< z:C"˷`z!<[/$@vzg!{ݹ2 2}y'L♧!=}xYnwiV/ձ[ t-[SnrKmܙ=Gm=zcܙi }}CO}3v5K-SibܙPu4ՙFf݉G·܈#!pk/\zp6_^OiJ]ؓ~ے ,>޳u'mw+M W+-^q/Q[mj} Gn1ȸ#mKۙ-J-V36,+/Ao8;L4 ˾S[ݣ#\bmhvr+ՙf֣Kt-`pChK1R.(Gm5zjϭ3j#\Jwk_4SX&oYzXrb,~w`kz+CCeGkt>x!׿}Cׯmxpi[l^T@5^ԊhK;$==nR>(:+#V8Ȃ_KCl6Tioݬav P6}}[|X@s=UJӐK \qĪAmg]nYp*4y7bc+]^v'Bwgszڡ`+\a\ev7~o/϶ s{nbeWbSw/c .^z9eܘUay&sPU++ulrir^^~vi-cLb}owdZ;o6w'kVھTRo =Tw_h %˭}޾So'F'+֕z5]Q oE]z=TZviu3ϭ1V Öe͞%9 :7,E^VށUkpZ%r;e[ǃɪ?٤MسϼV9blUJgvW* qc6{ώ"%#~ϓ!PCSN?xw{K{{|W-윲S<ɞN+ ң}S6bFOuR pmBm=B|L]Қ9xOeg՝ˋ{&? g>}gVȷYsz'Gt xu W|C#7,xkkSu+ TwnN2MCҋћS݋w{R?{Vfv`%C_֙?ުL-Tz;uh1񤺷ܾ3_}"xL/5wOeCJxHM?<=ts{LCmSw@ ˚Q2D,K_Ԥ+ ۧϜVRUm`ZGJg ]V!PmQoem8#o'Sk)}Vt˵?;TIMΥX E«>zU-;phO.  DH$*x)-@=Rq)0\ip Aˡ[XKa7ˌ#U/=:CzQ"G2/!HFpH+ZïJ O˨ _2{"pzzrA!^ITTF1ol^;NvdEǂYxޑ.unI~!;3HA??b##A|A|Q_RG4{ #?=urfr٦:Q4!sѥ Nqi@(  [[ҥ]@'( ǃ{ *tndGgvmģ[~f]̱շs5D7%EpBD7coJa@ b_ #|C * >/C4ή,nS&WF?4aQAYCga³6E0q؈6æ;la 6aawa@F(DȠ(v"~ 6wC;97Oٗ=.eaX!.*5jʖ OtnbMw^S)T3ȥwIz)T"P!1Yk_@6D8oНdiz4h_zmKɻi|2{֩^CZS2I7IFH7)7y7yq ؖ 1 uyNQ~X o"-6MhttXC zwe {+8MO `/|6`{_Ɂ}eؚ 3-6FFwؠa? )0 KG4@UkkcN:.Xf䟰 ʦ qLqf}<}xΟ()|cwbA?<1? =a4Q;RGz'JHW*<9[:9Czt0Oŵ_=n?ٍ wїҫ旃G g^s㵨 ނ⼑w\Єrm`S6^\ =5'Ҧ3e!X??]`zG(131$.3F5uDC#*FEc],{x!<[sAJ@w6`[`F4)k 'H``"pZrCeI~o&]pU'qcITӉL?v]|| 2BhzX"c|q`nʁv$TYNO83oRU/F^SccP2 g}4B2((IYLbkd}EijHkgdfm Y0Ux˭*-dp7CA_MB !~c>FFy38#;üAxC: >W?++흺2vǽ3.wd R7O~:t,RSvkĿ\RG < 0]\Ns rp!0qm.à C0 4~p!t#x8'#vj1Ͷ,'e~wBL6=""Ȑ11~.!#[oi/\ANjc V $KyXCy_=+O{Gy]yA e=N۶$&Q,٢}`'%"U/JȤd=cw;J"QHU$%ٞ3>NR y;HDU{)M޻7R^#G-]j7a0x͊,쵄2s9ވB"⹒(|X#σ ^UH9Og2W%M,Dq/ŇS#c/>\׼+K]'VLj,XVjܣ ߴ2G .z$VjIi?3 xqt/d/`H;G L4<&E;Tc"qCKω _l=&A xYgЗuЋ`ڕJzY[?^{ C$ow9>G_llA΀ݛy#` #<87Nk= 409#ykrI C]1b:or: JDj &Rx | W5KlLOZ1*mtۯ4x k .d/M% UܟܟJ l0F?{ň?z:}~)h-*^a`8 q+q_ Bk2퇑2Wȇ3)AalSOHЦdV^;~o|$ :nK>[\~ XOu,)oI#:'KbNąn~zR5 pGyxxp&bMVl7jnvm3n#6a1jHIظR=X^HR,cv ^{>c<xzq@ѥLY"BUJH,![+/ 6F!'R`ry`dKzab.}s 6bSKXle'yoiO~uSOV[o"^S_h̟A݇/&P4b`Sx.Ԅ[+HD + WW /H,1RǷj#4 ׹vCYB1pVA߭ XdW#^( =sgp}tZ"oʍQ/rtvګʀǽSntk!յ`啵ar=6fџ+T(wt`lzdkEJ Ȁr\s*`_KU/ha ! '*]: gtJCI ! H`* ܟl& `=ܟ xOH\+t';Z/utZf|ؔUa=H+ Ge1\=)~Gi,Xn_f@.9J'}:!8} gb16 BєvCZQWܑ~9qy+Zv֠`o 'N>f)75 )$x W{`B^^d_q{5 ir7K@/xo'^ւⷤE+$>3w?!M}7~]Wh0 Ẏp\c2~z^< #ropdr=5C5<`쿉?ޕ5ek J9/#]о!B>2md" ( /$}(N̾ ד@8N0GE_ LKcVo{bZZ:N}T<䬀e<yܕu#]@/b)?*-˃˃ ;#]So!ֿUgW_I3;A{pY_m:C}[5@ ,6Ґ`|ywwzN^dSLio3vkfi6#=]3$gkpm&!?Ma]J 0.NSbȿSג ]nc3q)CˣhԐxxE_ײS'f G-?v&>5.<Ў|ql!RJ=:5x/#tŽvN ^/'j/>`WA2]1{5YONטj'W2.ςEWݞ(챾?u/iWGz.ĄQM:/}\NQj俆?̵X'nͽH?z"Sq_b&ݛWA){LS 1%;I@>[ -;ɷox^CDNjϧi|\(@T *ܟ /#XWu!YF'G,BZO75JK%]~WzxW!䕺4;^> >\n >OiZ&`)O,`CtH)Lw.lRd[9k݉%;e2]i|!o;6GYiw!7@ \ZQ:⼯&Lfկ4@L5BH9? >y`}䭽<v"@x/IfSvxLp3S ט=Uag$|зVp't|Ox2vgPV܈Ƚ?O K]˹\wなb`/4EY02[EʡN~;gB0P{!(qڏ14X )~f~F%DɎMt0)V+qMڌAL1A OeGST/y'G"%}놨G*FyTafd϶7s*n00ҥ˸V=$kh&X4dUwϧs#p|]$ WԢ|N~Kܿء3o=찋|vN~[}1o a; 7'О^NH;LuBjȧ|#{29i+EO-uˇ<:Csꜻo蠓2ŧ0C)D)>cQsXnjeb}kz.`Jg.8[';M5&V3jCߏ=O(Ԟ,HtA.uk⅘/"LdSvLj臚Wv 7{[r)djIFTގ9%Mo!_`\ Bk0 Aqc`+&sr-d/=FVŒhw Ussso/r9yqBN#{IyYx-k sSX6ʩs+biEc]^VMc)RYo[eTެoZEn^Q[YW[B6Ze}(17EoKonfC͜jos/#\:3VEb"j!s-;lneGΛK;1׹s16a49b-<7d/CF1aF޽#\}'sZ?7U#$-rxW O Q}zg=N9yX/[˕--Yek-}~=]60ϘkMYcSlK̳[bOkK7=l9OsKiނ4m(meM~(qo[cޒjTʉ7?ToP-**geoyU+M_8#g}NNrdxFpgf~oPז w>;{-i2VIjvهβx8bgm=\]`۪<>X[t׆Ij9z"%J8u{yɤ[n}sS{#r6%O ,i\W=Ί9YG663ڊc>;Kc+7b' J+ڋ/z;;%ڠO!s=o2gN8AZvQ Ԋ#@UҾݹ6{C쬮$}%׳׸b 1fN LUvtg70 ypS"]8szCP:zjr<-*A;Bv#vrVSAg TW]d>Z^{/h%|.P*.t?-Mx\Q&|]z2`nAsS 9k$z ":js<nago.NvD‡b4,*5>`Ι:K#p*'Bf96'Cƺ6`7%~0GN߭k-ot|khm!s~k^a`.]xj` 7d'XS>si<ׇo|$&E[yM-7>U Hlfb!Owb. Ƕcwo%wE`f .675XE%d-!{I=XYNM˼}6na&F> P|rÕ[B7_-;A˙]NLvr6f;䰵%5>k'.l[ÿqw?lltݛd>ڌʇr>;ec %l/A{AZ0r1=:4J{Tx?S[N?s{쨵:l7&e.UYBR>;bYE1hY7ӊr%; a{EƜbxtlv±Ve.\` ~1TPc\nCdgH~BRȤ[HV}I_a񌻎 3)ׄ$"uc0N$p/|v$L[pJ"Ix_ ŞIxsV# STZWžX4$ȣߋ5!h3ZWv#Zk#7yp![ݳH";O '38f0IZK5Xˏs${QdK3cN}wº}Gh/O2MLt.c?1Enw>y1; ?cNRYcoCuEHky(#g3ҴW(+ 3wwyIRg==Hv-m~mLJF@g8[/ω5"Ĵ\>ŽQ=Z s3o>0w)l+?VyDVwsܡ⇚/F5} i>ȓp 2oeh14nt@I-؛sF๤Fu{ɁcfL=Db ; &LD\blqqhϨO[u}8=5Sqapv!9;sZ8Z9%to&wq q:e]g?-Hwo*n|р2'i>\9~ɧc;ţrwm+֣_ȿ~)Ω_J;d?8k{+OvuWFetB|Z>j`ˁ '`OI!\9=alLI|:1hw^bܾ`H|UBi5Oam _Ae1oG9zرlx&Ͻ.$y< ʙ1s`}ntoOl#C{OjVNfO>T=yLбI՟ T?T?iwsm 6vF;0'0nW=b/vF;Hl& @WZ-ֽώۜ B}V8lIYvC^HPTϧpSmvoq2aRڬ3v+ugF=:joUg}>M51K&5{kֹ';Ag,wQN縗l8]9TN3;Ԭ}6_>1'6{Oz&ibaG^F߹l>#0H;ǙVXXh pS|rvsdfobf>"Qh/-zk͉_k7ٙRsH.AR_"#lט^ 866)^d`9./s[l.{^9Ҫl!@z#%uhk87 s"&a :o&N9lOw-5s5O%YjFa@~O0G -S&R_!:e/.o: %VM:Y5SFa:[`H!ui| B`4)Z{sRg_%dq@1W={tdO}QK"K!BYV\6Iy))tF^;9'p/rco>B9jiʏg= h9?wo07{TWS{kxƗL3rqvU XL^vRGPy,Hd s+h%ׂ5 dB,!m#qѱbs|񌜸$cHY)W&Q$MiRlӻ¥97`R ܍,myA֑GdУd_ ʱ/<|@.fwgYi]\%!ЛH*^S i]99{/B:ȴT%qGQcUx&:u}-rYrOzoGaކ$R^$Jȅ;? ;?Qqm*Ѻx#~_1Ro][onP=rCkL.$y' Tqd~S{(8uzwc~b*WvfL/o;#߽>#On_?Dw\:ԫ?h)B"<ٳmUo\Gc:)l-u%P<9Kvԁ,3RFa4I9t'Y\ߐ/A l'&{ "Zln5\8l- 爮BS{C[%ɿ}l<k^TĀʗjvcIRˍ Cm\fb>3< JȔ26Ts J U,R5G:>Q@,/عb) G,u\n<5oy 㴯r%srC^ۘ8(. Fly `z[H*b7WrЊo^#rb}*RÔTxƊogSR,EaI?_ WgfLQMO`bk]luA)O!"I,îV糒 ѭ3yi쿢B-y 4 Uٵ~u\2:$G{A /qkh.D{D4~(Q><3dGkVpU˞NRHtVSu ,{*$rSO6.[ C0hh?7 l-{HxteZVӋmVjs`] ֛`M+ϿawkTZx6OW]ra5 ZL:֡3SY~Q8E\ )myk()KesccƘ!(El%iؘ1W`\MJsr\|xmuL_(4=C{>0)~(F*ՃJ'Xr";fw/wFN d'~ϞFGU\T[3x? Fvc|Wޑ!{./v 1W\,YkU&]Z_G+m_Zr?*km ^A%Ax(ing IB*ZCf?={7^t%,v3h2[/#Wx1q(ksk2yyxy z_vF儃<ɩt7b_Whݶ X_ls-/:\Dk3AOz+B@]Z <̀+"ۉK߶ߎv˛bǕL|3kS--}=6xҗWT3k`^>_r]NDV4EHɨ x^Þ:rz\ /\䯶ZzK3u'rغxGyn/S|~M~.ErnS2"@А8ŐA>fD}曐%< #sP M8)Z'@/уܯ)|r V_Gx=IvK\ ?0ePv-#%~&KPqpI*{?qGROl!UK^+}v9b _U_봳 QTSǞv"布(O["Vc#5[a}eW8w* x-AA[-b9FuƍC~!,]/ʠ! Wn/Dm1/G~g(5L*%Yl3[DroyZϢqX q1^8WZF&J&fhB8@޷YTe35p5 kcGS ܌Tk)(4#ǯ 2˜ ]b?;J}Ǽ%L>  H.?C smS .v~Hk5*q&3~{qQ!bZٹjpUfG5~WKaIk3DIܵ[u}11 ey/rn4^dfƌ$' \ـ>Dʹ.;bmnp$9vέ3jGk]8} 7f. b U rPb?l12]tr?jǡoSǓN|}&Ks{S C.ܵbͣ-iGk%Q~DXzr.co]1>^[d1ևa0 kqߨ0N쩳 {O>O W'acIs=:lak$ҥF |?b\%KyQ:U ۸yew}q-Q9㸊Ͽ\/yLk1.G]JdQv^\91$K#K]?h&}1P2Z:I N!{boN g#dV|m ) PDk` =1Z#Zl {[yte3Dy_$6r%3i{ WǺ/o YBo5Z!uqHcxڴWsN,@>l8I0$ܵ3bK_x* M;ySSoiDoMh\O@!i`-^ ]q|F6N41r=VD=s?3GCooUi˖{+ Vݍ)!]{ڞN׾uތGTHB̬Ѿ@%~=IX_vW#% yb}uON{;G UZ3&=c;߿vtTN'^Eo2kSd-C~SGu= \ny4'b}6I0*9s**?$3 W RlM>ہ?L7}nVCԕ#5wD:u]'}1.G`έwkQcDB:,_0SN %dܝq8mqWƘ^sG{2@9Xbl`_qw i)2b'A_7ai-j1䁏Qa]Z]z /3 x s3TǟZgdJ ~`7B_o&A.ؗQ`ӀDq@< >$q ׊%k} ^h%\ޙ]zo_ TᗏJiHה+ 4~ I<g\?sW#D!zb:mSm1Va-`g,Q')vF:(sq=>0sWFq_p$w0/%[Vy,L !7[iqp7-OgG龮'2Cȑd dgiḦϼY/vVK+?wwUuzc KKji?( 7&`.t\B[gz<БUx>Bqb#3Sl0Lde1, r-5fbtE氟ZלJ96?)bseu+f{"jwsq0oX2T̿a࿍mtܕTjjR5i 9-Lp<ߑӽO`8?_p{&LK_ox3\tCoLxiԱ7) >0OrgjU?RӰK#S2 GY,`X44E(Aix(H4oܙH2` 0bO.`@MYN-.`uĂL[L Zw×]v[x"Pw 뮰h] cyFq/9뎷}2H"`BĀxft 4b~&n:I$nq +Rio ^<㚐Nmc^>ĒY#k= \pn4alϏڅl\|S;?QUoM05ŽR+[H>e.eRS/g dS3$u|L$m[xj"|;:ǩ[jf[:߸|Q3}IjFr{<Io$1wp%\ȋu,tю;l ga5ԅ.;[!#+M 9Pɽ0ZLIjoHc%Q%"fJDa2 9k$CNK3?ӯV# @1E8k_+ W+-"$lpAnIǔyka.^@0363p7btVN_ F_.,ƍ[+[܌yKf^{wAWoV*?a ڵ\f❷Gx\I]3Ŏkurb) li7  o)n?kr3Yf;~63n3sVb(kֺl &he,72`׭M_27sKƝQ4o;ooRWnT6RP l7XIfZL̿3o1nlI3z⚵vr򝿕;LƼLԬ&^3n-+)\OMҔ)LX5L'tmyv'_n7'|OWung~ݷWﮥ9_3J܊\6 떸 kKX5Jy{ۀ9^4UT+oK7bzLi/f6͕ro<.w ~G8Ӂ=vovz \Ί[k uDލR|cxS^(ѹ}}GĎRcw^xAʗ﷘ BAsm:aܑ;gSos6Xta=G3ګ#zHg%u6'*1mfYi7 m{ä0}-;jiwC}{s{#ouvq,m֊,MS<\3/i:%MF[[=7*u5';}:h'"p-yӇ=X]H?XKTl7{먮Gj+‘ݹM!cͩû\Ίt*FR)m7?q[- ulUފw; -`n !(%هu*= Doj]J2P}[?9_cYP.F*d3k5Ye!׾YnsJw_W~ks&h W(]z!U!dux~{g9 37報J񐽕 ŇM%X-A91mYN> Qr]YqOo,^yA{y' 7_Qfn1٠`^R77?' 5+@49Wmis^l}KMww6o_{~w)} XCxCx#7duA"}5f?hͱ^ԫΆ=DثP^ܟ@<Ġ[OmJ .z0PҭA&D'-ٛ=4dAl.bָI < זs:Х0Ak˸W+yAL{=G!5Go\#4ĝ'zQ{քSkKCKoZ VB^0^eWěl7wo$ Ʃ{^sg'o8Q9 >0O5彸Avxkg?|ci!o"si/ѣ^ڣ7sn%VN!n5эw Al0`S~oGg;FuuJ> dYC|{3נ2^ߣyr{dwM\SAw7c$`>waF:dr.þoԿ!Րo8{K6.Ϸ Dg[]G7ky}giTv-"m+$脳DR:+D.~|x;}ԕ?v[(ߠK9-(Em=8qB/]ou'jy?7Ih#b0ܸ];.}kW[A֥f .{ a.?`Q8v /{fa,~HyWd(VU=6u[vh~0VюkQgb30?C,;CIw$vOKsܥs ցEpM6R?z*}6nh́mZ YoIo->{`mrXpK5-Boͷ ژ{CAȵK5ж;?Xnњ}[o[Q_*lPz+Aj)tQ%eۛf}p-}B|&'Ks۳w:]҄V7&^2JlsGijJخs-3J3ݮ T;3JԞön)8OhWvG!mvV-jk⨶W|[ǚ]:=i٤Xqn]tx[HNew` MKz4~n4#_)ڈ |HIG&cWs1Й9cj)4'숈dn_|]>6gFh0B#Bx-!!!4G4HqT Z|x^V&@0vnE<85d$y Kc7'Tۋy`ްx\ܹHsMq]qqڵSkq,>h )x]V$^'}Fb50*BkoP8*GxGGS)u3niyA? ehSLg{P˧h|6ėGuG햀Gwy#yp[< lcp:!Or]}Zɩy/x(UQD ;*\_Gu~$;*i|1{{W^3H;"QJWN=X;ҙ'\fo8R6*uw!6c:s_#uuH׼5~. <| "AԏJ?`dv!Ej֤ڼpĮ +zH&mWr񅺬49VX* D̚2|-ì}ޜJg % 0/ʠQ}x-~[ڳ%G.[kGfd#b'_ _yDsRɽNQ;REjWbGQ, yX|~4<cޔ| :0?wHbOl(&؊ԓvlUрן mJrtFFg%l=&(*I]֞HZ{C#xT}A>JxF)mvߍ⺿"9V*{\p j7ޏ[{q=.{Y,Z=ӍI^Qe~}:FV9`6hg=&?\WcN*G }/nYB`,/> D[ x]1@dƜZbk9}aw`C=?='~v$t4Dyb4Fkx_BRC6ݯA,Q<3nϑs%:q=bsg7F#އk0 Я3 だpa %O؏^kOoYNu=ͮ ^x_ޘ?^}L/dC8뜏)3AA: W`{-,w.n &<JJ9_A1MRBƎ$qvD&oy@>s`c NR럱7D,aȁW(H%(t.ԲBI60)EG.[+c`?3CFUSuX k> i0cr0wßj'w<~ϕ#AS[%)2q.@,DUK-n)+zxy&pO_ qI e&P)G7˺G[oY ),?Q.y?KH16n{C1F._;+# 3|{/}<-Y %o`N8f+HLAl@%5}_!Fv@ϛUk?90x:[X)?0&FDqs`>d–H]%(sC@-O.sO6)&i U E}[Vğ~g^B%eitwse4x \!rb1`REyi5gſj! 1]fzϸC_S˪1 vP鄈Kq̘O9f ZPp=34Y*/Rn+ﱗ3MMyqҙțW!Url_{u/s@ px12o/`w6d 11m}y^Z& Vcc<;jsNnG" ~0س0N:3 wewS%v,:O$kq牎K8f`lbl[}Q:dKBA@G,wjw?IWq<_{b&c?`|&̾OJQ*u~ >/%Q90}AVy6' R:0.$&k!h*sV^ߦͽ(IYd@ς7Y^5Х \tT a${sa f: |}0!,䭘1d@aS n D#|‰Ltզ ]j-=/Wg710ƌV] sg$ *>XDs Z,8llbwGaw9U2b6v{᧶~-<U$e_Fݘ7:q1Y1̗WI)kd}Y3#1/ >/%;Lߐ%m˓-jץnq FO ]g1юX%˯״y#= ę3G({5YX0pxtT ~>gVyO3WkUiqC{a cu>k/`{y a]2o >v*[>(b̞ij {0BD_/*;m)q"q?%_ p?* vrtEkd)TJ> R0@RF?ğ8 PV?9E CS"Z%pQ1_H;ǩ{Nܭb'ZW;ҷZE j:eT}޿>mC e~~Yl{F.ɝ G/W@GMN7\ 1@D3fX9 ?ܞEHȋ券Q.z̜ _ub;N?9ÖL9a0s>=(At`~hS!͇:iqh? |lQ .mɦ?Xܺ1gDf_r,c1ar72_O{A ATfLj;UIџQ[_ O}}*A]NN?͚{;1 yWtP嫀]u&Nؖv?lMoww”HN/1r>ȏyI`xDsG\q HOJ S/x%Ɍ=' ‘o=߅q.^rsl? o?ci`cqb̏sAJR朏|\G/^WfވDI,vG>vȡEM^S3<-^ٜyc|cЏ Yp?Χ!_==}ެ0!T_=52.& ~\l7V7W7Si"OVQ}ɸV,:UZ%>w !`<h>xRDe0* q\x>G#|ob@OAz9t|SX=7бROLك۔n"/7B13s(= ^w c``>sq;/ q1'g 4^n`"eQ}yA5mEs?NriaMnqȎb؏+ 0羔^yVXHo%)}[iY2/QA=CH$k+h5!^ykc{h1Z}ycHS?Zds/j0̆`ZI{?5~F[􅾯^:'+A+7["UN0pςq-}|С%8`tBR}>Uis0{Y&Zbq+=$:ygvG00m<sr1 q|,xabU*Y^SrG(I~r O{x%TZRlY&8*׉a.E_vp*?7;[V{] (F|+v|7{n$xNf9kƑyYEr4ֺӱ~-ʗO[Y{"kWuNgGMxt!W̔GQ~5z|6_Y%Y!~}l0m!AIq{4ɥZP֥)W5gP49_ 8oJe֚@'˟Y'\9f p?Dttgf{Q9Ob_>0G4 v P CLy>^ݜ\a\CFJOG 6\rRG:=F}w)B][Gjg|:ד#ۇu!&z?T t;+]%pO^g>qAwԩǛ]/?pg[:zx1X:KLg<'dD 9x1Kx 1!9b#.|H%-[ j٣xo\WyiQ'0ss82xdːb[~lCc`\4cd:ۑ' pX,g:5(Fk4A]cf߇$vއ%╕}||/'A4 r{/ڋ=c . -[ܣ Y'wE|z{JG%mz]0+4S1.]rWjuf-sA>)A3"Z:p ZQ9߉c` f :9Mc&+x|| ;J)R;C_]|~__~PzYsO|BgJ)7 7~2o:667oÐes&2?O;4?=A$38̀NH~C"jEFEq&rA/"Cxݺ0,6U34<9ʚAh0Ȝvmt 1!BY?X0"CIJbՖ[jbǬHUzOf̆5uQ;} OJDkdZ U5gFk'O]JV/a!+ko3ݒ)-6:hC]BTqh)ئ1r{E30ۭQQyc ;S^/F" .|7oHf5 9Y]?#WYnZ|6p dDA {,KR?<2^{C4` z_@bx}ā pҁ0I2h!]O9ݍ( 䬧@O/JT >BN5؃VyC\` 'qsNs7Z!߆xA١7 SuvAGuƜ^~T: , xIc@ |ȷ=X>n˅^_mG9HWktz]FC+`xO/2}9f@Vngx^{֚?bD^ 7 mp=BQٌ 7 x`Yd!c&9SvfO9{8{|`Р3m~nO*?sȑ[5rxJ9*[7B~TKU8Z<ph&_ zyA6'@&/ї?YAD+KيO"mukP,VӶ=2`2?nгhOBr:D = ctN>=^:FE#I?MW[nOW3]ӛwm5qơD>,e&dWաA$щlA @+#2 `@9Jܣ<r$?5.6"z lvυN/E= c"x y4 |0^yZ+oޣr<;M#>Xo=A~g ?G.A"{#q?daQ aΑZD55eBG~΅}>:fbcxtVLNܸ>Wfyb~>rMVn.hfU1uѮ Ya&%8^ _P/vg3gx>j[@i y_|t^jQ&1ާOz>CMnO& }ԭ. ?D:|6EI/8c?j/ 4rj ;n'G?t$=E]QgYhnm}+t{~|Z*4GUvuiWG{G92ϵ+ 3m)cOx^e9ןc?mbӮUiȨ:uxnӿo_/t^]~w~-{htbz=!| 9rx]c~sp-S7D+yYSrZiIU_Dpr.D-_"*+l)Vxz`Bx)u"{Cŷ-o/ [N=w.1UD|q{ UZ[%wx׈'<{~ћrkշîP_Mڊwj7R[iDݗ#/dƖpaGa:mOɎl/NPjɩϱ%W~w.1"ω~ۉ+LppIV)^#qҹ|I*^bvlGBڬ *;A YP:us'm{j>8b=v+ >n)̤5ƅͅiiKqoPw kV}ƮN?6F;sIϕsO6xm  ͷ{D@½Q^e<:Q{ ǭ]g\`c.u:V>b=KJKۗu3;lPf{sdܡOa{ʭ.m.~6>w>2ytu1}h 1WapsS鳼[?Y74!>wiK\1xtsAiȺYkcO?G-d3οM_z=D&oɏʇ]hƮsp a Z~_bk |Ǽ2|qWҠޡ S7rVRkZ8_λ7 8Mfs| s3lj{Sup& L2N.eAƝs-߳HO96o_!crWt_v󟄆[Ix1#Kyʮvm+EPfgv^߈rCֆn*j`eA3|2}¡W_gO|#鑥Et0U&BNe,P'y~O.f]Eҹ(s7XW^O9YɦNtm@Tf+ߨDµ(X ,@>9a8^$Id-bj gwtN:CLb"~`ۗ?^{|&i7F/m\ ;+i_jY!zk(!9 6cGq/e;uk/˯ڍ>ZIGm/\I:4 !}-2d]HWL=Hԡd$5{  kc&x5fTc ab0$Q8 ^ >yDz?i<:Dsʋmh=K>3Ψ`m(աQ@FA]3+Βp r`k-UzDٚJ$FZ ,S@vTV%%u5E b>g'JNjn*pF:CCb@X@?4W}@O{(XFҦV>g'JNjn*pFBCb@@\@?-1OSM n 럆L<_ї, .;]kI 忞@`# JS5̿=iShaderNormalxj,S@vTVP0]pl T"\E t T"\E Normal&Input Normal brick F 1+5?N>/xjm=0G-|00rt=0G-|00rTangent(Input Tangent brick F 1+5?N>/xjn4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1,S@vTV=0G-|00r%%u5E b>g'JNjn*pF@DC`@T@? T"\E 4W}@O{(XFҦV>g'JNjn*pF@DC`@T@?-1OSM n 럆L<_ї, /|V FK|dzShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷p}p1M@o=}E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFC~__um1CR¬5ٻzEuSSaI7֏b4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4p1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3 qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatHRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4%%u5E b>g'JNjn*pFBC`@0@?)5FYPٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x44W}@O{(XFҦV>g'JNjn*pFBC`@0@?x*yI?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3#h"mO('%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3-1OSM n 럆L<_ї, piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatL{0nBg)`!  Normal-Map, 1 P)\Fvq3{O:rt{O:rNormalMaplNormalMap : RtSampler2D - The two dimensional sampler (TpFޚ@'0f F?tf F?TextureCoordslTextureCoords : RtFloat3 - The three component vector F 1+5?N>/0jn.Fd7atjn.Fd7aTangentToWorldZTangentToWorld : RtFloat3x3 - The 3x3 matrix F 1+5?N>/005p˚FudTQ9T5p˚FudTQ9NormalVectorjNormalVector : RtFloat3 - The three component vector F 1+5?N>/plh4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1 jn.Fd7a%%u5E b>g'JNjn*pFCB`@T@?4W}@O{(XFҦV>g'JNjn*pFCB`@T@?P)\Fvq3wk0.DX?_^CCU {O:r5p˚FudTQ9-1OSM n 럆L<_ї, f F?nEInputBitmapxL QNIM5G&p5%Kլy|PQ])JNЈtQ])JNЈoBitmapoBitmap eSBgcȸGqiFE0IN pA ?gŘrp5 B%OKphMuf2BޠQTpH T?cCx%Kp(QnfM9M$ p9QbJF}~b{pTKAIzc(p b/IG pЎeJf6KphdzCqIjAphoC~Oܝ3 pH4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1L QNIM5G&5%Kլy|GqiFE0IN NORMALMAP9QbJF}~b{-n,Njlpg????Q])JNЈQnfM9M$  Wrap%%u5E b>g'JNjn*pFBHBb@u@? b/IG hdzCqIjA ЎeJf6K4W}@O{oC~Oܝ3 (XFҦV>g'JNjn*pFBHBb@u@?5 B%OKAnisotropicMuf2BޠQTAnisotropicA ?gŘrAnisotropicTKAIzc( T?cCx%K Wrap-1OSM n 럆L<_ї, b=h0CRf1X0Material Flavor ManagerE+gYأC۲+?P'!EJGWMpE+F6~qK;2t&pE+4W}@O{$JMJ@|"tMJ@|"Mat Item 0BDynamic material input connectorE+(XFҦV"MJ@|"!EJGWM6~qK;2t&NOI/)[&2/ChˢjC(XFҦV>g'JNjn*pF@D"Cb@[@?gYأC۲+?) 6G%,Material List Manager-V?XM%P`o@+&zB}J?p׈4W}@O{$\G .t\G .Mat Chunk 0BDynamic material input connector |E8y(XFҦV"\G .-V?XM%&zB}J?(XFҦV>g'JNjn*pFCkCb@@X@?8ʯȥJH|o7 gH]kDwPi|`d8pM*#ͺOY|D/tfѭ8Lwb"qvx6z