/* ----------------------------------------------------------------------------- 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 MarkerPreview = [ EMP_inst : PInstance, EMP_sGroupName : S, EMP_marker : ObjArMarker, EMP_markerType : I, EMP_markerId : I, EMP_sPath : S, EMP_parent : SO3_OBJECT, EMP_plane : SO3_OBJECT, EMP_material : SO3_MATERIAL, EMP_texture : SO3_TEXTURE, EMP_fSize : F, EMP_fRatio : F, EMP_bFlipXY : I, EMP_tSize : [I I], EMP_bEdit : I, EMP_bPLay : I ] MkMarkerPreview;; typeof lMarkerPreview = [[PInstance MarkerPreview] r1];; fun destroyMarkerPlan(pmarker)= SO3ObjectDestroy pmarker.EMP_plane; set pmarker.EMP_plane = nil; SO3MaterialDestroy pmarker.EMP_material; set pmarker.EMP_plane = nil; SO3TextureDestroy pmarker.EMP_texture; set pmarker.EMP_texture = nil; 0;; fun cbDestroyEdit(pmarker)= if ((getPluginInstanceShowHelper pmarker.EMP_inst) && (pmarker.EMP_bPLay == 0)) then nil else destroyMarkerPlan pmarker; set pmarker.EMP_bEdit = 0; 0;; fun cbCloseEdit(p)= let p -> [ctrlobjname ctrlmsize ctrlid ctrlpath ctrlmaxfeatures ctrlobjref ctrlspace ctrlenable ctrltrack ctrlinvertaxis ctrlblittexture ctrlmatindex] in let getEdCtrlTextLineValue ctrlobjname -> objname in let getEdCtrlFloatValue ctrlmsize -> msize in let getEdCtrlFloatValue ctrlid -> id in let getEdCtrlTextLineValue ctrlpath -> path in let getEdCtrlFloatValue ctrlmaxfeatures -> maxfeatures in let getEdCtrlTextLineValue ctrlobjref -> objref in let getSelectedEdCtrlSelectPos ctrlspace -> imode in let getEdCtrlCheckState ctrlenable -> enable in let getEdCtrlCheckState ctrltrack -> track in let getEdCtrlCheckState ctrlinvertaxis -> invertaxis in let getEdCtrlCheckState ctrlblittexture -> blittexture in let ftoi getEdCtrlFloatValue ctrlmatindex -> matindex in let getFilePathWithoutExt path -> basepath in ["object" objname]:: ["msize" ftoa msize]:: ["id" ftoa id]:: ["path" path]:: ["pathfset" strcat basepath ".fset"]:: ["pathfset3" strcat basepath ".fset3"]:: ["pathfiset" strcat basepath ".iset"]:: ["maxfeatures" ftoa maxfeatures]:: ["objRef" objref]:: ["imode" itoa imode]:: ["enable" itoa enable]:: ["track" itoa track]:: ["invertaxis" itoa invertaxis]:: ["blittexture" itoa blittexture]:: ["matindex" itoa matindex]:: nil;; fun cbSelectObj(val, type, p)= let p -> [inst winstr viewstr ctrlobjname pmarker] in let SO3SceneGetObject (V3DgetSession c3dXsession) val -> obj in if (obj != nil) || (!strcmpi "Current camera" val) || (!strcmpi "Current camera shell" val) then ( setEdCtrlTextLineValue ctrlobjname val; if (pmarker == nil) then nil else set pmarker.EMP_parent = obj; ) else nil; 0;; fun cbCloseRes(ctrlbtn)= setEdCtrlButtonEnable ctrlbtn 1; 0;; fun cbEditorPreRender(inst, sessionstr, etime, pmarker)= if (pmarker.EMP_plane == nil) then nil else let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0] else SO3ObjectGetGlobalPosition pmarker.EMP_parent -> pos in let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0 1.0] else SO3ObjectGetGlobalOrientation pmarker.EMP_parent -> quat in //rotate Y 90 for legacy compatibility //let SO3MathsQuatAdd quat [0.0 (-.sqrt(0.5)) 0.0 sqrt(0.5)] -> quat in let if pmarker.EMP_bFlipXY then SO3MathsQuatAdd quat SO3MathsQuatAdd SO3MathsQuatAdd [0.0 1.0 0.0 0.0] [0.0 0.0 0.5 0.5] [(-.0.5) 0.0 0.0 0.5] else SO3MathsQuatAdd quat [0.0 1.0 0.0 0.0] -> quat in ( SO3ObjectSetPosition pmarker.EMP_plane pos; SO3ObjectSetOrientation pmarker.EMP_plane quat; SO3ObjectSetVisible pmarker.EMP_plane ((SO3ObjectGetVisible pmarker.EMP_parent) || pmarker.EMP_bEdit) 1; ); 0;; fun updateMarkerPlan(pmarker, bmp)= destroyMarkerPlan pmarker; if (bmp == nil) then nil else ( let (getPluginInstanceName pmarker.EMP_inst) -> name in let _GETbitmapSize bmp -> [w h] in let if (w > h) then (itof h) /. (itof w) else (itof w) /. (itof h) -> ratio in let if (w > h) then [pmarker.EMP_fSize pmarker.EMP_fSize *. ratio] else [pmarker.EMP_fSize *. ratio pmarker.EMP_fSize] -> psize in let SO3MaterialCreate (V3DgetSession c3dXsession) (strcat name ".material") pmarker.EMP_sGroupName -> mat in let SO3TextureCreate (V3DgetSession c3dXsession) (strcat name ".texture") nil pmarker.EMP_sGroupName w h -> tex in let SO3PlaneCreate (V3DgetSession c3dXsession) pmarker.EMP_sGroupName name psize nil nil -> plane in ( set pmarker.EMP_tSize = [w h]; set pmarker.EMP_fRatio = ratio; set pmarker.EMP_plane = plane; set pmarker.EMP_material = mat; set pmarker.EMP_texture = tex; SO3ObjectSetCastShadows plane 0; SO3MaterialIsLighting mat 0; SO3MaterialSetTexture mat tex 0 0 0; SO3MaterialSetPassCullingEnable mat 0 0 0; SO3EntitySetMaterial plane mat 0; SO3TextureBlit tex bmp; let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0] else SO3ObjectGetGlobalPosition pmarker.EMP_parent -> pos in let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0 1.0] else SO3ObjectGetGlobalOrientation pmarker.EMP_parent -> quat in let if pmarker.EMP_bFlipXY then SO3MathsQuatAdd quat SO3MathsQuatAdd SO3MathsQuatAdd [0.0 1.0 0.0 0.0] [0.0 0.0 0.5 0.5] [(-.0.5) 0.0 0.0 0.5] else SO3MathsQuatAdd quat [0.0 1.0 0.0 0.0] -> quat in let if pmarker.EMP_markerType then quat else SO3MathsQuatAdd quat SO3MathsEulerXYZToQuat [(SO3MathsDegreeToRadian 90.0) 0.0 0.0] -> quat in ( SO3ObjectSetPosition pmarker.EMP_plane pos; SO3ObjectSetOrientation pmarker.EMP_plane quat; ); //turn 90° on X //SO3ObjectSetOrientation plane SO3MathsEulerXYZToQuat [(SO3MathsDegreeToRadian (-.180.0)) (SO3MathsDegreeToRadian 90.0) 0.0]; ); ); 0;; fun changeHelperState(state, pmarker)= if (!state) then ( updateMarkerPlan pmarker nil; 0; ) else if (pmarker.EMP_markerType == 0) then ( let _CRarMarker _channel pmarker.EMP_markerId 1.0 -> armarker in let _GETarMarkerBitmap _channel armarker 256 -> markerplanbmp in ( updateMarkerPlan pmarker markerplanbmp; _DSbitmap markerplanbmp; _DSarMarker armarker; ); 0; ) else ( let (G2DloadBmp _channel pmarker.EMP_sPath) -> bbmp in ( updateMarkerPlan pmarker bbmp; _DSbitmap bbmp; ); 0; ); 0;; fun cbEditorHelperState(inst, state, pmarker)= if (pmarker.EMP_bEdit) then nil else changeHelperState state pmarker; 0;; fun cbBtnPickObj(ctrlbtn, p)= let p -> [inst winstr viewstr ctrlobjname objname pmarker] in ( setEdCtrlButtonEnable ctrlbtn 0; dlgSelectPluginInstanceResource inst winstr iTypeGroup|iTypeEntity|iTypeNode|iTypeLight|iTypeCamera|iTypeParticle|iTypeBone|iTypeCubeMap objname mkfun3 @cbSelectObj [inst winstr viewstr ctrlobjname pmarker] mkfun1 @cbCloseRes ctrlbtn 0; ); 0;; fun cbMarkerSizeUpdate(ctrlstr, value, pmarker)= set pmarker.EMP_fSize = value; if (pmarker.EMP_plane == nil) then nil else ( SO3ObjectDestroy pmarker.EMP_plane; let (getPluginInstanceName pmarker.EMP_inst) -> name in let pmarker.EMP_tSize -> [w h] in let if (w > h) then [pmarker.EMP_fSize pmarker.EMP_fSize *. pmarker.EMP_fRatio] else [pmarker.EMP_fSize *. pmarker.EMP_fRatio pmarker.EMP_fSize] -> psize in set pmarker.EMP_plane = SO3PlaneCreate (V3DgetSession c3dXsession) pmarker.EMP_sGroupName name psize nil nil; SO3EntitySetMaterial pmarker.EMP_plane pmarker.EMP_material 0; SO3ObjectSetCastShadows pmarker.EMP_plane 0; let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0] else SO3ObjectGetGlobalPosition pmarker.EMP_parent -> pos in let if (pmarker.EMP_parent == nil) then [0.0 0.0 0.0 1.0] else SO3ObjectGetGlobalOrientation pmarker.EMP_parent -> quat in let if pmarker.EMP_bFlipXY then SO3MathsQuatAdd quat SO3MathsQuatAdd SO3MathsQuatAdd [0.0 1.0 0.0 0.0] [0.0 0.0 0.5 0.5] [(-.0.5) 0.0 0.0 0.5] else SO3MathsQuatAdd quat [0.0 1.0 0.0 0.0] -> quat in let if pmarker.EMP_markerType then quat else SO3MathsQuatAdd quat SO3MathsEulerXYZToQuat [(SO3MathsDegreeToRadian 90.0) 0.0 0.0] -> quat in ( SO3ObjectSetPosition pmarker.EMP_plane pos; SO3ObjectSetOrientation pmarker.EMP_plane quat; ); ); 0;; fun cbMarkerChange(ctrlstr, value, p)= let p -> [ctrlmarker pmarker] in let getEdCtrlBitmapBuffer ctrlmarker -> buffer in let _CRarMarker _channel (ftoi value) 1.0 -> armarker in let _GETarMarkerBitmap _channel armarker 64 -> markerbmp in let _GETarMarkerBitmap _channel armarker 256 -> markerplanbmp in ( set pmarker.EMP_markerType = 0; set pmarker.EMP_markerId = (ftoi value); updateMarkerPlan pmarker markerplanbmp; _SETbitmap buffer _GETbitmap markerbmp; _DSbitmap markerbmp; _DSbitmap markerplanbmp; _DSarMarker armarker; paintEdCtrlBitmap ctrlmarker; ); 0;; fun cbDlgSaveBitmap(dlg, p, wfile)= if (wfile == nil) then nil else let p -> [inst ctrlbtn winstr id] in let _CRarMarker _channel id 1.0 -> armarker in let _GETarMarkerBitmap _channel armarker 1024 -> markerbmp in ( _SAVEbitmap markerbmp wfile; _DSbitmap markerbmp; _DSarMarker armarker; ); 0;; fun cbBtnPickFile(ctrlbtn, p)= let p -> [inst winstr ctrlid] in let ftoi (getEdCtrlFloatValue ctrlid) -> id in ( setEdCtrlButtonEnable ctrlbtn 1; _DLGrflsave (_DLGSaveFile _channel winstr.EDW_win nil strcatn "marker_"::(itoa id)::".bmp"::nil "Bitmap\0*.bmp\0All\0*.*\0\0") @cbDlgSaveBitmap [inst ctrlbtn winstr id]; ); 0;; fun cbBtnCancelTrainning(btnstr, p)= let p -> [inst dlgwin pmarker] in ( _DSarMarker pmarker.EMP_marker; set pmarker.EMP_marker = nil; dsEdWindow dlgwin; ); 0;; fun cbCloseDlg(winstr, p)= let p -> [inst dlgwin pmarker] in ( _DSarMarker pmarker.EMP_marker; set pmarker.EMP_marker = nil; dsEdWindow dlgwin; ); 0;; fun cbTrainned(nftmarker, p, state)= let p -> [inst winstr dlgwin basepath pmarker] in ( if (!state) then ( _DSarMarker nftmarker; dsEdWindow dlgwin; _DLGMessageBox _channel winstr.EDW_win (loc "OS3DARMARKER_0006") (loc "OS3DARMARKER_0020") 0; 0; ) else ( if ((_SAVEarMarkerTrainnedData nftmarker _getmodifypack basepath) != nil) then nil else _DLGMessageBox _channel winstr.EDW_win (loc "OS3DARMARKER_0006") (loc "OS3DARMARKER_0020") 0; _DSarMarker nftmarker; dsEdWindow dlgwin; 0; ); set pmarker.EMP_marker = nil; ); 0;; fun cbDlgGetPath(pfile, p)= let p -> [inst ctrlbtn winstr ctrlpath ctrlid pickfilebtn ctrlmaxfeatures ctrlmarker pmarker] in ( if pfile == nil then nil else let _PtoScol pfile -> file in if file == nil then ( _DLGMessageBox _channel winstr.EDW_win (loc "OS3DARMARKER_0006") (loc "OS3DARMARKER_0016") 0; 0; ) else let getFilePathWithoutExt file -> basepath in let if (strfind "_marker.jpg" file 0) != nil then file else (strcatn basepath::"_marker"::".jpg"::nil) -> npath in let getFilePathWithoutExt npath -> basepath in ( let /*G2DstrechBitmapToMaxSize _channel */ (G2DloadBmp _channel file) /*640 480*/ -> bmp in if (bmp == nil) then nil else ( set pmarker.EMP_markerType = 1; set pmarker.EMP_sPath = npath; updateMarkerPlan pmarker bmp; _SAVEjpeg bmp _getmodifypack npath 95; _DSbitmap bmp; setEdCtrlTextLineValue ctrlpath npath; setEdCtrlButtonEnable pickfilebtn 0; setEdCtrlFloatEnable ctrlid 0; ); let G2DstrechBitmap _channel (G2DloadBmp _channel npath) 64 64 0xffffff -> bmp in if (bmp == nil) then nil else ( let getEdCtrlBitmapBuffer ctrlmarker -> buffer in _SETbitmap buffer _GETbitmap bmp; paintEdCtrlBitmap ctrlmarker; _DSbitmap bmp; ); _DSarMarker pmarker.EMP_marker; set pmarker.EMP_marker = nil; let ftoi getEdCtrlFloatValue ctrlmaxfeatures -> maxfeatures in let getEdWindowScreenPos winstr -> [px py] in let getEdWindowSize winstr -> [pw ph] in let crEdModalDialogWindow _channel winstr (px + 10) (py - 80) (pw - 20) 100 nil nil (loc "OS3DARMARKER_0021") -> dlgwin in let crEdCtrlText dlgwin 10 10 (pw - 40) 50 (loc "OS3DARMARKER_0022") ET_ALIGN_LEFT nil -> label in let crEdCtrlButton dlgwin ((pw - 20) / 2 - 40) 70 80 20 "Cancel" nil -> cancelbtn in let _CRarMarkerFromFileEx2 _channel (_checkpack npath) 1.0 maxfeatures @cbTrainned [inst winstr dlgwin basepath pmarker] -> nftmarker in ( set pmarker.EMP_marker = nftmarker; setEdwindowCbClose dlgwin mkfun2 @cbCloseDlg [inst dlgwin pmarker]; setEdCtrlButtonCb cancelbtn mkfun2 @cbBtnCancelTrainning [inst dlgwin pmarker]; ); 0; ); setEdCtrlButtonEnable ctrlbtn 1; ); 0;; fun cbBtnPickFile2(ctrlbtn, p)= let p -> [inst winstr ctrlpath ctrlid pickfilebtn ctrlmaxfeatures ctrlmarker pmarker] in let getEdCtrlTextLineValue ctrlpath -> path in let _GETdesktopSize -> [sw sh] in let getEdWindowPos mainInterf.MINT_winMain -> [nx ny] in let getEdWindowSize mainInterf.MINT_winMain -> [nmw nmh] in let [750 450] -> [iw ih] in let crEdOpenFileBitmapDialog _channel winstr nx + ((nmw / 2) - (iw / 2)) ny + ((nmh / 2) - (ih / 2)) iw ih "" ["Bitmaps" "bmp"::"jpg"::"png"::"tga"::nil]::["Bitmap" "bmp"::nil]::["Jpeg" "jpg"::nil]::["PNG" "png"::nil]::["Targa" "tga"::nil]::nil EDFILE_DIALOG_LIST_FOLDERS|EDFILE_DIALOG_SHOW_TOOLBAR nil path -> dlgfstr in ( setEdWindowIcon dlgfstr.EDFD_dialog sWinDlgIcon; setEdOpenFileDialogCb dlgfstr mkfun2 @cbDlgGetPath [inst ctrlbtn winstr ctrlpath ctrlid pickfilebtn ctrlmaxfeatures ctrlmarker pmarker]; setEdCtrlButtonEnable ctrlbtn 1; ); 0;; fun cbRefreshBtnBmp(pickbtn, p)= let p -> [inst winstr ctrlpath ctrlid pickfilebtn ctrlmarker pmarker] in ( setEdCtrlTextLineValue ctrlpath ""; setEdCtrlButtonEnable pickfilebtn 1; setEdCtrlFloatEnable ctrlid 1; let getEdCtrlFloatValue ctrlid -> id in cbMarkerChange ctrlid id [ctrlmarker pmarker]; ); 0;; fun cbRefreshBtnFile(pickbtn, ctrlobjname)= setEdCtrlTextLineValue ctrlobjname ""; 0;; fun cbInverAxis(ctrl, state, pmarker)= set pmarker.EMP_bFlipXY = state; 0;; fun cbSelSpace(ctrl, pos, elem, btn)= setEdCtrlButtonEnable btn if (pos == 3) then 1 else 0; 0;; fun loadParams(inst)= let (getPluginInstanceParam inst "object") -> objname in let atof (getPluginInstanceParam inst "msize") -> msize in let if (msize == nil) then 0.08 else msize -> msize in let atof (getPluginInstanceParam inst "id") -> id in let if id == nil then 0.0 else id -> id in let (getPluginInstanceParam inst "path") -> path in let atof (getPluginInstanceParam inst "maxfeatures") -> maxfeatures in let if maxfeatures == nil then 400.0 else maxfeatures -> maxfeatures in let atoi(getPluginInstanceParam inst "imode") -> imode in let if imode == nil then 2 else imode -> imode in let (getPluginInstanceParam inst "objRef") -> objref in let atoi (getPluginInstanceParam inst "enable") -> enable in let if enable == nil then 1 else enable -> enable in let atoi (getPluginInstanceParam inst "track") -> track in let if track == nil then 1 else track -> track in let atoi (getPluginInstanceParam inst "invertaxis") -> invertaxis in let if invertaxis == nil then 0 else invertaxis -> invertaxis in let atoi (getPluginInstanceParam inst "blittexture") -> blittexture in let if blittexture == nil then 0 else blittexture -> blittexture in let atoi (getPluginInstanceParam inst "matindex") -> matindex in let if matindex == nil then 0 else matindex -> matindex in [objname msize id path maxfeatures imode objref enable track invertaxis blittexture matindex];; fun dynamicedit(ewinstr, inst, viewstr, applybtn)= let [430 445] -> [iw ih] in let 10 -> ypos in ( setEdWindowSize ewinstr iw ih; let switch lMarkerPreview inst -> pmarker in let loadParams inst -> [objname msize id path maxfeatures imode objref enable track invertaxis blittexture matindex] in let crEdFrameWindow _channel ewinstr 0 0 iw 190 EDWIN_RESIZE_MW nil (loc "OS3DARMARKER_0008") (loc "OS3DARMARKER_0011") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 170 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 120 20 (loc "OS3DARMARKER_0007") nil -> labelid in let crEdCtrlFloat winstr 180 ypos 100 20 id 0.0 1022.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlid in let crEdCtrlBitmap winstr 290 ypos 64 64 nil 0 EDWIN_RESIZE_MW -> ctrlmarker in let crEdCtrlButton winstr 364 ypos 60 20 (loc "OS3DARMARKER_0015") nil -> pickfilebtn in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 50) + 2) 200 20 (loc "OS3DARMARKER_0014") nil -> labelfeatured in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DARMARKER_0010") nil -> labelmaxfeatures in let crEdCtrlFloat winstr 180 ypos 100 20 maxfeatures 10.0 100000.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlmaxfeatures in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DARMARKER_0001") nil -> labelbmp in let crEdCtrlTextLine winstr 180 ypos 140 20 path nil EDWIN_RESIZE_MW -> ctrlpath in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickbmpbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshbmp in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 35) + 2) 160 20 (loc "OS3DARMARKER_0009") nil -> labelmsize in let crEdCtrlFloat winstr 180 ypos 100 20 msize 0.0 1000000.0 0.01 3 nil EDWIN_RESIZE_MW -> ctrlmsize in let crEdCtrlLabel winstr 285 (ypos + 2) 140 20 (loc "OS3DARMARKER_0017") nil -> labelmsize2 in let crEdFrameWindow _channel ewinstr 0 0 iw 105 EDWIN_RESIZE_MW nil (loc "OS3DARMARKER_0013") (loc "OS3DARMARKER_0011") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 85 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 160 20 (loc "OS3DARMARKER_0012") nil -> labelobj in let crEdCtrlTextLine winstr 180 ypos 140 20 objname nil EDWIN_RESIZE_MW -> ctrlobjname in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshbtn in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DARMARKER_0023") nil -> labelcspace in let crEdCtrlSelect winstr 180 ypos 145 120 EDWIN_RESIZE_MW -> ctrlspace in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DARMARKER_0024") nil -> labelref in let crEdCtrlTextLine winstr 180 ypos 140 20 objref nil EDWIN_RESIZE_MW -> ctrlobjref in let crEdCtrlButton winstr 325 ypos 55 20 "..." nil -> pickrefbtn in let crEdCtrlButton winstr 385 ypos 35 20 "X" nil -> refreshobjrefname in let crEdFrameWindow _channel ewinstr 0 0 iw 150 EDWIN_RESIZE_MW nil (loc "OS3DARMARKER_0029") (loc "OS3DARMARKER_0011") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 130 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlCheck winstr 10 (set ypos = 10) (iw - 20) 20 (loc "OS3DARMARKER_0019") EDWIN_RESIZE_MW -> ctrlblittexture in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 160 20 (loc "OS3DARMARKER_0030") nil -> labelmatindex in let crEdCtrlFloat winstr 180 ypos 100 20 (itof matindex) 0.0 100.0 1.0 0 nil EDWIN_RESIZE_MW -> ctrlmatindex in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DARMARKER_0018") EDWIN_RESIZE_MW -> ctrlinvertaxis in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DARMARKER_0005") EDWIN_RESIZE_MW -> ctrlenable in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) (iw - 20) 20 (loc "OS3DARMARKER_0004") EDWIN_RESIZE_MW -> ctrltrack in ( set pmarker.EMP_bEdit = 1; setEdCtrlFloatCbChange ctrlid mkfun3 @cbMarkerChange [ctrlmarker pmarker]; setEdCtrlButtonCb pickfilebtn mkfun2 @cbBtnPickFile [inst ewinstr ctrlid]; setEdCtrlButtonCb pickbmpbtn mkfun2 @cbBtnPickFile2 [inst winstr ctrlpath ctrlid pickfilebtn ctrlmaxfeatures ctrlmarker pmarker]; setEdCtrlTextLineEnable ctrlpath 0; setEdCtrlButtonCb refreshbmp mkfun2 @cbRefreshBtnBmp [inst winstr ctrlpath ctrlid pickfilebtn ctrlmarker pmarker]; setEdCtrlButtonCb pickbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlobjname objname pmarker]; setEdCtrlTextLineEnable ctrlobjname 0; setEdCtrlButtonCb refreshbtn mkfun2 @cbRefreshBtnFile ctrlobjname; setEdCtrlButtonCb pickrefbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlobjref objref nil]; setEdCtrlTextLineEnable ctrlobjref 0; setEdCtrlButtonCb refreshobjrefname mkfun2 @cbRefreshBtnFile ctrlobjref; if (imode == 3) then nil else setEdCtrlButtonEnable pickrefbtn 0; fillEdCtrlSelect ctrlspace (loc "OS3DARMARKER_0025")::(loc "OS3DARMARKER_0026")::(loc "OS3DARMARKER_0027")::(loc "OS3DARMARKER_0028")::nil; selectEdCtrlSelectByPos ctrlspace imode; setEdCtrlSelectCb ctrlspace mkfun4 @cbSelSpace pickrefbtn; setEdCtrlFloatCbChange ctrlmsize mkfun3 @cbMarkerSizeUpdate pmarker; setEdCtrlCheckState ctrlenable enable; setEdCtrlCheckState ctrltrack track; setEdCtrlCheckState ctrlinvertaxis invertaxis; setEdCtrlCheckCbState ctrlinvertaxis mkfun3 @cbInverAxis pmarker; setEdCtrlCheckState ctrlblittexture blittexture; if (path == nil) || !(strlen path) then ( cbMarkerChange ctrlid id [ctrlmarker pmarker]; 0; ) else ( setEdCtrlButtonEnable pickfilebtn 0; setEdCtrlFloatEnable ctrlid 0; let (G2DloadBmp _channel path) -> bbmp in ( updateMarkerPlan pmarker bbmp; let G2DstrechBitmap _channel bbmp 64 64 0xffffff -> bmp in if (bmp == nil) then nil else ( let getEdCtrlBitmapBuffer ctrlmarker -> buffer in _SETbitmap buffer _GETbitmap bmp; paintEdCtrlBitmap ctrlmarker; _DSbitmap bmp; ); ); 0; ); [(mkfun1 @cbCloseEdit [ctrlobjname ctrlmsize ctrlid ctrlpath ctrlmaxfeatures ctrlobjref ctrlspace ctrlenable ctrltrack ctrlinvertaxis ctrlblittexture ctrlmatindex]) mkfun1 @cbDestroyEdit pmarker]; ); );; // stop play mode fun dynamicstop(inst)= let switch lMarkerPreview inst -> pmarker in ( set pmarker.EMP_bPLay = 0; changeHelperState (getPluginInstanceShowHelper inst) pmarker; ); 0;; // start play mode fun dynamicstart(inst)= let switch lMarkerPreview inst -> pmarker in ( set pmarker.EMP_bPLay = 1; if (pmarker.EMP_bEdit) then nil else destroyMarkerPlan pmarker; ); 0;; fun dynamicdelete(inst)= let switch lMarkerPreview inst -> pmarker in ( setPluginInstanceEditorCbPreRender pmarker.EMP_inst nil; _DSarMarker pmarker.EMP_marker; set pmarker.EMP_marker = nil; destroyMarkerPlan pmarker; SO3GroupDelete (V3DgetSession c3dXsession) pmarker.EMP_sGroupName; set lMarkerPreview = removeInstFromList lMarkerPreview inst; ); 0;; fun dynamicinit(inst)= let loadParams inst -> [objname msize id path maxfeatures imode objref enable track invertaxis blittexture matindex] in let strcat getPluginInstanceName inst "_Group" -> grpname in let SO3SceneGetObject (V3DgetSession c3dXsession) objname -> obj in let if (path == nil) || !(strlen path) then 0 else 1 -> mtype in let MkMarkerPreview [inst grpname nil mtype (ftoi id) path obj nil nil nil msize 1.0 invertaxis nil 0 0] -> pmarker in ( SO3GroupCreate (V3DgetSession c3dXsession) grpname; changeHelperState (getPluginInstanceShowHelper inst) pmarker; setPluginInstanceEditorCbHelperState inst mkfun3 @cbEditorHelperState pmarker; setPluginInstanceEditorCbPreRender inst mkfun4 @cbEditorPreRender pmarker; set lMarkerPreview = [inst pmarker]::lMarkerPreview; ); 0;;