/* ----------------------------------------------------------------------------- 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 DotLine = [ DT_Line : SO3_OBJECT, DT_iNumPoints : I, DT_lPoses : [[F F F] r1], DT_lHelpers : [SO3_OBJECT r1] ]mkDotLine;; struct ObjHandlerStr = [ OBJH_inst : PInstance, OBJH_father : SO3_OBJECT, OBJH_dlgstr : VUIDlg, OBJH_xFloatstr : VUIFloat, OBJH_yFloatstr : VUIFloat, OBJH_zFloatstr : VUIFloat, OBJH_initPos : [[F F F] [F F F F] [F F F]], OBJH_iMode : I, OBJH_dotLine : DotLine, OBJH_helperMat : SO3_MATERIAL, OBJH_endTimer : Timer, OBJH_lcolor : I, OBJH_bmoved : I, OBJH_brotated : I, OBJH_bscaled : I, OBJH_trmEvent : Timer, OBJH_bState : I, OBJH_iLastInputId : I ]mkObjHandlerStr;; fun destroyLine(obstr)= if (obstr.OBJH_endTimer == nil) then nil else ( _deltimer obstr.OBJH_endTimer; set obstr.OBJH_endTimer = nil; ); if (obstr.OBJH_trmEvent == nil) then nil else ( _deltimer obstr.OBJH_trmEvent; set obstr.OBJH_trmEvent = nil; ); SO3ObjectDestroy obstr.OBJH_dotLine.DT_Line; let sizelist obstr.OBJH_dotLine.DT_lHelpers -> size in let 0 -> i in while (i < size) do ( SO3ObjectDestroy nth_list obstr.OBJH_dotLine.DT_lHelpers i; set i = i + 1; ); set obstr.OBJH_dotLine = nil; setPluginInstanceCbInputClick obstr.OBJH_inst nil; setPluginInstanceCbPreRender obstr.OBJH_inst nil; 0;; fun updateAllHelpers(obstr)= let 50.0 -> scalecoef in let V3DgetSessionView c3dXsession -> viewstr in let V3DgetDefaultViewport viewstr -> viewportstr in let V3DgetViewportSize viewstr viewportstr -> [_ _ _ vh] in let if (vh <= 0) then 1 else if (viewstr.V3D_bVRmode) then iVUIBASEVRHEIGHT else vh -> vh in let V3DgetViewportCamera viewportstr -> cam in let V3DgetOrthographicMode cam -> ortho in let SO3ObjectGetGlobalPosition cam -> campos in let SO3ObjectGetGlobalOrientation cam -> camquat in let if ortho then V3DgetOrthographicScale cam else 0.0 -> cscale in let SO3CameraGetFOVy cam -> fovy in let if ((fovy <=. 0.0) || ortho) then 1.0 else fovy -> fovy in let obstr.OBJH_dotLine -> linestr in let sizelist linestr.DT_lHelpers -> size in let 0 -> i in ( while (i < size) do ( let nth_list linestr.DT_lHelpers i -> helper in let if (cscale != 0.0) then cscale *. scalecoef else if (viewstr.V3D_bVRmode) then (getVectorDistanceF campos (SO3ObjectGetGlobalPosition helper)) *. scalecoef *. 0.5 else let normalizeVectorF (SO3MathsQuatGetDirection camquat [0.0 0.0 (-.1.0)]) -> dir in (dotVectorF (subVectorF (SO3ObjectGetGlobalPosition helper) campos) dir) *. scalecoef -> dist in let maxf 0.000001 ((dist /. ((itof vh) /. 2.0)) *. fovy) /. 2.0 -> nscale in let if (viewstr.V3D_bVRmode) then nscale *. 1.5 else nscale -> nscale in ( SO3ObjectSetScale helper [nscale nscale nscale]; ); set i = i + 1; ); ); 0;; fun updateHandleEvents(trm, obstr)= _deltimer obstr.OBJH_trmEvent; set obstr.OBJH_trmEvent = nil; if (!obstr.OBJH_bmoved && !obstr.OBJH_brotated) then nil else ( let SO3ObjectGetPosition obstr.OBJH_father -> [opx opy opz] in let SO3ObjectGetOrientation obstr.OBJH_father -> quat in let SO3MathsQuatToEulerYXZ quat -> [x y z] in SendPluginEvent obstr.OBJH_inst "Coords" strcatnSep (ftoa opx)::(ftoa opy)::(ftoa opz)::"\n"::(ftoa (SO3MathsRadianToDegree x))::(ftoa (SO3MathsRadianToDegree y))::(ftoa (SO3MathsRadianToDegree z))::nil " " nil; ); if (!obstr.OBJH_bmoved) then nil else ( let SO3ObjectGetPosition obstr.OBJH_father -> [opx opy opz] in SendPluginEvent obstr.OBJH_inst "Moved" strcatnSep (ftoa opx)::(ftoa opy)::(ftoa opz)::nil " " nil; set obstr.OBJH_bmoved = 0; ); if (!obstr.OBJH_brotated) then nil else ( let SO3ObjectGetOrientation obstr.OBJH_father -> quat in let SO3MathsQuatToEulerYXZ quat -> [x y z] in SendPluginEvent obstr.OBJH_inst "Rotated" strcatnSep (ftoa (SO3MathsRadianToDegree x))::(ftoa (SO3MathsRadianToDegree y))::(ftoa (SO3MathsRadianToDegree z))::nil " " nil; set obstr.OBJH_brotated = 0; ); if (!obstr.OBJH_bscaled) then nil else ( let SO3ObjectGetScale obstr.OBJH_father -> [sx sy sz] in SendPluginEvent obstr.OBJH_inst "Scaled" strcatnSep (ftoa sx)::(ftoa sy)::(ftoa sz)::nil " " nil; set obstr.OBJH_bscaled = 0; ); 0;; fun cbPreRender(inst, viewstr, obstr)= if (obstr.OBJH_father == nil) then nil else ( let V3DgetLastMouseData viewstr obstr.OBJH_iLastInputId -> [_ _ obj _ _ _ dvec _ _] in let SO3ObjectGetFlags obj -> obflag in if ((obj == nil) || (dvec == nil) || (obflag & iNodeFlagController) || (obflag & iNodeFlagVUI) || (obflag & iNodeFlagTools) || (obstr.OBJH_dotLine == nil) || (dvec == nil)) then nil else // point following mouse update ( if (!obstr.OBJH_dotLine.DT_iNumPoints) || (obstr.OBJH_dotLine.DT_iNumPoints >= 3) then nil else SO3LineEntitySetPoint obstr.OBJH_dotLine.DT_Line nil dvec; ); //all position update updateAllHelpers obstr; ); 0;; fun setBodiesEnableState(l, state, sons)= if l == nil then nil else let hd l -> obj in let SO3SceneNodeGetBody obj -> body in ( if (!sons) then nil else setBodiesEnableState (SO3ObjectGetChildren obj) state sons; if (body == nil) then nil else ( SO3BodySetGravityEnable body state; SO3BodySetIgnoreCollision body !state; SO3BodySetVelocity body [0.0 0.0 0.0]; SO3BodySetOmega body [0.0 0.0 0.0]; SO3BodySetFreeze body 1; ); setBodiesEnableState (tl l) state sons; ); 0;; fun cbHandlerAxisMove(sessionstr, axisstr, axis, x, y, btn, coef, obstr)= let axisstr.V3D_axisFather -> obj in let V3DgetSessionView c3dXsession -> viewstr in let if (axisstr.V3D_iAxisRef == 0) then SO3_LOCAL_TS else if (axisstr.V3D_iAxisRef == 1) then SO3_WORLD_TS else SO3_LOCAL_TS -> rep in ( if (btn & 1) && (obstr.OBJH_iMode == 1) then ( let if axis == V3DAXIS_X then [coef 0.0 0.0] else if axis == V3DAXIS_Y then [0.0 coef 0.0] else if axis == V3DAXIS_Z then [0.0 0.0 coef] else nil -> trans in let if (rep == SO3_LOCAL_TS) then SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation obj) trans else trans -> trans in SO3ObjectTranslate obj trans SO3_WORLD_TS; set obstr.OBJH_bmoved = 1; 0; ) else if (btn & 1) && (obstr.OBJH_iMode == 2) then ( if axis == V3DAXIS_X then SO3ObjectRotatePitch obj (SO3MathsDegreeToRadian (itof y + x)) rep else if axis == V3DAXIS_Y then SO3ObjectRotateYaw obj (SO3MathsDegreeToRadian (itof y + x)) rep else if axis == V3DAXIS_Z then SO3ObjectRotateRoll obj (SO3MathsDegreeToRadian (itof y + x)) rep else nil; set obstr.OBJH_brotated = 1; 0; ) else if (btn & 1) && (obstr.OBJH_iMode == 3) then ( if ((SO3ObjectGetType obj) == SO3_TYPE_CAMERA) then nil else ( let SO3ObjectGetGlobalOrientation obj -> gquat in let SO3ObjectGetGlobalScale obj -> cscale in let if (axisstr.V3D_iAxisRef == 0) || ((_keybdstate &4) || (axis == V3DAXIS_H)) then cscale else SO3MathsQuatGetDirection gquat cscale -> [csx csy csz] in let axisstr.V3D_tAxisClickPRS -> [_ _ [bsc bsy bsz]] in let [(coef *. (bsc *. (itof iGlobalUnit))) (coef *. (bsy *. (itof iGlobalUnit))) (coef *. (bsz *. (itof iGlobalUnit)))] -> [coefx coefy coefz] in let if ((_keybdstate &4) || (axis == V3DAXIS_H)) then //alt [(csx +. coefx) (csy +. coefy) (csz +. coefz)] else if axis == V3DAXIS_X then [(csx +. coefx) csy csz] else if axis == V3DAXIS_Y then [csx (csy +. coefy) csz] else if axis == V3DAXIS_Z then [csx csy (csz +. coefz)] else nil -> [nsx nsy nsz] in let if (axisstr.V3D_iAxisRef == 0) || ((_keybdstate &4) || (axis == V3DAXIS_H)) then [nsx nsy nsz] else SO3MathsQuatGetDirection (quatInverse gquat) [nsx nsy nsz] -> [nsx nsy nsz] in let [(if (nsx <=. 0.000001) then 0.00001 else nsx) (if (nsy <=. 0.00001) then 0.00001 else nsy) (if (nsz <=. 0.00001) then 0.00001 else nsz)] -> scale in SO3ObjectSetGlobalScale obj scale; ); set obstr.OBJH_bscaled = 1; 0; ) else nil; if (obstr.OBJH_trmEvent != nil) then nil else set obstr.OBJH_trmEvent = _rfltimer _starttimer _channel 200 @updateHandleEvents obstr; //Update coords if (obstr.OBJH_dlgstr == nil) then nil else let if (obstr.OBJH_iMode == 2) then let SO3MathsQuatToEulerYXZ (SO3ObjectGetGlobalOrientation obstr.OBJH_father) -> [ax ay az] in [(SO3MathsRadianToDegree ax) (SO3MathsRadianToDegree ay) (SO3MathsRadianToDegree az)] else if (obstr.OBJH_iMode == 3) then SO3ObjectGetGlobalScale obstr.OBJH_father else SO3ObjectGetGlobalPosition obstr.OBJH_father -> [x y z] in ( VUIsetFloatValue obstr.OBJH_xFloatstr x; VUIsetFloatValue obstr.OBJH_yFloatstr y; VUIsetFloatValue obstr.OBJH_zFloatstr z; ); ); 0;; fun cbHandlerAxisUnClick(sessionstr, obj, axis, x, y, btn, obstr)= setBodiesEnableState obstr.OBJH_father::nil 1 1; 0;; fun cbHandlerAxisClick(axisstr, sessionstr, obj, axis, x, y, btn, obstr)= let V3DgetSessionView c3dXsession -> viewstr in ( setBodiesEnableState obstr.OBJH_father::nil 0 1; V3DsetCbAxisMove axisstr mkfun8 @cbHandlerAxisMove obstr; V3DsetCbAxisUnClick axisstr mkfun7 @cbHandlerAxisUnClick obstr; ); 0;; fun cbEnable(inst, from, action, param, rep, obstr)= let V3DgetSessionView c3dXsession -> viewstr in V3DsetCbAxisClick (V3DshowObjectAxis viewstr c3dXsession obstr.OBJH_father obstr.OBJH_iMode 1) mkfun8 @cbHandlerAxisClick obstr; set obstr.OBJH_bState = 1; 0;; fun cbDisable(inst, from, action, param, rep, obstr)= let V3DgetSessionView c3dXsession -> viewstr in V3DshowObjectAxis viewstr c3dXsession obstr.OBJH_father 1 0; destroyLine obstr; set obstr.OBJH_bState = 0; 0;; fun cbSetHandlerMode(inst, from, action, param, rep, obstr, mode)= let V3DgetSessionView c3dXsession -> viewstr in ( destroyLine obstr; if (!obstr.OBJH_bState) then nil else V3DshowObjectAxis viewstr c3dXsession obstr.OBJH_father obstr.OBJH_iMode 0; set obstr.OBJH_iMode = mode; if (!obstr.OBJH_bState) then nil else V3DsetCbAxisClick (V3DshowObjectAxis viewstr c3dXsession obstr.OBJH_father obstr.OBJH_iMode 1) mkfun8 @cbHandlerAxisClick obstr; VUIdestroyDialogBox obstr.OBJH_dlgstr; set obstr.OBJH_dlgstr = nil; set obstr.OBJH_xFloatstr = nil; set obstr.OBJH_yFloatstr = nil; set obstr.OBJH_zFloatstr = nil; ); 0;; fun addHelper(obstr, linestr, pos)= let getPluginInstanceName obstr.OBJH_inst -> iname in let strcatn iname::".helper_"::(itoa sizelist linestr.DT_lHelpers)::nil -> helperName in let SO3OctahedronCreate (V3DgetSession c3dXsession) iname helperName 0.14 0.1 0.1 -> helper in ( SO3ObjectSetCastShadows helper 0; SO3ObjectSetMouseClick helper 0; SO3EntitySetMaterial helper obstr.OBJH_helperMat 0; SO3ObjectSetPosition helper pos; set linestr.DT_lHelpers = helper::linestr.DT_lHelpers; ); 0;; fun cbCleanLineTimer(trm, obstr)= destroyLine obstr; 0;; fun addPoint(obstr, linestr, pos)= if vectorEqualF pos hd linestr.DT_lPoses then nil else ( set linestr.DT_lPoses = pos::linestr.DT_lPoses; set linestr.DT_iNumPoints = sizelist linestr.DT_lPoses; if (linestr.DT_iNumPoints >= 3) then ( if (linestr.DT_iNumPoints > 3) then nil else ( addHelper obstr linestr pos; SO3LineEntityAddPoint linestr.DT_Line nil nth_list linestr.DT_lPoses 2; //compute position and orientation let linestr.DT_lPoses -> [p1 [p2 [p3 _]]] in let divideVectorF (addVectorF (addVectorF p1 p2) p3) [3.0 3.0 3.0] -> pos in let normalizeVectorF crossVectorF (subVectorF p2 p1) (subVectorF p3 p1) -> vdir in let SO3MathsGetRotationTo [0.0 0.0 (-.1.0)] vdir -> quat in ( SO3ObjectSetGlobalOrientation obstr.OBJH_father quat; SO3ObjectSetGlobalPosition obstr.OBJH_father pos; let pos -> [opx opy opz] in SendPluginEvent obstr.OBJH_inst "Moved" strcatnSep (ftoa opx)::(ftoa opy)::(ftoa opz)::nil " " nil; let SO3MathsQuatToEulerYXZ quat -> [x y z] in SendPluginEvent obstr.OBJH_inst "Rotated" strcatnSep (ftoa (SO3MathsRadianToDegree x))::(ftoa (SO3MathsRadianToDegree y))::(ftoa (SO3MathsRadianToDegree z))::nil " " nil; if (obstr.OBJH_endTimer == nil) then nil else ( _deltimer obstr.OBJH_endTimer; set obstr.OBJH_endTimer = nil; ); set obstr.OBJH_endTimer = _rfltimer _starttimer _channel 1000 @cbCleanLineTimer obstr; ); ); 0; ) else ( if (linestr.DT_Line == nil) then ( let getPluginInstanceName obstr.OBJH_inst -> instname in set linestr.DT_Line = SO3LineEntityCreateEx (V3DgetSession c3dXsession) strcat instname "_3point" pos::linestr.DT_lPoses G2Drgb2rgba obstr.OBJH_lcolor 128 1; 0; ) else SO3LineEntityAddPoint linestr.DT_Line nil pos; addHelper obstr linestr pos; ); ); 0;; fun cbInputClick(inst, viewstr, id, x, y, btn, pdata, obstr)= let pdata -> [obj _ _ dvec _ _] in if ((btn == 1) && (dvec != nil)) then //leftClick ( let SO3ObjectGetFlags obj -> obflag in if ((obj == nil) || (dvec == nil) || (obflag & iNodeFlagController) || (obflag & iNodeFlagVUI) || (obflag & iNodeFlagTools)) then nil else ( if (obstr.OBJH_dotLine != nil) then nil else ( set obstr.OBJH_dotLine = mkDotLine [nil 0 nil nil]; 0; ); addPoint obstr obstr.OBJH_dotLine dvec; set obstr.OBJH_iLastInputId = id; ); 0; ) else if ((btn == 2) && (obstr.OBJH_dotLine != nil) && (id == obstr.OBJH_iLastInputId)) then //RightClick ( destroyLine obstr; 0; ) else nil; 0;; fun cbSetThreePoints(inst, from, action, param, rep, obstr)= setPluginInstanceCbInputClick inst mkfun8 @cbInputClick obstr; setPluginInstanceCbPreRender inst mkfun3 @cbPreRender obstr; 0;; fun cbSetObject(inst, from, action, param, rep, obstr)= let c3dXsession -> sessionstr in let V3DgetSessionView sessionstr -> viewstr in let V3DgetObjectByName sessionstr param -> obj in if (obj == nil || V3DisAxis sessionstr obj) then nil else ( let SO3ObjectGetPosition obj -> cpos in let SO3ObjectGetOrientation obj -> cquat in let SO3ObjectGetScale obj -> cscale in ( if (!obstr.OBJH_bState) then nil else V3DshowObjectAxis viewstr sessionstr obstr.OBJH_father obstr.OBJH_iMode 0; set obstr.OBJH_father = obj; set obstr.OBJH_initPos = [cpos cquat cscale]; if (!obstr.OBJH_bState) then nil else V3DsetCbAxisClick (V3DshowObjectAxis viewstr sessionstr obstr.OBJH_father obstr.OBJH_iMode 1) mkfun8 @cbHandlerAxisClick obstr; ); //Update coords if (obstr.OBJH_dlgstr == nil) then nil else let if (obstr.OBJH_iMode == 2) then let SO3MathsQuatToEulerYXZ (SO3ObjectGetGlobalOrientation obstr.OBJH_father) -> [ax ay az] in [(SO3MathsRadianToDegree ax) (SO3MathsRadianToDegree ay) (SO3MathsRadianToDegree az)] else if (obstr.OBJH_iMode == 3) then SO3ObjectGetGlobalScale obstr.OBJH_father else SO3ObjectGetGlobalPosition obstr.OBJH_father -> [x y z] in ( VUIsetFloatValue obstr.OBJH_xFloatstr x; VUIsetFloatValue obstr.OBJH_yFloatstr y; VUIsetFloatValue obstr.OBJH_zFloatstr z; ); ); 0;; fun deleteOb(inst, obstr)= setPluginInstanceCbScenePreRender2 inst nil; VUIdestroyDialogBox obstr.OBJH_dlgstr; destroyLine obstr; let V3DgetSessionView c3dXsession -> viewstr in V3DshowObjectAxis viewstr c3dXsession obstr.OBJH_father 1 0; let obstr.OBJH_initPos -> [pos quat scale] in ( SO3ObjectSetPosition obstr.OBJH_father pos; SO3ObjectSetOrientation obstr.OBJH_father quat; SO3ObjectSetScale obstr.OBJH_father scale; ); SO3MaterialDestroy obstr.OBJH_helperMat; SO3GroupDelete (V3DgetSession c3dXsession) getPluginInstanceName inst; 0;; fun getAlign(param)= let [1 1] -> align in let [0.0 0.0] -> pos in let strextr param -> lp in let hd lp -> lp in let 0 -> nb in ( while ((lp != nil) && (nb < 2)) do ( let hd lp -> flag in if (!strcmpi flag "top") then ( mutate align <- [_ 0]; mutate pos <- [_ 10.0]; ) else if (!strcmpi flag "bottom") then ( mutate align <- [_ 2]; mutate pos <- [_ 10.0]; ) else if (!strcmpi flag "left") then ( mutate align <- [0 _]; mutate pos <- [10.0 _]; ) else if (!strcmpi flag "right") then ( mutate align <- [2 _]; mutate pos <- [10.0 _]; ) else nil; set lp = tl lp; set nb = nb + 1; ); [pos align]; );; fun cbClickDlg(dlgstr, state, obstr)= set obstr.OBJH_dlgstr = nil; set obstr.OBJH_xFloatstr = nil; set obstr.OBJH_yFloatstr = nil; set obstr.OBJH_zFloatstr = nil; //SendPluginEvent obstr.OBJH_instance "Click Ok" nil nil; 0;; fun cbChangeValue(floatstr, coef, state, p)= let p -> [obstr xfloatstr yfloatstr zfloatstr] in let V3DgetSessionView c3dXsession -> viewstr in let SO3_LOCAL_TS -> rep in let obstr.OBJH_father -> obj in ( if (obstr.OBJH_iMode == 1) then ( let VUIgetFloatValue xfloatstr -> ox in let VUIgetFloatValue yfloatstr -> oy in let VUIgetFloatValue zfloatstr -> oz in SO3ObjectSetGlobalPosition obj [ox oy oz]; set obstr.OBJH_bmoved = 1; 0; ) else if (obstr.OBJH_iMode == 2) then ( let SO3MathsDegreeToRadian (VUIgetFloatValue xfloatstr) -> ox in let SO3MathsDegreeToRadian (VUIgetFloatValue yfloatstr) -> oy in let SO3MathsDegreeToRadian (VUIgetFloatValue zfloatstr) -> oz in SO3ObjectSetGlobalOrientation obj (SO3MathsEulerYXZToQuat [ox oy oz]); set obstr.OBJH_brotated = 1; 0; ) else if (obstr.OBJH_iMode == 3) then ( if ((SO3ObjectGetType obj) == SO3_TYPE_CAMERA) then nil else let VUIgetFloatValue xfloatstr -> ox in let VUIgetFloatValue yfloatstr -> oy in let VUIgetFloatValue zfloatstr -> oz in SO3ObjectSetGlobalScale obj [ox oy oz]; set obstr.OBJH_bscaled = 1; 0; ) else nil; if (obstr.OBJH_trmEvent != nil) then nil else set obstr.OBJH_trmEvent = _rfltimer _starttimer _channel 200 @updateHandleEvents obstr; ); 0;; fun cbShowInterface(inst, from, action, param, reply, obstr)= if (obstr.OBJH_dlgstr == nil) then nil else VUIdestroyDialogBox obstr.OBJH_dlgstr; if (obstr.OBJH_father == nil) then nil else ( let V3DgetSessionView c3dXsession -> viewstr in let if (obstr.OBJH_iMode == 2) then let SO3MathsQuatToEulerYXZ (SO3ObjectGetGlobalOrientation obstr.OBJH_father) -> [ax ay az] in [(loc "OS3DOBJHANDLER_C0002") (-.360.0) 360.0 1.0 [(SO3MathsRadianToDegree ax) (SO3MathsRadianToDegree ay) (SO3MathsRadianToDegree az)]] else if (obstr.OBJH_iMode == 3) then let SO3ObjectGetGlobalScale obstr.OBJH_father -> vec in [(loc "OS3DOBJHANDLER_C0003") 0.0001 100000.0 0.1 vec] else let SO3ObjectGetGlobalPosition obstr.OBJH_father -> vec in [(loc "OS3DOBJHANDLER_C0001") (-.10000000.0) 10000000.0 0.1 vec] -> [stitle vmin vmax inc [x y z]] in let VUIcreateDialogExt (V3DgetSessionView c3dXsession) inst.INST_groupstr.GRP_project.PRJ_vuiGroup [350 145] stitle (loc "OS3DOBJHANDLER_C0004") nil 95 (V3DgetVrMode viewstr) (mkfun3 @cbClickDlg obstr) "dialogBox" -> dlgstr in let VUIgetDialogFrame dlgstr -> framestr in let VUIgetElementContainer framestr -> contstr in let VUIgetThemeDef (getThemeFromInstance inst) "dialogBox" -> defstr in let VUIgetThemeFont defstr "label" -> lbfontstr in let VUIcreateFrame contstr framestr [0.0 10.0] [30.0 0.0] [0 0 0 0 0 0 0 0] [0 0] -> lx in let VUIcreateFrame contstr framestr [0.0 50.0] [30.0 0.0] [0 0 0 0 0 0 0 0] [0 0] -> ly in let VUIcreateFrame contstr framestr [0.0 90.0] [30.0 0.0] [0 0 0 0 0 0 0 0] [0 0] -> lz in let VUIcreateFloat contstr framestr [30.0 10.0] [100.0 35.0] [0 0 1 0 0 0 (-50) 0] [1 0] [5 5] vmin vmax inc 4 x -> xfloatstr in let VUIcreateFloat contstr framestr [30.0 50.0] [100.0 35.0] [0 0 1 0 0 0 (-50) 0] [1 0] [5 5] vmin vmax inc 4 y -> yfloatstr in let VUIcreateFloat contstr framestr [30.0 90.0] [100.0 35.0] [0 0 1 0 0 0 (-50) 0] [1 0] [5 5] vmin vmax inc 4 z -> zfloatstr in ( VUIsetElementText ly lbfontstr (loc "OS3DOBJHANDLER_C0006") [0 0] [0 0] [5 5] iVUITEXT_HALIGNLEFT|iVUITEXT_VALIGNTOP VUI_TextAutoHeight 1; VUIsetElementText lx lbfontstr (loc "OS3DOBJHANDLER_C0005") [0 0] [0 0] [5 5] iVUITEXT_HALIGNLEFT|iVUITEXT_VALIGNTOP VUI_TextAutoHeight 1; VUIsetElementText lz lbfontstr (loc "OS3DOBJHANDLER_C0007") [0 0] [0 0] [5 5] iVUITEXT_HALIGNLEFT|iVUITEXT_VALIGNTOP VUI_TextAutoHeight 1; VUIsetFloatCbChange xfloatstr mkfun4 @cbChangeValue [obstr xfloatstr yfloatstr zfloatstr]; VUIsetFloatCbChange yfloatstr mkfun4 @cbChangeValue [obstr xfloatstr yfloatstr zfloatstr]; VUIsetFloatCbChange zfloatstr mkfun4 @cbChangeValue [obstr xfloatstr yfloatstr zfloatstr]; if (!strcmp "" (strtrim param)) || param == nil then nil else let getAlign param -> [pos align] in VUIsetContainerPos contstr pos align nil; set obstr.OBJH_xFloatstr = xfloatstr; set obstr.OBJH_yFloatstr = yfloatstr; set obstr.OBJH_zFloatstr = zfloatstr; set obstr.OBJH_dlgstr = dlgstr; VUIsetContainerClear contstr 0; VUIshowDialog dlgstr 1; ); //SendPluginEvent inst "Shown" nil nil; ); 0;; fun newOb(inst)= let (getPluginInstanceParam inst "object") -> objname in let atoi (getPluginInstanceParam inst "init") -> init in let if init == nil then 1 else init -> init in let atoi (getPluginInstanceParam inst "mode") -> mode in let if mode == nil then 1 else mode -> mode in let V3DgetObjectByName c3dXsession objname -> obj in let SO3ObjectGetPosition obj -> cpos in let SO3ObjectGetOrientation obj -> cquat in let SO3ObjectGetScale obj -> cscale in let make_rgb 255 0 0 -> lcolor in let mkObjHandlerStr [inst obj nil nil nil nil [cpos cquat cscale] mode nil nil nil lcolor 0 0 0 nil init 0] -> obstr in let getPluginInstanceName inst -> iname in ( SO3GroupCreate (V3DgetSession c3dXsession) iname; let SO3MaterialCreate (V3DgetSession c3dXsession) (strcat iname ".material") iname -> mat in ( set obstr.OBJH_helperMat = mat; SO3MaterialSetReceiveShadows mat 0; SO3MaterialSetIgnoreSlicePlane mat 1; SO3MaterialSetAmbient mat (G2Drgb2rgba obstr.OBJH_lcolor 128); SO3MaterialSetDiffuse mat (G2Drgb2rgba obstr.OBJH_lcolor 128); SO3MaterialSetSpecular mat (G2Drgb2rgba obstr.OBJH_lcolor 128); SO3MaterialSetSelfIllumination mat (G2Drgb2rgba obstr.OBJH_lcolor 128); SO3MaterialSetPassDepthFunction mat 0 0 SO3_COMPARE_FUNCTION_ALWAYS_PASS; SO3MaterialSetShininess mat 128.0; ); if (!init || (obj == nil)) then nil else cbEnable inst nil nil nil nil obstr; PluginRegisterAction inst "Enable" mkfun6 @cbEnable obstr; PluginRegisterAction inst "Disable" mkfun6 @cbDisable obstr; PluginRegisterAction inst "Set translation mode" mkfun6 mkfun7 @cbSetHandlerMode 1 obstr; PluginRegisterAction inst "Set orientation mode" mkfun6 mkfun7 @cbSetHandlerMode 2 obstr; PluginRegisterAction inst "Set scale mode" mkfun6 mkfun7 @cbSetHandlerMode 3 obstr; PluginRegisterAction inst "Set a 3 points pos" mkfun6 @cbSetThreePoints obstr; PluginRegisterAction inst "Set source object" mkfun6 @cbSetObject obstr; PluginRegisterAction inst "Open interface" mkfun6 @cbShowInterface obstr; setPluginInstanceCbDel inst mkfun2 @deleteOb obstr; ); 0;; fun IniPlug(file)= PlugRegister @newOb nil; setPluginEditor @dynamicedit; 0;;