/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2012 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ struct PTrackerSettings = [ PTRS_sName : S, PTRS_sObject : S, PTRS_bRayState : I, PTRS_vPos : [F F F], PTRS_vAng : [F F F] ]mkPTrackerSettings;; fun saveTrackers(l)= let sizelist l -> size in let nil -> ndata in let 0 -> i in ( while i < size do ( let nth_list l i -> [name trackerstr] in let trackerstr.PTRS_vPos -> [x y z] in let trackerstr.PTRS_vAng -> [ax ay az] in set ndata = ["GROUP" name]:: [(strcat "trackerName_" (itoa i)) name]:: [(strcat "trackerObj_" (itoa i)) trackerstr.PTRS_sObject]:: [(strcat "trackerOffsetpx_" (itoa i)) ftoa x]:: [(strcat "trackerOffsetpy_" (itoa i)) ftoa y]:: [(strcat "trackerOffsetpz_" (itoa i)) ftoa z]:: [(strcat "trackerOffsetax_" (itoa i)) ftoa ax]:: [(strcat "trackerOffsetay_" (itoa i)) ftoa ay]:: [(strcat "trackerOffsetaz_" (itoa i)) ftoa az]:: [(strcat "trackerRayState_" (itoa i)) itoa trackerstr.PTRS_bRayState]:: ["ACTION" (strcat name " enable ray")]:: ["ACTION" (strcat name " disable ray")]:: ["EVENT" (strcat name " found")]:: ["EVENT" (strcat name " lost")]:: ["EVENT" (strcat name " position")]:: ["EVENT" (strcat name " orientation")]:: /* ["EVENT" (strcat name " trigger value")]:: ["EVENT" (strcat name " trigger down")]:: ["EVENT" (strcat name " trigger up")]:: ["EVENT" (strcat name " menu down")]:: ["EVENT" (strcat name " menu up")]:: ["EVENT" (strcat name " A down")]:: ["EVENT" (strcat name " A up")]:: ["EVENT" (strcat name " grip down")]:: ["EVENT" (strcat name " grip up")]:: ["EVENT" (strcat name " touch pad")]:: ["EVENT" (strcat name " touch pad up")]:: ["EVENT" (strcat name " touch pad down")]:: ["EVENT" (strcat name " control")]:: ["EVENT" (strcat name " grab")]:: ["EVENT" (strcat name " ungrab")]:: */ ["GROUP" ""]:: ndata; set i = i + 1; ); ndata; );; fun cbCloseEdit(p)= let p -> [ctrlobjl [ctrlloffposx ctrlloffposy ctrlloffposz ctrlloffangx ctrlloffangy ctrlloffangz ctrllraystate] ctrlobjr [ctrlroffposx ctrlroffposy ctrlroffposz ctrlroffangx ctrlroffangy ctrlroffangz ctrlrraystate] ctrlignorephys ctrlshowray ctrlraysrcl ctrlraysrcr ctrlautoclick ctrlautoclickdist ctrlinit ctrltexture ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex ctrlbackground ctrlwidth ctrlheight ctrlposx ctrlposy ctrlxpercent ctrlypercent ctrlwpercent ctrlhpercent ctrlxoffset ctrlyoffset ctrlwoffset ctrlhoffset ctrlxalign ctrlyalign ctrlopacity ctrlinitcam ctrlshowcamera ctrldetectar ctrlteleport ctrlteleportcontroller [ltstr]] in let getEdCtrlTextLineValue ctrlobjl -> objlname in let getEdCtrlFloatValue ctrlloffposx -> loffposx in let getEdCtrlFloatValue ctrlloffposy -> loffposy in let getEdCtrlFloatValue ctrlloffposz -> loffposz in let getEdCtrlFloatValue ctrlloffangx -> loffangx in let getEdCtrlFloatValue ctrlloffangy -> loffangy in let getEdCtrlFloatValue ctrlloffangz -> loffangz in let getEdCtrlCheckState ctrllraystate -> lraystate in let getEdCtrlTextLineValue ctrlobjr -> objrname in let getEdCtrlFloatValue ctrlroffposx -> roffposx in let getEdCtrlFloatValue ctrlroffposy -> roffposy in let getEdCtrlFloatValue ctrlroffposz -> roffposz in let getEdCtrlFloatValue ctrlroffangx -> roffangx in let getEdCtrlFloatValue ctrlroffangy -> roffangy in let getEdCtrlFloatValue ctrlroffangz -> roffangz in let getEdCtrlCheckState ctrlrraystate -> rraystate in let getEdCtrlCheckState ctrlignorephys -> ignorecontrphys in let getSelectedEdCtrlSelectPos ctrlshowray -> showray in let getEdCtrlTextLineValue ctrlraysrcl -> raysrcl in let getEdCtrlTextLineValue ctrlraysrcr -> raysrcr in let getEdCtrlCheckState ctrlautoclick -> autoclick in let getEdCtrlFloatValue ctrlautoclickdist -> autoclickdist in let getEdCtrlCheckState ctrlinit -> init in let getEdCtrlCheckState ctrltexture -> istexture in let getEdCtrlTextLineValue ctrlobjname -> objname in let getSelectedEdCtrlSelect ctrlmatname -> matname in let getSelectedEdCtrlSelectPos ctrlmattech -> technique in let getSelectedEdCtrlSelectPos ctrlmatpass -> pass in let getSelectedEdCtrlSelectPos ctrlmattex -> texture in let ftoi getEdCtrlFloatValue ctrlposx -> posx in let ftoi getEdCtrlFloatValue ctrlposy -> posy in let ftoi getEdCtrlFloatValue ctrlwidth -> width in let ftoi getEdCtrlFloatValue ctrlheight -> height in let getEdCtrlCheckState ctrlxpercent -> xpercent in let getEdCtrlCheckState ctrlypercent -> ypercent in let getEdCtrlCheckState ctrlwpercent -> wpercent in let getEdCtrlCheckState ctrlhpercent -> hpercent in let ftoi getEdCtrlFloatValue ctrlxoffset -> xoffset in let ftoi getEdCtrlFloatValue ctrlyoffset -> yoffset in let ftoi getEdCtrlFloatValue ctrlwoffset -> woffset in let ftoi getEdCtrlFloatValue ctrlhoffset -> hoffset in let getSelectedEdCtrlSelectPos ctrlxalign -> xalign in let getSelectedEdCtrlSelectPos ctrlyalign -> yalign in let getEdCtrlCheckState ctrlbackground -> background in let ftoi getEdCtrlFloatValue ctrlopacity -> opacity in let getEdCtrlCheckState ctrlshowcamera -> showcamera in let getEdCtrlCheckState ctrlinitcam -> initcamera in let getEdCtrlCheckState ctrldetectar -> detectar in let getSelectedEdCtrlSelectPos ctrlteleport -> teleport in let getSelectedEdCtrlSelectPos ctrlteleportcontroller -> teleportcontroller in ["leftController" objlname]:: ["loffposx" ftoa loffposx]:: ["loffposy" ftoa loffposy]:: ["loffposz" ftoa loffposz]:: ["loffangx" ftoa loffangx]:: ["loffangy" ftoa loffangy]:: ["loffangz" ftoa loffangz]:: ["lraystate" itoa lraystate]:: ["rightController" objrname]:: ["roffposx" ftoa roffposx]:: ["roffposy" ftoa roffposy]:: ["roffposz" ftoa roffposz]:: ["roffangx" ftoa roffangx]:: ["roffangy" ftoa roffangy]:: ["roffangz" ftoa roffangz]:: ["rraystate" itoa rraystate]:: ["ignorecontrphys" itoa ignorecontrphys]:: ["init" itoa init]:: ["showray" itoa showray]:: ["raysrcl" raysrcl]:: ["raysrcr" raysrcr]:: ["autoclick" itoa autoclick]:: ["autoclickdist" ftoa autoclickdist]:: ["istexture" itoa istexture]:: ["object" objname]:: ["material" matname]:: ["technique" itoa technique]:: ["pass" itoa pass]:: ["texture" itoa texture]:: ["posx" itoa posx]:: ["posy" itoa posy]:: ["width" itoa width]:: ["height" itoa height]:: ["xpercent" itoa xpercent]:: ["ypercent" itoa ypercent]:: ["wpercent" itoa wpercent]:: ["hpercent" itoa hpercent]:: ["xoffset" itoa xoffset]:: ["yoffset" itoa yoffset]:: ["woffset" itoa woffset]:: ["hoffset" itoa hoffset]:: ["xalign" itoa xalign]:: ["yalign" itoa yalign]:: ["background" itoa background]:: ["opacity" itoa opacity]:: ["showcamera" itoa showcamera]:: ["initcamera" itoa initcamera]:: ["detectar" itoa detectar]:: ["teleportmode" itoa teleport]:: ["teleportcontroller" itoa teleportcontroller]:: saveTrackers ltstr;; fun fillMaterialTextureSelector(viewstr, ctrlselect, mat, tech, pass)= if mat == nil then nil else let V3DgetDefaultSession viewstr -> sessionstr in let SO3MaterialNumberOfTexturesByTechniqueAndPass mat tech pass -> size in let 0 -> i in let nil -> lmatname in ( while i < size do ( let SO3MaterialTextureUnitGetNameByIndex mat tech pass i -> matname in set lmatname = lcat lmatname matname::nil; set i = i + 1; ); fillEdCtrlSelect ctrlselect lmatname; ); 0;; fun cbMatPassName(ctrlstr, pos, elem, p)= let p -> [inst viewstr group ctrlmatname ctrlmattech ctrlmattex] in let getSelectedEdCtrlSelectPos ctrlmattech -> tech in let getSelectedEdCtrlSelect ctrlmatname -> matname in let V3DgetDefaultSession viewstr -> sessionstr in let if matname != nil then SO3SceneGetMaterial (V3DgetSession sessionstr) group matname else nil -> mat in fillMaterialTextureSelector viewstr ctrlmattex mat tech pos; 0;; fun fillMaterialPassSelector(viewstr, p, mat, tech)= let p -> [ctrlselect ctrlmatname ctrlmattech ctrlmattex] in if mat == nil then nil else let V3DgetDefaultSession viewstr -> sessionstr in let SO3MaterialNumberOfPassesByTechnique mat tech -> size in let 0 -> i in let nil -> lmatname in ( while i < size do ( let SO3MaterialPassGetNameByIndex mat tech i -> matname in let if (!strcmp matname "") then (itoa i) else matname -> matname in set lmatname = lcat lmatname matname::nil; set i = i + 1; ); fillEdCtrlSelect ctrlselect lmatname; fillMaterialTextureSelector viewstr ctrlmattex mat tech 0; ); 0;; fun cbMatTechniqueName(ctrlstr, pos, elem, p)= let p -> [inst viewstr group ctrlmatname ctrlmatpass ctrlmattex] in let getSelectedEdCtrlSelect ctrlmatname -> matname in let V3DgetDefaultSession viewstr -> sessionstr in let if matname != nil then SO3SceneGetMaterial (V3DgetSession sessionstr) group matname else nil -> mat in fillMaterialPassSelector viewstr [ctrlmatpass ctrlmatname ctrlstr ctrlmattex] mat pos; 0;; fun fillMaterialTechSelector(viewstr, p, mat)= let p -> [ctrlselect ctrlmatname ctrlmatpass ctrlmattex] in if mat == nil then nil else let V3DgetDefaultSession viewstr -> sessionstr in let SO3MaterialNumberOfTechniques mat -> size in let 0 -> i in let nil -> lmatname in ( while i < size do ( let SO3MaterialTechniqueGetNameByIndex mat i -> matname in set lmatname = lcat lmatname matname::nil; set i = i + 1; ); fillEdCtrlSelect ctrlselect lmatname; fillMaterialPassSelector viewstr [ctrlmatpass ctrlmatname ctrlselect ctrlmattex] mat 0; ); 0;; fun cbMatName(ctrlstr, pos, elem, p)= let p -> [inst viewstr group ctrlmattech ctrlmatpass ctrlmattex] in let V3DgetDefaultSession viewstr -> sessionstr in let if elem != nil then SO3SceneGetMaterial (V3DgetSession sessionstr) group elem else nil -> mat in fillMaterialTechSelector viewstr [ctrlmattech ctrlstr ctrlmatpass ctrlmattex] mat; 0;; fun fillMaterialSelector(viewstr, p, objname)= let p -> [inst ctrlselect ctrlmattech ctrlmatpass ctrlmattex] in if objname == nil then nil else let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) objname -> obj in let SO3EntityGetResourceGroup obj -> group in let SO3EntityMaterialList obj -> lmat in let nil -> lmatname in ( setEdCtrlSelectCb ctrlselect mkfun4 @cbMatName [inst viewstr group ctrlmattech ctrlmatpass ctrlmattex]; setEdCtrlSelectCb ctrlmattech mkfun4 @cbMatTechniqueName [inst viewstr group ctrlselect ctrlmatpass ctrlmattex]; setEdCtrlSelectCb ctrlmatpass mkfun4 @cbMatPassName [inst viewstr group ctrlselect ctrlmattech ctrlmattex]; let sizelist lmat -> size in let 0 -> i in while i < size do ( let nth_list lmat i -> mat in let SO3MaterialGetName mat -> matname in set lmatname = lcat lmatname matname::nil; set i = i + 1; ); fillEdCtrlSelect ctrlselect lmatname; fillMaterialTechSelector viewstr [ctrlmattech ctrlselect ctrlmatpass ctrlmattex] (SO3SceneGetMaterial (V3DgetSession sessionstr) group (hd lmatname)); ); 0;; fun cbCloseRes(ctrlbtn)= setEdCtrlButtonEnable ctrlbtn 1; 0;; fun cbSelectObjMaterial(val, type, p)= let p -> [inst winstr viewstr ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex] in let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) val -> obj in if obj == nil then nil else ( setEdCtrlTextLineValue ctrlobjname val; fillMaterialSelector viewstr [inst ctrlmatname ctrlmattech ctrlmatpass ctrlmattex] val; ); 0;; fun cbBtnPickObjMaterial(ctrlbtn, p)= let p -> [inst winstr viewstr ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex objname] in ( setEdCtrlButtonEnable ctrlbtn 0; dlgSelectPluginInstanceResource inst winstr iTypeEntity objname mkfun3 @cbSelectObjMaterial [inst winstr viewstr ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex] mkfun1 @cbCloseRes ctrlbtn 0; ); 0;; fun cbCheckTexture(ctrl, state, p)= let p -> [pickbtn ctrlposx ctrlxpercent ctrlxalign ctrlposy ctrlypercent ctrlyalign ctrlwpercent ctrlhpercent ctrlxoffset ctrlyoffset ctrlwoffset ctrlhoffset ctrlmatname ctrlmattech ctrlmatpass ctrlmattex ctrlbackground] in if state then ( setEdCtrlFloatEnable ctrlposx 0; setEdCtrlFloatEnable ctrlposy 0; setEdCtrlCheckEnable ctrlxpercent 0; setEdCtrlCheckEnable ctrlypercent 0; setEdCtrlSelectEnable ctrlxalign 0; setEdCtrlSelectEnable ctrlyalign 0; setEdCtrlCheckEnable ctrlwpercent 0; setEdCtrlCheckEnable ctrlhpercent 0; setEdCtrlFloatEnable ctrlxoffset 0; setEdCtrlFloatEnable ctrlyoffset 0; setEdCtrlFloatEnable ctrlwoffset 0; setEdCtrlFloatEnable ctrlhoffset 0; setEdCtrlCheckEnable ctrlbackground 0; setEdCtrlSelectEnable ctrlmatname 1; setEdCtrlSelectEnable ctrlmattech 1; setEdCtrlSelectEnable ctrlmatpass 1; setEdCtrlSelectEnable ctrlmattex 1; setEdCtrlButtonEnable pickbtn 1; ) else ( setEdCtrlFloatEnable ctrlposx 1; setEdCtrlFloatEnable ctrlposy 1; setEdCtrlCheckEnable ctrlxpercent 1; setEdCtrlCheckEnable ctrlypercent 1; setEdCtrlSelectEnable ctrlxalign 1; setEdCtrlSelectEnable ctrlyalign 1; setEdCtrlCheckEnable ctrlwpercent 1; setEdCtrlCheckEnable ctrlhpercent 1; setEdCtrlFloatEnable ctrlxoffset (getEdCtrlCheckState ctrlxpercent); setEdCtrlFloatEnable ctrlyoffset (getEdCtrlCheckState ctrlypercent); setEdCtrlFloatEnable ctrlwoffset (getEdCtrlCheckState ctrlwpercent); setEdCtrlFloatEnable ctrlhoffset (getEdCtrlCheckState ctrlhpercent); setEdCtrlCheckEnable ctrlbackground 1; setEdCtrlSelectEnable ctrlmatname 0; setEdCtrlSelectEnable ctrlmattech 0; setEdCtrlSelectEnable ctrlmatpass 0; setEdCtrlSelectEnable ctrlmattex 0; setEdCtrlButtonEnable pickbtn 0; ); 0;; fun cbSelectObj(val, type, p)= let p -> [inst winstr viewstr ctrlobjname] in let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) val -> obj in if (obj != nil) || (!strcmpi "Current camera" val) || (!strcmpi "Current camera shell" val) then ( setEdCtrlTextLineValue ctrlobjname val; ) else nil; 0;; fun cbBtnPickObj(ctrlbtn, p)= let p -> [inst winstr viewstr ctrlobjname objname] in ( setEdCtrlButtonEnable ctrlbtn 0; dlgSelectPluginInstanceResource inst winstr iTypeGroup|iTypeEntity|iTypeNode|iTypeLight|iTypeCamera|iTypeParticle|iTypeBone|iTypeCubeMap objname mkfun3 @cbSelectObj [inst winstr viewstr ctrlobjname] mkfun1 @cbCloseRes ctrlbtn 0; ); 0;; fun cbSelectObjTracker(val, type, p)= let p -> [inst winstr viewstr ctrlobjname trackerstr] in let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) val -> obj in if (obj != nil) || (!strcmpi "Current camera" val) || (!strcmpi "Current camera shell" val) then ( setEdCtrlTextLineValue ctrlobjname val; set trackerstr.PTRS_sObject = val; ) else nil; 0;; fun cbBtnPickObjTracker(ctrlbtn, p)= let p -> [inst winstr viewstr ctrlobjname objname trackerstr] in ( setEdCtrlButtonEnable ctrlbtn 0; dlgSelectPluginInstanceResource inst winstr iTypeGroup|iTypeEntity|iTypeNode|iTypeLight|iTypeCamera|iTypeParticle|iTypeBone|iTypeCubeMap objname mkfun3 @cbSelectObjTracker [inst winstr viewstr ctrlobjname trackerstr] mkfun1 @cbCloseRes ctrlbtn 0; ); 0;; fun cbRefreshBtn(pickbtn, p)= let p -> [ctrlobjname] in setEdCtrlTextLineValue ctrlobjname ""; 0;; fun cbRefreshBtnSpec(pickbtn, p)= let p -> [ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex] in ( setEdCtrlTextLineValue ctrlobjname ""; fillEdCtrlSelect ctrlmatname nil; fillEdCtrlSelect ctrlmattech nil; fillEdCtrlSelect ctrlmatpass nil; fillEdCtrlSelect ctrlmattex nil; ); 0;; fun cbPercentCheck(ctrlstr, state, ctrlfloat)= setEdCtrlFloatEnable ctrlfloat state; 0;; fun loadTrackers(inst)= let nil -> l in let nil -> trackername in let 0 -> i in ( while ((set trackername = getPluginInstanceParam inst (strcat "trackerName_" (itoa i))) != nil) do ( let getPluginInstanceParam inst (strcat "trackerObj_" (itoa i)) -> trackerobj in let atoi getPluginInstanceParam inst (strcat "trackerRayState_" (itoa i)) -> raystate in let atof (getPluginInstanceParam inst (strcat "trackerOffsetpx_" (itoa i))) -> offposx in let atof (getPluginInstanceParam inst (strcat "trackerOffsetpy_" (itoa i))) -> offposy in let atof (getPluginInstanceParam inst (strcat "trackerOffsetpz_" (itoa i))) -> offposz in let atof (getPluginInstanceParam inst (strcat "trackerOffsetax_" (itoa i))) -> offangx in let atof (getPluginInstanceParam inst (strcat "trackerOffsetay_" (itoa i))) -> offangy in let atof (getPluginInstanceParam inst (strcat "trackerOffsetaz_" (itoa i))) -> offangz in let mkPTrackerSettings[trackername trackerobj raystate [offposx offposy offposz] [offangx offangy offangz]] -> trackerstr in set l = [trackername trackerstr]::l; set i = i + 1; ); revertlist l; );; fun addTracker(l, name, objname, raystate, offsetpos, offsetang)= let switchstr l name -> trackerstr in if (trackerstr != nil) then l else let mkPTrackerSettings[name objname raystate offsetpos offsetang] -> trackerstr in set l = lcat l [name trackerstr]::nil;; fun removeTracker(l, name)= set l = remove_sid_from_list l name;; fun getTrackerByName(l, name)= switchstr l name;; fun fillTrackerList(ctrllist, ltstr)= while (ltstr != nil) do ( let hd ltstr -> [name trackerstr] in addEdCtrlList ctrllist name nil nil; set ltstr = tl ltstr; ); 0;; fun cbTrackerRayState(ctrlstr, state, trackerstr)= set trackerstr.PTRS_bRayState = state; 0;; fun cbSelectList(ctrlstr, pos, elem, lval, type, p)= let p -> [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] in let dltstr -> [ltstr] in let getTrackerByName ltstr elem -> trackerstr in if (trackerstr != nil) then ( setEdCtrlButtonEnable ctrlbtnobj 1; setEdCtrlButtonEnable refreshobjtname 1; setEdCtrlCheckEnable ctrlraystate 1; setEdCtrlFloatEnable ctrloffpx 1; setEdCtrlFloatEnable ctrloffpy 1; setEdCtrlFloatEnable ctrloffpz 1; setEdCtrlFloatEnable ctrloffax 1; setEdCtrlFloatEnable ctrloffay 1; setEdCtrlFloatEnable ctrloffaz 1; let trackerstr.PTRS_vPos -> [px py pz] in let trackerstr.PTRS_vAng -> [ax ay az] in ( setEdCtrlFloatValue ctrloffpx px; setEdCtrlFloatValue ctrloffpy py; setEdCtrlFloatValue ctrloffpz pz; setEdCtrlFloatValue ctrloffax ax; setEdCtrlFloatValue ctrloffay ay; setEdCtrlFloatValue ctrloffaz az; ); setEdCtrlButtonEnable ctrlbtndel 1; setEdCtrlButtonEnable ctrlbtnren 1; setEdCtrlTextLineValue ctrlobj trackerstr.PTRS_sObject; setEdCtrlButtonCb ctrlbtnobj mkfun2 @cbBtnPickObjTracker [inst ewinstr viewstr ctrlobj trackerstr.PTRS_sObject trackerstr]; setEdCtrlCheckState ctrlraystate trackerstr.PTRS_bRayState; setEdCtrlCheckCbState ctrlraystate mkfun3 @cbTrackerRayState trackerstr; ) else ( setEdCtrlButtonEnable ctrlbtnobj 0; setEdCtrlButtonEnable refreshobjtname 0; setEdCtrlCheckEnable ctrlraystate 0; setEdCtrlFloatEnable ctrloffpx 0; setEdCtrlFloatEnable ctrloffpy 0; setEdCtrlFloatEnable ctrloffpz 0; setEdCtrlFloatEnable ctrloffax 0; setEdCtrlFloatEnable ctrloffay 0; setEdCtrlFloatEnable ctrloffaz 0; setEdCtrlFloatValue ctrloffpx 0.0; setEdCtrlFloatValue ctrloffpy 0.0; setEdCtrlFloatValue ctrloffpz 0.0; setEdCtrlFloatValue ctrloffax 0.0; setEdCtrlFloatValue ctrloffay 0.0; setEdCtrlFloatValue ctrloffaz 0.0; setEdCtrlButtonEnable ctrlbtndel 0; setEdCtrlButtonEnable ctrlbtnren 0; setEdCtrlTextLineValue ctrlobj ""; setEdCtrlButtonCb ctrlbtnobj nil; setEdCtrlCheckCbState ctrlraystate nil; ); 0;; fun cbRefreshTrackerBtn(pickbtn, p)= let p -> [ctrllist ctrlobjt [ltstr]] in let getSelectedEdCtrlList ctrllist -> [name _ _] in let getTrackerByName ltstr name -> trackerstr in ( setEdCtrlTextLineValue ctrlobjt ""; if (trackerstr == nil) then nil else set trackerstr.PTRS_sObject = ""; ); 0;; fun cbTrackerPosChange(ctlstr, value, p)= let p -> [ctrllist ctrloffpx ctrloffpy ctrloffpz [ltstr]] in let getEdCtrlFloatValue ctrloffpx -> x in let getEdCtrlFloatValue ctrloffpy -> y in let getEdCtrlFloatValue ctrloffpz -> z in let getSelectedEdCtrlList ctrllist -> [name _ _] in let getTrackerByName ltstr name -> trackerstr in if (trackerstr == nil) then nil else set trackerstr.PTRS_vPos = [x y z]; 0;; fun cbTrackerAngChange(ctlstr, value, p)= let p -> [ctrllist ctrloffpx ctrloffpy ctrloffpz [ltstr]] in let getEdCtrlFloatValue ctrloffpx -> x in let getEdCtrlFloatValue ctrloffpy -> y in let getEdCtrlFloatValue ctrloffpz -> z in let getSelectedEdCtrlList ctrllist -> [name _ _] in let getTrackerByName ltstr name -> trackerstr in if (trackerstr == nil) then nil else set trackerstr.PTRS_vAng = [x y z]; 0;; fun cbBtnNewTracker(ctrlstr, text, p)= let p -> [[inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] winstr ctrltext] in let dltstr -> [ltstr] in let getEdCtrlTextLineValue ctrltext -> name in let getTrackerByName ltstr name -> trackerstr in if (trackerstr != nil) then nil else ( mutate dltstr <- [addTracker ltstr name "" 0 [0.0 0.0 0.0] [0.0 0.0 0.0]]; addEdCtrlList ctrllist name nil nil; selectEdCtrlList ctrllist name; cbSelectList ctrllist 0 name nil nil [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr]; dsEdWindow winstr; ); 0;; fun cbBtnCancelTracker(ctrlbtn, winstr)= dsEdWindow winstr; 0;; fun cbBtnNew(ctrlstr, p)= let p -> [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] in let [330 90] -> [iw ih] in let getEdWindowScreenPos ewinstr -> [px py] in let getEdWindowSize ewinstr -> [pw ph] in let [(px + ((pw / 2) - (iw / 2))) (py + ((ph / 2) - (ih / 2)))] -> [x y] in let setEdWindowIcon (crEdModalDialogWindow _channel ewinstr x y iw ih WN_NOSCOL|WN_MENU|WN_DIALOG nil (loc "OS3DOPENVR_0047")) sWinDlgIcon -> winstr in let crEdCtrlLabel winstr 10 12 120 20 (loc "OS3DOPENVR_0047") nil -> label in let crEdCtrlTextLine winstr 140 10 (iw - 150) 20 "" nil EDWIN_RESIZE_MW -> ctrltext in ( setEdctrlTextLineFocus ctrltext; setEdCtrlTextLineCbValidate ctrltext mkfun3 @cbBtnNewTracker [p winstr ctrltext]; setEdCtrlButtonCb (crEdCtrlButton winstr 10 (ih - 30) 90 20 (loc "OS3D_0282") EDWIN_RESIZE_MW) mkfun2 mkfun3 @cbBtnNewTracker [p winstr ctrltext] nil; setEdCtrlButtonCb (crEdCtrlButton winstr (iw - 100) (ih - 30) 90 20 (loc "OS3D_0084") EDWIN_RESIZE_MW) mkfun2 @cbBtnCancelTracker winstr; ); 0;; fun cbBtnRenameTracker(ctrlstr, text, p)= let p -> [[inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] trackerstr winstr ctrltext] in let dltstr -> [ltstr] in let getEdCtrlTextLineValue ctrltext -> name in let getTrackerByName ltstr name -> otrackerstr in if (!strcmp name otrackerstr.PTRS_sName) then ( dsEdWindow winstr; ) else if (otrackerstr != nil) then nil else ( renameEdCtrlListElement ctrllist trackerstr.PTRS_sName name; mutate dltstr <- [rename_sid_from_list ltstr trackerstr.PTRS_sName name]; set trackerstr.PTRS_sName = name; selectEdCtrlList ctrllist name; cbSelectList ctrllist 0 name nil nil [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr]; dsEdWindow winstr; ); 0;; fun cbBtnRename(ctrlstr, p)= let p -> [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] in let dltstr -> [ltstr] in let getSelectedEdCtrlList2 ctrllist -> [pos name _ _] in let getTrackerByName ltstr name -> trackerstr in if (trackerstr == nil) then nil else ( let [330 90] -> [iw ih] in let getEdWindowScreenPos ewinstr -> [px py] in let getEdWindowSize ewinstr -> [pw ph] in let [(px + ((pw / 2) - (iw / 2))) (py + ((ph / 2) - (ih / 2)))] -> [x y] in let setEdWindowIcon (crEdModalDialogWindow _channel ewinstr x y iw ih WN_NOSCOL|WN_MENU|WN_DIALOG nil (loc "OS3DOPENVR_0047")) sWinDlgIcon -> winstr in let crEdCtrlLabel winstr 10 12 120 20 (loc "OS3DOPENVR_0047") nil -> label in let crEdCtrlTextLine winstr 140 10 (iw - 150) 20 name nil EDWIN_RESIZE_MW -> ctrltext in ( setEdctrlTextLineFocus ctrltext; setEdCtrlTextLineCbValidate ctrltext mkfun3 @cbBtnRenameTracker [p trackerstr winstr ctrltext]; setEdCtrlButtonCb (crEdCtrlButton winstr 10 (ih - 30) 90 20 (loc "OS3D_0282") EDWIN_RESIZE_MW) mkfun2 mkfun3 @cbBtnRenameTracker [p trackerstr winstr ctrltext] nil; setEdCtrlButtonCb (crEdCtrlButton winstr (iw - 100) (ih - 30) 90 20 (loc "OS3D_0084") EDWIN_RESIZE_MW) mkfun2 @cbBtnCancelTracker winstr; ); ); 0;; fun cbSelectListDbClick(ctrlstr, pos, elem, lval, type, p)= cbBtnRename nil p; 0;; fun cbBtnDel(ctrlstr, p)= let p -> [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr] in let getSelectedEdCtrlList2 ctrllist -> [pos name _ _] in if (name == nil) then nil else let dltstr -> [ltstr] in ( delEdCtrlList ctrllist name; mutate dltstr <- [removeTracker ltstr name]; selectEdCtrlListByPos ctrllist pos; let getSelectedEdCtrlList ctrllist -> [name _ _] in cbSelectList ctrllist 0 name nil nil [inst viewstr ewinstr ctrllist ctrlbtndel ctrlbtnren ctrlobj ctrlbtnobj refreshobjtname ctrlraystate ctrloffpx ctrloffpy ctrloffpz ctrloffax ctrloffay ctrloffaz dltstr]; ); 0;; fun dynamicedit(ewinstr, inst, viewstr, applybtn)= let [455 460] -> [iw ih] in let 10 -> ypos in ( let loadTrackers inst -> ltstr in let getPluginInstanceParam inst "leftController" -> objlname in let atof (getPluginInstanceParam inst "loffposx") -> loffposx in let if loffposx == nil then 0.0 else loffposx -> loffposx in let atof (getPluginInstanceParam inst "loffposy") -> loffposy in let if loffposy == nil then 0.0 else loffposy -> loffposy in let atof (getPluginInstanceParam inst "loffposz") -> loffposz in let if loffposz == nil then 0.0 else loffposz -> loffposz in let atof (getPluginInstanceParam inst "loffangx") -> loffangx in let if loffangx == nil then 0.0 else loffangx -> loffangx in let atof (getPluginInstanceParam inst "loffangy") -> loffangy in let if loffangy == nil then 0.0 else loffangy -> loffangy in let atof (getPluginInstanceParam inst "loffangz") -> loffangz in let if loffangz == nil then 0.0 else loffangz -> loffangz in let atoi (getPluginInstanceParam inst "lraystate") -> lraystate in let if (lraystate == nil) then 1 else lraystate -> lraystate in let getPluginInstanceParam inst "rightController" -> objrname in let atof (getPluginInstanceParam inst "roffposx") -> roffposx in let if roffposx == nil then 0.0 else roffposx -> roffposx in let atof (getPluginInstanceParam inst "roffposy") -> roffposy in let if roffposy == nil then 0.0 else roffposy -> roffposy in let atof (getPluginInstanceParam inst "roffposz") -> roffposz in let if roffposz == nil then 0.0 else roffposz -> roffposz in let atof (getPluginInstanceParam inst "roffangx") -> roffangx in let if roffangx == nil then 0.0 else roffangx -> roffangx in let atof (getPluginInstanceParam inst "roffangy") -> roffangy in let if roffangy == nil then 0.0 else roffangy -> roffangy in let atof (getPluginInstanceParam inst "roffangz") -> roffangz in let if roffangz == nil then 0.0 else roffangz -> roffangz in let atoi (getPluginInstanceParam inst "rraystate") -> rraystate in let if (rraystate == nil) then 1 else rraystate -> rraystate in let atoi (getPluginInstanceParam inst "showray") -> showray in let if (showray == nil) then 1 else showray -> showray in let getPluginInstanceParam inst "raysrcl" -> raysrcl in let getPluginInstanceParam inst "raysrcr" -> raysrcr in let atoi (getPluginInstanceParam inst "autoclick") -> autoclick in let if (autoclick == nil) then 0 else autoclick -> autoclick in let atof (getPluginInstanceParam inst "autoclickdist") -> autoclickdist in let if (autoclickdist == nil) then 0.05 else autoclickdist -> autoclickdist in let atoi (getPluginInstanceParam inst "teleportmode") -> teleportmode in let if (teleportmode == nil) then 0 else teleportmode -> teleportmode in let atoi (getPluginInstanceParam inst "teleportcontroller") -> teleportcontroller in let if (teleportcontroller == nil) then 0 else teleportcontroller -> teleportcontroller in let atoi (getPluginInstanceParam inst "ignorecontrphys") -> ignorecontrphys in let if (ignorecontrphys == nil) then 1 else ignorecontrphys -> ignorecontrphys in let atoi(getPluginInstanceParam inst "init") -> init in let if init == nil then 1 else init -> init in let (getPluginInstanceParam inst "object") -> objname in let (getPluginInstanceParam inst "material") -> matname in let atoi (getPluginInstanceParam inst "technique") -> technique in let if technique == nil then 0 else technique -> technique in let atoi (getPluginInstanceParam inst "pass") -> pass in let if pass == nil then 0 else pass -> pass in let atoi (getPluginInstanceParam inst "texture") -> texture in let if texture == nil then 0 else texture -> texture in let atoi (getPluginInstanceParam inst "istexture") -> istexture in let if istexture == nil then 0 else istexture -> istexture in let atoi (getPluginInstanceParam inst "xpercent") -> xpercent in let if xpercent == nil then 0 else xpercent -> xpercent in let atoi (getPluginInstanceParam inst "xalign") -> xalign in let if xalign == nil then 0 else xalign -> xalign in let atoi (getPluginInstanceParam inst "posx") -> posx in let if posx == nil then 0 else posx -> posx in let atoi (getPluginInstanceParam inst "ypercent") -> ypercent in let if ypercent == nil then 0 else ypercent -> ypercent in let atoi (getPluginInstanceParam inst "yalign") -> yalign in let if yalign == nil then 0 else yalign -> yalign in let atoi (getPluginInstanceParam inst "posy") -> posy in let if posy == nil then 0 else posy -> posy in let atoi (getPluginInstanceParam inst "wpercent") -> wpercent in let if wpercent == nil then 1 else wpercent -> wpercent in let atoi (getPluginInstanceParam inst "width") -> width in let if width == nil then 100 else width -> width in let atoi (getPluginInstanceParam inst "hpercent") -> hpercent in let if hpercent == nil then 1 else hpercent -> hpercent in let atoi (getPluginInstanceParam inst "height") -> height in let if height == nil then 100 else height -> height in let atoi (getPluginInstanceParam inst "xoffset") -> xoffset in let if xoffset == nil then 0 else xoffset -> xoffset in let atoi (getPluginInstanceParam inst "yoffset") -> yoffset in let if yoffset == nil then 0 else yoffset -> yoffset in let atoi (getPluginInstanceParam inst "woffset") -> woffset in let if woffset == nil then 0 else woffset -> woffset in let atoi (getPluginInstanceParam inst "hoffset") -> hoffset in let if hoffset == nil then 0 else hoffset -> hoffset in let atoi (getPluginInstanceParam inst "background") -> background in let if (background == nil) then 1 else background -> background in let atoi (getPluginInstanceParam inst "opacity") -> opacity in let if opacity == nil then 100 else opacity -> opacity in let atoi (getPluginInstanceParam inst "showcamera") -> showcamera in let if (showcamera == nil) then 0 else showcamera -> showcamera in let atoi (getPluginInstanceParam inst "initcamera") -> initcamera in let if (initcamera == nil) then 0 else initcamera -> initcamera in let atoi (getPluginInstanceParam inst "detectar") -> detectar in let if (detectar == nil) then 0 else detectar -> detectar in let sizelist ltstr -> havetrackers in let if (autoclick || ((raysrcl != nil) && (strcmp raysrcl "")) || ((raysrcr != nil) && (strcmp raysrcr ""))) then 1 else 0 -> haverayopt in ( if !haverayopt then nil else set ih = ih + 145; if !istexture then nil else set ih = ih + 160; if !havetrackers then nil else set ih = ih + 245; setEdWindowSize ewinstr iw ih; let crEdFrameWindow _channel ewinstr 0 0 iw 265 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0001") (loc "OS3DOPENVR_0002") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 245 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 160 20 (loc "OS3DOPENVR_0003") nil -> labelleft in let crEdCtrlTextLine winstr 180 ypos 140 20 objlname nil EDWIN_RESIZE_MW -> ctrlobjl in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> picklbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshobjlname in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0041") nil -> labelloffp in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labelloffpx in let crEdCtrlFloat winstr 193 ypos 60 20 loffposx (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlloffposx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labelloffpy in let crEdCtrlFloat winstr 276 ypos 60 20 loffposy (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlloffposy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labelloffpz in let crEdCtrlFloat winstr 359 ypos 60 20 loffposz (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlloffposz in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0042") nil -> labelloffo in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labelloffox in let crEdCtrlFloat winstr 193 ypos 60 20 loffangx (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlloffangx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labelloffoy in let crEdCtrlFloat winstr 276 ypos 60 20 loffangy (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlloffangy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labelloffoz in let crEdCtrlFloat winstr 359 ypos 60 20 loffangz (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlloffangz in let crEdCtrlCheck winstr 25 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0057") EDWIN_RESIZE_MW -> ctrllraystate in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 35) + 2) 160 20 (loc "OS3DOPENVR_0004") nil -> labelright in let crEdCtrlTextLine winstr 180 ypos 140 20 objrname nil EDWIN_RESIZE_MW -> ctrlobjr in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickrbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshobjrname in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0041") nil -> labelroffp in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labelroffpx in let crEdCtrlFloat winstr 193 ypos 60 20 roffposx (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlroffposx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labelroffpy in let crEdCtrlFloat winstr 276 ypos 60 20 roffposy (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlroffposy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labelroffpz in let crEdCtrlFloat winstr 359 ypos 60 20 roffposz (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrlroffposz in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0042") nil -> labelroffo in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labelroffox in let crEdCtrlFloat winstr 193 ypos 60 20 roffangx (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlroffangx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labelroffoy in let crEdCtrlFloat winstr 276 ypos 60 20 roffangy (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlroffangy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labelroffoz in let crEdCtrlFloat winstr 359 ypos 60 20 roffangz (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrlroffangz in let crEdCtrlCheck winstr 25 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0057") EDWIN_RESIZE_MW -> ctrlrraystate in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0032") EDWIN_RESIZE_MW -> ctrlignorephys in let crEdFrameWindowEx _channel ewinstr 0 0 iw 155 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0049") (loc "OS3DOPENVR_0002") !haverayopt -> winfrm in let crEdWindow _channel winfrm 0 18 iw 145 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 170 20 (loc "OS3DOPENVR_0031") nil -> labelray in let crEdCtrlSelect winstr 180 ypos (iw - 180) 120 EDWIN_RESIZE_MW -> ctrlshowray in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0050") EDWIN_RESIZE_MW -> ctrlautoclick in let crEdCtrlLabel winstr 15 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DOPENVR_0051") nil -> labeldist in let crEdCtrlFloat winstr 185 ypos 100 20 autoclickdist 0.001 100.0 0.01 3 nil EDWIN_RESIZE_MW -> ctrlautoclickdist in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DOPENVR_0052") nil -> labelleft in let crEdCtrlTextLine winstr 180 ypos 140 20 raysrcl nil EDWIN_RESIZE_MW -> ctrlraysrcl in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickraysrclbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshraysrclname in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DOPENVR_0053") nil -> labelright in let crEdCtrlTextLine winstr 180 ypos 140 20 raysrcr nil EDWIN_RESIZE_MW -> ctrlraysrcr in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickraysrcrbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshraysrcrname in let crEdFrameWindowEx _channel ewinstr 0 0 iw 265 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0043") (loc "OS3DOPENVR_0002") !havetrackers -> winfrm in let crEdWindow _channel winfrm 0 18 iw 245 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlList winstr 10 (set ypos = 10) (iw - 20) 90 LB_BORDER|LB_VSCROLL|ET_TABFOCUS EDWIN_RESIZE_MW|EDWIN_RESIZE_MH -> ctrllist in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 95) + 2) 160 20 (loc "OS3DOPENVR_0048") nil -> labelobjt in let crEdCtrlTextLine winstr 180 ypos 140 20 "" nil EDWIN_RESIZE_MW -> ctrlobjt in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> picktbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshobjtname in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0041") nil -> labeltoffp in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labeltoffpx in let crEdCtrlFloat winstr 193 ypos 60 20 0.0 (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrltoffposx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labeltoffpy in let crEdCtrlFloat winstr 276 ypos 60 20 0.0 (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrltoffposy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labeltoffpz in let crEdCtrlFloat winstr 359 ypos 60 20 0.0 (-.100000.0) 100000.0 0.01 4 nil EDWIN_RESIZE_MW -> ctrltoffposz in let crEdCtrlLabel winstr 25 ((set ypos = ypos + 25) + 2) 145 20 (loc "OS3DOPENVR_0042") nil -> labeltoffo in let crEdCtrlLabel winstr 180 (ypos + 2) 10 20 "X" nil -> labeltoffox in let crEdCtrlFloat winstr 193 ypos 60 20 0.0 (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrltoffangx in let crEdCtrlLabel winstr 263 (ypos + 2) 10 20 "Y" nil -> labeltoffoy in let crEdCtrlFloat winstr 276 ypos 60 20 0.0 (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrltoffangy in let crEdCtrlLabel winstr 346 (ypos + 2) 10 20 "Z" nil -> labeltoffoz in let crEdCtrlFloat winstr 359 ypos 60 20 0.0 (-.180.0) 180.0 1.0 3 nil EDWIN_RESIZE_MW -> ctrltoffangz in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0057") EDWIN_RESIZE_MW -> ctrlraystate in let crEdCtrlButton winstr (iw - 225) (set ypos = ypos + 35) 70 20 (loc "OS3DOPENVR_0044") EDWIN_RESIZE_MW -> ctrlbtnadd in let crEdCtrlButton winstr (iw - 150) ypos 70 20 (loc "OS3DOPENVR_0045") EDWIN_RESIZE_MW -> ctrlbtnren in let crEdCtrlButton winstr (iw - 75) ypos 70 20 (loc "OS3DOPENVR_0046") EDWIN_RESIZE_MW -> ctrlbtndel in let crEdFrameWindowEx _channel ewinstr 0 0 iw 180 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0005") (loc "OS3DOPENVR_0002") !istexture -> winfrm in let crEdWindow _channel winfrm 0 18 iw 160 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlCheck winstr 10 (set ypos = 10) 280 20 (loc "OS3DOPENVR_0006") EDWIN_RESIZE_MW -> ctrltexture in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DOPENVR_0007") nil -> labelobj in let crEdCtrlTextLine winstr 180 ypos 170 20 objname nil EDWIN_RESIZE_MW -> ctrlobjname in let crEdCtrlButton winstr 360 ypos 55 20 "..." nil -> pickbtn in let crEdCtrlButton winstr 420 ypos 35 20 "X" nil -> refreshobjname in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DOPENVR_0008") nil -> labelmat in let crEdCtrlSelect winstr 180 ypos (iw - 180) 120 EDWIN_RESIZE_MW -> ctrlmatname in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DOPENVR_0009") nil -> labeltech in let crEdCtrlSelect winstr 180 ypos (iw - 180) 120 EDWIN_RESIZE_MW -> ctrlmattech in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DOPENVR_0010") nil -> labelpass in let crEdCtrlSelect winstr 180 ypos (iw - 180) 120 EDWIN_RESIZE_MW -> ctrlmatpass in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DOPENVR_0011") nil -> labeltex in let crEdCtrlSelect winstr 180 ypos (iw - 180) 120 EDWIN_RESIZE_MW -> ctrlmattex in let crEdFrameWindowEx _channel ewinstr 0 0 iw 155 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0012") (loc "OS3DOPENVR_0002") 1 -> winfrm in let crEdWindow _channel winfrm 0 18 iw 135 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlCheck winstr 10 (set ypos = 10) 280 20 (loc "OS3DOPENVR_0013") EDWIN_RESIZE_MW -> ctrlbackground in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 90 20 (loc "OS3DOPENVR_0014") nil -> labelx in let crEdCtrlFloat winstr 110 ypos 60 20 itof posx (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlposx in let crEdCtrlCheck winstr 180 ypos 40 20 "(%)" EDWIN_RESIZE_MW -> ctrlxpercent in let crEdCtrlLabel winstr 220 (ypos + 2) 60 20 (loc "OS3DOPENVR_0015") nil -> labelxo in let crEdCtrlFloat winstr 285 ypos 60 20 itof xoffset (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlxoffset in let crEdCtrlSelect winstr 355 ypos 100 120 EDWIN_RESIZE_MW -> ctrlxalign in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 90 20 (loc "OS3DOPENVR_0016") nil -> labely in let crEdCtrlFloat winstr 110 ypos 60 20 itof posy (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlposy in let crEdCtrlCheck winstr 180 ypos 40 20 "(%)" EDWIN_RESIZE_MW -> ctrlypercent in let crEdCtrlLabel winstr 220 (ypos + 2) 60 20 (loc "OS3DOPENVR_0015") nil -> labelyo in let crEdCtrlFloat winstr 285 ypos 60 20 itof yoffset (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlyoffset in let crEdCtrlSelect winstr 355 ypos 100 120 EDWIN_RESIZE_MW -> ctrlyalign in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 90 20 (loc "OS3DOPENVR_0017") nil -> labelw in let crEdCtrlFloat winstr 110 ypos 60 20 itof width 0.0 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlwidth in let crEdCtrlCheck winstr 180 ypos 40 20 "(%)" EDWIN_RESIZE_MW -> ctrlwpercent in let crEdCtrlLabel winstr 220 (ypos + 2) 60 20 (loc "OS3DOPENVR_0015") nil -> labelwo in let crEdCtrlFloat winstr 285 ypos 60 20 itof woffset (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlwoffset in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 90 20 (loc "OS3DOPENVR_0018") nil -> labelh in let crEdCtrlFloat winstr 110 ypos 60 20 itof height 0.0 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlheight in let crEdCtrlCheck winstr 180 ypos 40 20 "(%)" EDWIN_RESIZE_MW -> ctrlhpercent in let crEdCtrlLabel winstr 220 (ypos + 2) 60 20 (loc "OS3DOPENVR_0015") nil -> labelho in let crEdCtrlFloat winstr 285 ypos 60 20 itof hoffset (-.10000.0) 10000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlhoffset in let crEdFrameWindowEx _channel ewinstr 0 0 iw 135 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0024") (loc "OS3DOPENVR_0002") 1 -> winfrm in let crEdWindow _channel winfrm 0 18 iw 115 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 160 20 (loc "OS3DOPENVR_0025") nil -> labelo in let crEdCtrlFloat winstr 180 ypos 100 20 itof opacity 0.0 100.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlopacity in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DOPENVR_0026") EDWIN_RESIZE_MW -> ctrlinitcam in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DOPENVR_0027") EDWIN_RESIZE_MW -> ctrlshowcamera in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DOPENVR_0028") EDWIN_RESIZE_MW -> ctrldetectar in let crEdFrameWindow _channel ewinstr 0 0 iw 105 EDWIN_RESIZE_MW nil (loc "OS3DOPENVR_0029") (loc "OS3DOPENVR_0002") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 90 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 (set ypos = 10) + 2 160 20 (loc "OS3DOPENVR_0033") nil -> labelteleport in let crEdCtrlSelect winstr 180 ypos 200 120 EDWIN_RESIZE_MW -> ctrlteleport in let crEdCtrlLabel winstr 10 (set ypos = ypos + 25) + 2 160 20 (loc "OS3DOPENVR_0034") nil -> labelteleportctrl in let crEdCtrlSelect winstr 180 ypos 200 120 EDWIN_RESIZE_MW -> ctrlteleportcontroller in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) 280 20 (loc "OS3DOPENVR_0030") EDWIN_RESIZE_MW -> ctrlinit in let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) objname -> obj in let SO3EntityGetResourceGroup obj -> group in let [ltstr] -> dltstr in ( fillEdCtrlSelect ctrlshowray (loc "OS3DOPENVR_0054")::(loc "OS3DOPENVR_0055")::(loc "OS3DOPENVR_0056")::nil; selectEdCtrlSelectByPos ctrlshowray showray; setEdCtrlCheckState ctrllraystate lraystate; setEdCtrlCheckState ctrlrraystate rraystate; setEdCtrlCheckState ctrlautoclick autoclick; setEdCtrlCheckState ctrlignorephys ignorecontrphys; setEdCtrlCheckState ctrlinitcam initcamera; setEdCtrlCheckState ctrlshowcamera showcamera; setEdCtrlCheckState ctrldetectar detectar; fillEdCtrlSelect ctrlteleport (loc "OS3DOPENVR_0035")::(loc "OS3DOPENVR_0036")::(loc "OS3DOPENVR_0037")::nil; selectEdCtrlSelectByPos ctrlteleport teleportmode; fillEdCtrlSelect ctrlteleportcontroller (loc "OS3DOPENVR_0038")::(loc "OS3DOPENVR_0039")::(loc "OS3DOPENVR_0040")::nil; selectEdCtrlSelectByPos ctrlteleportcontroller teleportcontroller; fillEdCtrlSelect ctrlxalign (loc "OS3DOPENVR_0019")::(loc "OS3DOPENVR_0020")::(loc "OS3DOPENVR_0021")::nil; fillEdCtrlSelect ctrlyalign (loc "OS3DOPENVR_0022")::(loc "OS3DOPENVR_0020")::(loc "OS3DOPENVR_0023")::nil; selectEdCtrlSelectByPos ctrlxalign xalign; selectEdCtrlSelectByPos ctrlyalign yalign; setEdCtrlCheckState ctrlbackground background; setEdCtrlCheckState ctrltexture istexture; setEdCtrlCheckState ctrlxpercent xpercent; setEdCtrlCheckState ctrlypercent ypercent; setEdCtrlCheckState ctrlwpercent wpercent; setEdCtrlCheckState ctrlhpercent hpercent; setEdCtrlCheckCbState ctrlxpercent mkfun3 @cbPercentCheck ctrlxoffset; setEdCtrlCheckCbState ctrlypercent mkfun3 @cbPercentCheck ctrlyoffset; setEdCtrlCheckCbState ctrlwpercent mkfun3 @cbPercentCheck ctrlwoffset; setEdCtrlCheckCbState ctrlhpercent mkfun3 @cbPercentCheck ctrlhoffset; fillMaterialSelector viewstr [inst ctrlmatname ctrlmattech ctrlmatpass ctrlmattex] objname; selectEdCtrlSelect ctrlmatname matname; let SO3SceneGetMaterial (V3DgetSession sessionstr) group matname -> mat in if mat == nil then nil else ( fillMaterialTechSelector viewstr [ctrlmattech ctrlmatname ctrlmatpass ctrlmattex] mat; selectEdCtrlSelectByPos ctrlmattech technique; fillMaterialPassSelector viewstr [ctrlmatpass ctrlmatname ctrlmattech ctrlmattex] mat technique; selectEdCtrlSelectByPos ctrlmatpass pass; fillMaterialTextureSelector viewstr ctrlmattex mat technique pass; selectEdCtrlSelectByPos ctrlmattex texture; ); setEdCtrlCheckCbState ctrltexture mkfun3 @cbCheckTexture [pickbtn ctrlposx ctrlxpercent ctrlxalign ctrlposy ctrlypercent ctrlyalign ctrlwpercent ctrlhpercent ctrlxoffset ctrlyoffset ctrlwoffset ctrlhoffset ctrlmatname ctrlmattech ctrlmatpass ctrlmattex ctrlbackground]; setEdCtrlButtonCb pickbtn mkfun2 @cbBtnPickObjMaterial [inst winstr viewstr ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex objname]; setEdCtrlTextLineEnable ctrlobjname 0; setEdCtrlButtonCb refreshobjname mkfun2 @cbRefreshBtnSpec [ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex]; if istexture then ( setEdCtrlFloatEnable ctrlposx 0; setEdCtrlFloatEnable ctrlposy 0; setEdCtrlCheckEnable ctrlxpercent 0; setEdCtrlCheckEnable ctrlypercent 0; setEdCtrlSelectEnable ctrlxalign 0; setEdCtrlSelectEnable ctrlyalign 0; setEdCtrlCheckEnable ctrlwpercent 0; setEdCtrlCheckEnable ctrlhpercent 0; setEdCtrlFloatEnable ctrlxoffset 0; setEdCtrlFloatEnable ctrlyoffset 0; setEdCtrlFloatEnable ctrlwoffset 0; setEdCtrlFloatEnable ctrlhoffset 0; setEdCtrlCheckEnable ctrlbackground 0; setEdCtrlSelectEnable ctrlmatname 1; setEdCtrlSelectEnable ctrlmattech 1; setEdCtrlSelectEnable ctrlmatpass 1; setEdCtrlSelectEnable ctrlmattex 1; setEdCtrlButtonEnable pickbtn 1; ) else ( setEdCtrlFloatEnable ctrlposx 1; setEdCtrlFloatEnable ctrlposy 1; setEdCtrlCheckEnable ctrlxpercent 1; setEdCtrlCheckEnable ctrlypercent 1; setEdCtrlSelectEnable ctrlxalign 1; setEdCtrlSelectEnable ctrlyalign 1; setEdCtrlCheckEnable ctrlwpercent 1; setEdCtrlCheckEnable ctrlhpercent 1; setEdCtrlFloatEnable ctrlxoffset (getEdCtrlCheckState ctrlxpercent); setEdCtrlFloatEnable ctrlyoffset (getEdCtrlCheckState ctrlypercent); setEdCtrlFloatEnable ctrlwoffset (getEdCtrlCheckState ctrlwpercent); setEdCtrlFloatEnable ctrlhoffset (getEdCtrlCheckState ctrlhpercent); setEdCtrlCheckEnable ctrlbackground 1; setEdCtrlSelectEnable ctrlmatname 0; setEdCtrlSelectEnable ctrlmattech 0; setEdCtrlSelectEnable ctrlmatpass 0; setEdCtrlSelectEnable ctrlmattex 0; setEdCtrlButtonEnable pickbtn 0; ); setEdCtrlButtonCb picklbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlobjl objlname]; setEdCtrlTextLineEnable ctrlobjl 0; setEdCtrlButtonCb refreshobjlname mkfun2 @cbRefreshBtn [ctrlobjl]; setEdCtrlButtonCb pickrbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlobjr objrname]; setEdCtrlTextLineEnable ctrlobjr 0; setEdCtrlButtonCb refreshobjrname mkfun2 @cbRefreshBtn [ctrlobjr]; setEdCtrlButtonCb pickraysrclbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlraysrcl raysrcl]; setEdCtrlTextLineEnable ctrlraysrcl 0; setEdCtrlButtonCb refreshraysrclname mkfun2 @cbRefreshBtn [ctrlraysrcl]; setEdCtrlButtonCb pickraysrcrbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlraysrcr raysrcr]; setEdCtrlTextLineEnable ctrlraysrcr 0; setEdCtrlButtonCb refreshraysrcrname mkfun2 @cbRefreshBtn [ctrlraysrcr]; fillTrackerList ctrllist ltstr; setEdCtrlListCbClick ctrllist mkfun6 @cbSelectList [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlListCbDbClick ctrllist mkfun6 @cbSelectListDbClick [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; selectEdCtrlListByPos ctrllist 0; let getSelectedEdCtrlList ctrllist -> [name _ _] in cbSelectList ctrllist 0 name nil nil [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlFloatCbChange ctrltoffposx mkfun3 @cbTrackerPosChange [ctrllist ctrltoffposx ctrltoffposy ctrltoffposz dltstr]; setEdCtrlFloatCbChange ctrltoffposy mkfun3 @cbTrackerPosChange [ctrllist ctrltoffposx ctrltoffposy ctrltoffposz dltstr]; setEdCtrlFloatCbChange ctrltoffposz mkfun3 @cbTrackerPosChange [ctrllist ctrltoffposx ctrltoffposy ctrltoffposz dltstr]; setEdCtrlFloatCbChange ctrltoffangx mkfun3 @cbTrackerAngChange [ctrllist ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlFloatCbChange ctrltoffangy mkfun3 @cbTrackerAngChange [ctrllist ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlFloatCbChange ctrltoffangz mkfun3 @cbTrackerAngChange [ctrllist ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlButtonCb ctrlbtnadd mkfun2 @cbBtnNew [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlButtonCb ctrlbtnren mkfun2 @cbBtnRename [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlButtonCb ctrlbtndel mkfun2 @cbBtnDel [inst viewstr winstr ctrllist ctrlbtndel ctrlbtnren ctrlobjt picktbtn refreshobjtname ctrlraystate ctrltoffposx ctrltoffposy ctrltoffposz ctrltoffangx ctrltoffangy ctrltoffangz dltstr]; setEdCtrlButtonCb refreshobjtname mkfun2 @cbRefreshTrackerBtn [ctrllist ctrlobjt dltstr]; setEdCtrlCheckState ctrlinit init; [mkfun1 @cbCloseEdit [ctrlobjl [ctrlloffposx ctrlloffposy ctrlloffposz ctrlloffangx ctrlloffangy ctrlloffangz ctrllraystate] ctrlobjr [ctrlroffposx ctrlroffposy ctrlroffposz ctrlroffangx ctrlroffangy ctrlroffangz ctrlrraystate] ctrlignorephys ctrlshowray ctrlraysrcl ctrlraysrcr ctrlautoclick ctrlautoclickdist ctrlinit ctrltexture ctrlobjname ctrlmatname ctrlmattech ctrlmatpass ctrlmattex ctrlbackground ctrlwidth ctrlheight ctrlposx ctrlposy ctrlxpercent ctrlypercent ctrlwpercent ctrlhpercent ctrlxoffset ctrlyoffset ctrlwoffset ctrlhoffset ctrlxalign ctrlyalign ctrlopacity ctrlinitcam ctrlshowcamera ctrldetectar ctrlteleport ctrlteleportcontroller dltstr] nil]; ); ); );;