Entraides et échanges autour de la technologie Scol - Informations and exchanges on the Scol technology
Vous pouvez changer la langue de l'interface une fois inscrit - You can change the language once registered
You are not logged in.
Pages: 1
colleagues:
I`m encountering a crash (scol.exe has stopped working window, os3d editor quits without indicating any error in the editor log window with the my modified plugit on its cbresize callback. perhaps I am casting from one basic type to another and the compiler is not detecting the illegal cast? is
app data>local>scol voyager > logs the only place to look for an eror
the crash is happening with the cbresize callback. all I am doing is setting some struct I (interger) fields to the new ones following computePosSize.
I'm pretty sure my code is to blame but I don't knno where to look.
(I tested the original cbutton with the same configuration no crash there)
Last edited by hebdemnobad (26-Nov-2014 15:06:05)
Offline
What changes did you make ?
I added some fields to the button struct, put in some if then tests to prevent multiple fingers from controlling button (it allows only one control), along with creating and destroying the touchpoint widget i add when only one finger is contacting the button.
something is making the button height and width radically increase if and only if percentages are being used instead of pixel height and width...the increase happens in the computepossize function, even though i cannot find anything multiplying the button width and height fields.
Last edited by hebdemnobad (26-Nov-2014 16:33:22)
Offline
here is the client code fwiw:
/*
-----------------------------------------------------------------------------
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 later153
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
-----------------------------------------------------------------------------
*/
/*******************************************************************************
Version: 1.0
Author: Bastien BOURINEAU
Date: 10/07/2012
Warning: loading too much bitmaps at start can take long and use uncessary large amount of memory
*******************************************************************************/
struct PlugButton = [
PBTN_instance : PInstance,
PBTN_bOnMaterial : I,
PBTN_Material : SO3_MATERIAL,
PBTN_iTechnique : I,
PBTN_iPass : I,
PBTN_iTexture : I,
PBTN_win : SO3_WIDGET,
PBTN_AlphaBuffer : AlphaBitmap,
PBTN_throttle_handle_widget : SO3_WIDGET,
PBTN_throttle_handle_image : AlphaBitmap,
PBTN_iPosX : I,
PBTN_iPosY : I,
PBTN_iRight_Margin : I,
PBTN_iBottom_Margin : I,
PBTN_iToggleID : I,
PBTN_iWidth : I,
PBTN_iHeight : I,
PBTN_iXcenter : I,
PBTN_iYcenter : I,
PBTN_tPercent : [I I I I I I I I],
PBTN_tAlign : [I I],
PBTN_bTransparency : I,
PBTN_iOpacity : I,
PBTN_iTransition : I,
PBTN_fTransOpacity : F,
PBTN_font : ObjFont,
PBTN_sLabel : S,
PBTN_ifColor : I,
PBTN_bUrl : I,
PBTN_sPath : S,
PBTN_iClick : I,
PBTN_bLastCursor : I,
PBTN_bShowCursor : I,
PBTN_bEnableMouse : I,
PBTN_bShow : I,
PBTN_iAvStates : I,
PBTN_iState : I,
PBTN_iNbFrames : I,
PBTN_iCurFrame : I,
PBTN_iTick : I,
PBTN_iLastInputState : I,
PBTN_tLastPos : [I I],
PBTN_lInputs : [[S [I I]] r1],
PBTN_trmMouseState : Timer, // to enable the mouse after touch manipulation
PBTN_listfull : I,
PBTN_widgetcreated : I,
PBTN_httpReq : ObjCURL
] MkPlugButton;;
var sTmpDownloadPath = "tmp/buttons/";;
var iTexWidth = 512;;
var iTexHeight = 512;;
var sHandCursor = "os3dlib/res/link_cursor.bmp";;
typeof cHandCursor = ObjCursor;;
typeof cPrevCursor = ObjCursor;;
fun restoreTexture(btnstr)=
V3DremoveWidgetControl (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) btnstr.PBTN_win;
SO3WidgetDestroy btnstr.PBTN_win;
set btnstr.PBTN_win = nil;
_DSalphaBitmap btnstr.PBTN_AlphaBuffer;
set btnstr.PBTN_AlphaBuffer = nil;
if (!btnstr.PBTN_bShowCursor || !btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible (V3DgetSessionView c3dXsession))) then nil else
(
V3DsetCursor (V3DgetSessionView c3dXsession) cPrevCursor;
set btnstr.PBTN_bLastCursor = 0;
set cPrevCursor = nil;
);
0;;
fun drawLabel(abmp, btnstr)=
let _GETalphaBitmaps abmp -> [bmp bmp8] in
let _GETbitmapSize bmp -> [bw bh] in
let G2DgetStringSize btnstr.PBTN_font btnstr.PBTN_sLabel -> [_ th] in
(
_DRAWtext bmp btnstr.PBTN_font (bw / 2) ((bh / 2) - (th / 2)) TD_CENTER btnstr.PBTN_ifColor btnstr.PBTN_sLabel;
//_DRAWtext8 bmp8 btnstr.PBTN_font (bw / 2) ((bh / 2) - (th / 2)) TD_CENTER 0xffffff btnstr.PBTN_sLabel;
);
0;;
fun updateButton(btnstr)=
if (btnstr.PBTN_win == nil) then nil else
let _GETalphaBitmapSize btnstr.PBTN_AlphaBuffer -> [bw bh] in
let bh / (btnstr.PBTN_iAvStates + 1) -> statew in
let (bw / btnstr.PBTN_iNbFrames) * btnstr.PBTN_iCurFrame -> wpos in
let if (!btnstr.PBTN_iAvStates) then 0 else statew * btnstr.PBTN_iState -> ypos in
let G2DcopyAlphaBitmap _channel btnstr.PBTN_AlphaBuffer wpos ypos (bw / btnstr.PBTN_iNbFrames) statew -> cpabmp in
(
drawLabel cpabmp btnstr;
SO3BitmapWidgetBlitAlpha btnstr.PBTN_win cpabmp;
_DSalphaBitmap cpabmp;
);
0;;
fun computePosSize(btnstr, vw, vh)=
_showconsole;
_fooS strcatn "view size"::(itoa vw)::nil;
_fooS strcatn "view heighh"::(itoa vh)::nil;
let btnstr.PBTN_tPercent -> [px py pw ph xo yo wo ho] in
let btnstr.PBTN_tAlign -> [ax ay] in
let if pw then (ftoi (((itof btnstr.PBTN_iWidth) /. 100.0) *. (itof vw))) + wo else btnstr.PBTN_iWidth -> pw in
let if ph then (ftoi (((itof btnstr.PBTN_iHeight) /. 100.0) *. (itof vh))) + ho else btnstr.PBTN_iHeight -> ph in
let if px then (ftoi (((itof btnstr.PBTN_iPosX) /. 100.0) *. (itof vw))) + xo else btnstr.PBTN_iPosX -> px in
let if py then (ftoi (((itof btnstr.PBTN_iPosY) /. 100.0) *. (itof vh))) + yo else btnstr.PBTN_iPosY -> py in
( _fooS strcatn "button width"::(itoa pw)::nil;
_fooS strcatn "button height"::(itoa ph)::nil;
[px py pw ph]);;
fun cbResizeCtrl(inst, viewstr, vw, vh, btnstr)=
if btnstr.PBTN_win == nil || btnstr.PBTN_bOnMaterial then nil else
let computePosSize btnstr vw vh -> [px py pw ph] in
let vw -(vw -(pw + px)) -> rightmargin in
let vh - (vh -(ph + py))-> bottommargin in
let vh -(vh - ((ph/2) + py)) -> buttonvcenter in
(
set btnstr.PBTN_iPosX= px;
set btnstr.PBTN_iPosY= py;
set btnstr.PBTN_iHeight = ph;
_fooS strcatn "back in resize control fucnction,button width"::(itoa pw)::nil;
_fooS strcatn "back in resize control fucnction,button height"::(itoa ph)::nil;
set btnstr.PBTN_iWidth = pw;
set btnstr.PBTN_iRight_Margin = rightmargin;
set btnstr.PBTN_iBottom_Margin = bottommargin;
set btnstr.PBTN_iYcenter = buttonvcenter;
SO3WidgetSetPosition btnstr.PBTN_win px py;
SO3WidgetSetSize btnstr.PBTN_win pw ph;
SendPluginEvent btnstr.PBTN_instance "sendtouchpointdata" strcatn "rezied window"::"\n ":: "new right maring is : ":: (itoa btnstr.PBTN_iRight_Margin):: "new bottom margin is: ":: (itoa btnstr.PBTN_iBottom_Margin)::"new x position is: "::(itoa btnstr.PBTN_iPosX):: "new y position is":: (itoa btnstr.PBTN_iPosY):: "new width is: ":: (itoa pw)::"new height is: ":: (itoa ph)::"new vertical center is:"::(itoa buttonvcenter)::nil nil;
updateButton btnstr;
);
0;;
fun cbMouseIn(widget, btnstr)=
if(btnstr.PBTN_iState == 3) || (btnstr.PBTN_iClick != 0) then nil else
(
set btnstr.PBTN_iState = 1;
let V3DgetSessionView c3dXsession -> viewstr in
if (!btnstr.PBTN_bShowCursor || btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible viewstr)) then nil else
(
set btnstr.PBTN_bLastCursor = 1;
let V3DgetCursor viewstr -> pcursor in
if (pcursor == cHandCursor) then nil else
set cPrevCursor = pcursor;
V3DsetCursor viewstr cHandCursor;
);
//update bitmap
if(btnstr.PBTN_iAvStates <= 0) then nil else
(
updateButton btnstr;
0;
);
SendPluginEvent btnstr.PBTN_instance "MouseOver" nil nil;
);
0;;
fun cbMouseOut(widget, btnstr)=
if(btnstr.PBTN_iState == 3) then nil else
(
if (btnstr.PBTN_iClick != 0) then nil else
(
let V3DgetSessionView c3dXsession -> viewstr in
if (!btnstr.PBTN_bShowCursor || !btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible viewstr)) then nil else
(
set btnstr.PBTN_bLastCursor = 0;
V3DsetCursor viewstr cPrevCursor;
set cPrevCursor = nil;
);
set btnstr.PBTN_iState = 0;
//update bitmap
if(btnstr.PBTN_iAvStates <= 0) then nil else
(
updateButton btnstr;
0;
);
//SendPluginEvent btnstr.PBTN_instance "Released" nil nil;
SendPluginEvent btnstr.PBTN_instance "MouseOut" nil nil;
);
);
0;;
fun cbClick(widget, btnstr, x, y, btn)=
if(btnstr.PBTN_iState == 3) then nil else
(
if (btnstr.PBTN_iState == 2) && (btnstr.PBTN_iClick == 0) then nil else
(
SendPluginEvent btnstr.PBTN_instance "Pushed" nil nil;
set btnstr.PBTN_tLastPos = [x y];
);
set btnstr.PBTN_iClick = btnstr.PBTN_iClick|btn;
set btnstr.PBTN_iState = 2;
if(btnstr.PBTN_iAvStates <= 1) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
);
0;;
fun cbUnClick(widget, btnstr, x, y, btn)=
if (btnstr.PBTN_iState == 3) then nil else
(
if (btnstr.PBTN_iState != 2) then nil else
(
set btnstr.PBTN_tLastPos = nil;
SendPluginEvent btnstr.PBTN_instance "Released" nil nil;
if (SO3WidgetIsMouseOver btnstr.PBTN_win) then nil else
SendPluginEvent btnstr.PBTN_instance "MouseOut" nil nil;
);
if (!SO3WidgetIsMouseOver btnstr.PBTN_win) then
(
let V3DgetSessionView c3dXsession -> viewstr in
if (!btnstr.PBTN_bShowCursor || !btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible viewstr)) then nil else
(
set btnstr.PBTN_bLastCursor = 0;
V3DsetCursor viewstr cPrevCursor;
set cPrevCursor = nil;
);
SendPluginEvent btnstr.PBTN_instance "MouseOut" nil nil;
0;
)
else
(
if btn == 1 then
SendPluginEvent btnstr.PBTN_instance "LeftClick" nil nil
else if btn == 2 then
SendPluginEvent btnstr.PBTN_instance "RightClick" nil nil
else if btn == 16 then
SendPluginEvent btnstr.PBTN_instance "MiddleClick" nil nil
else nil;
0;
);
set btnstr.PBTN_iState = if (SO3WidgetIsMouseOver btnstr.PBTN_win) then 1 else 0;
//update bitmap
if(btnstr.PBTN_iAvStates <= 0) then nil else
(
updateButton btnstr;
0;
);
);
set btnstr.PBTN_iClick = 0;
0;;
fun cbMouseMove(widget, btnstr, x, y, btn)=
if (btnstr.PBTN_iClick == 0) || (btnstr.PBTN_tLastPos == nil) then nil else
let btnstr.PBTN_tLastPos -> [px py] in
let (min btnstr.PBTN_iWidth btnstr.PBTN_iHeight) -> msize in
let (itof (x - px)) /. (itof msize) -> fx in
let if (fx >. 1.0) then 1.0 else if (fx <. (-.1.0)) then (-.1.0) else fx -> fx in
let (itof (py - y)) /. (itof msize) -> fy in
let if (fy >. 1.0) then 1.0 else if (fy <. (-.1.0)) then (-.1.0) else fy -> fy in
(
SendPluginEvent btnstr.PBTN_instance "Pushed move" strcatn (ftoa fx)::" "::(ftoa fy)::nil nil;
);
0;;
fun cbFocused(widget, btnstr, state)=
if (state || (btnstr.PBTN_iState != 2) || (btnstr.PBTN_iClick == 0)) then nil else
(
addLogMessage "unfocused";
set btnstr.PBTN_tLastPos = nil;
SendPluginEvent btnstr.PBTN_instance "Released" nil nil;
let V3DgetSessionView c3dXsession -> viewstr in
if (!btnstr.PBTN_bShowCursor || !btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible viewstr)) then nil else
(
set btnstr.PBTN_bLastCursor = 0;
V3DsetCursor viewstr cPrevCursor;
set cPrevCursor = nil;
);
SendPluginEvent btnstr.PBTN_instance "MouseOut" nil nil;
set btnstr.PBTN_iClick = 0;
set btnstr.PBTN_iState = 0;
//update bitmap
if(btnstr.PBTN_iAvStates <= 0) then nil else
(
updateButton btnstr;
0;
);
);
0;;
fun createPicture(inst, btnstr)=
let (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) -> viewportstr in
if btnstr.PBTN_win != nil then nil else
(
V3DremoveWidgetControl viewportstr btnstr.PBTN_win;
SO3WidgetDestroy btnstr.PBTN_win;
if btnstr.PBTN_bOnMaterial then
(
set btnstr.PBTN_win = SO3BitmapWidgetCreateOnMaterial (V3DgetSession c3dXsession) btnstr.PBTN_Material (strcat (getPluginInstanceName inst) "_pictureCtrl") btnstr.PBTN_iWidth btnstr.PBTN_iHeight btnstr.PBTN_iTechnique btnstr.PBTN_iPass btnstr.PBTN_iTexture;
0;
)
else
(
let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in
let computePosSize btnstr vw vh -> [px py pw ph] in
set btnstr.PBTN_win = SO3BitmapWidgetCreate (V3DgetSession c3dXsession) viewportstr.V3D_viewport (strcat (getPluginInstanceName inst) "_pictureCtrl") px py pw ph 101;
SO3WidgetSetTopOnFocus btnstr.PBTN_win 0;
SO3WidgetSetForeground btnstr.PBTN_win 1;
0;
);
SO3WidgetEnterEventCb btnstr.PBTN_win @cbMouseIn btnstr;
SO3WidgetExitEventCb btnstr.PBTN_win @cbMouseOut btnstr;
SO3WidgetMouseDownEventCb btnstr.PBTN_win @cbClick btnstr;
SO3WidgetMouseUpEventCb btnstr.PBTN_win @cbUnClick btnstr;
SO3WidgetMouseMoveEventCb btnstr.PBTN_win @cbMouseMove btnstr;
SO3WidgetFocusEventCb btnstr.PBTN_win @cbFocused btnstr;
V3DaddWidgetControl viewportstr btnstr.PBTN_win;
SO3WidgetSetKeyboardEnable btnstr.PBTN_win 0;
SO3WidgetSetMouseEnable btnstr.PBTN_win btnstr.PBTN_bEnableMouse;
SO3WidgetSetTransparency btnstr.PBTN_win btnstr.PBTN_bTransparency;
SO3WidgetSetOpacity btnstr.PBTN_win (itof btnstr.PBTN_iOpacity) *. 0.01;
SO3WidgetSetVisibility btnstr.PBTN_win 0;
);
0;;
// button animation is updated at 30 FPS
fun cbControlPreRenderAnim(inst, sessionstr, etime, btnstr)=
let (set btnstr.PBTN_iTick = btnstr.PBTN_iTick + etime) -> rtick in
if (rtick < (1000 / 30)) then nil else
(
set btnstr.PBTN_iCurFrame = btnstr.PBTN_iCurFrame + 1;
if (btnstr.PBTN_iCurFrame < (btnstr.PBTN_iNbFrames - 1)) then nil else
set btnstr.PBTN_iCurFrame = 0;
updateButton btnstr;
set btnstr.PBTN_iTick = 0;
);
0;;
fun cbControlPreRenderShow(inst, sessionstr, etime, btnstr)=
let (itof btnstr.PBTN_iOpacity) /. (itof btnstr.PBTN_iTransition) -> step in
(
set btnstr.PBTN_fTransOpacity = btnstr.PBTN_fTransOpacity +. (step *. (itof etime));
if btnstr.PBTN_fTransOpacity >=. (itof btnstr.PBTN_iOpacity) then
(
SO3WidgetSetOpacity btnstr.PBTN_win (itof btnstr.PBTN_iOpacity) *. 0.01;
if (btnstr.PBTN_iNbFrames <= 1) then
setPluginInstanceCbScenePreRender inst nil
else
setPluginInstanceCbScenePreRender btnstr.PBTN_instance mkfun4 @cbControlPreRenderAnim btnstr;
SendPluginEvent btnstr.PBTN_instance "Shown" nil nil;
0;
)
else
(
SO3WidgetSetOpacity btnstr.PBTN_win (btnstr.PBTN_fTransOpacity *. 0.01);
0;
);
);
if (btnstr.PBTN_iNbFrames <= 1) then nil else
cbControlPreRenderAnim inst sessionstr etime btnstr;
0;;
fun cbControlPreRenderHide(inst, sessionstr, etime, btnstr)=
let (itof btnstr.PBTN_iOpacity) /. (itof btnstr.PBTN_iTransition) -> step in
(
set btnstr.PBTN_fTransOpacity = btnstr.PBTN_fTransOpacity -. (step *. (itof etime));
if btnstr.PBTN_fTransOpacity <=. 0.0 then
(
SO3WidgetSetOpacity btnstr.PBTN_win 0.0;
setPluginInstanceCbScenePreRender inst nil;
if (btnstr.PBTN_win == nil) then nil else
(
V3DremoveWidgetControl (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) btnstr.PBTN_win;
SO3WidgetDestroy btnstr.PBTN_win;
set btnstr.PBTN_win = nil;
_DSalphaBitmap btnstr.PBTN_AlphaBuffer;
set btnstr.PBTN_AlphaBuffer = nil;
SendPluginEvent btnstr.PBTN_instance "Hidden" nil nil;
);
0;
)
else
(
SO3WidgetSetOpacity btnstr.PBTN_win (btnstr.PBTN_fTransOpacity *. 0.01);
0;
);
);
if (btnstr.PBTN_iNbFrames <= 1) then nil else
cbControlPreRenderAnim inst sessionstr etime btnstr;
0;;
fun cbDownloaded(file, data, btnstr)=
if data == nil then nil else
let strcatn sTmpDownloadPath::(getPluginInstanceName btnstr.PBTN_instance)::".tmp"::nil -> tmpfile in
(
_storepack data tmpfile;
let G2DloadAlphaBmp _channel tmpfile -> bmp in
if bmp == nil then nil else
(
if(btnstr.PBTN_iState == 2) then nil else
set btnstr.PBTN_iState = 0;
_DSalphaBitmap btnstr.PBTN_AlphaBuffer;
set btnstr.PBTN_AlphaBuffer = bmp;
if (!btnstr.PBTN_bShow) then nil else
(
createPicture btnstr.PBTN_instance btnstr;
updateButton btnstr;
if (btnstr.PBTN_iTransition == 0) then
(
SO3WidgetSetVisibility btnstr.PBTN_win 1;
if (btnstr.PBTN_iNbFrames <= 1) then nil else
setPluginInstanceCbScenePreRender btnstr.PBTN_instance mkfun4 @cbControlPreRenderAnim btnstr;
SendPluginEvent btnstr.PBTN_instance "Shown" nil nil;
0;
)
else
(
SO3WidgetSetOpacity btnstr.PBTN_win (btnstr.PBTN_fTransOpacity *. 0.01);
SO3WidgetSetVisibility btnstr.PBTN_win 1;
setPluginInstanceCbScenePreRender btnstr.PBTN_instance mkfun4 @cbControlPreRenderShow btnstr;
0;
);
);
);
);
0;;
fun cbChange(inst, from, action, param, reply, btnstr)=
let if param == nil then btnstr.PBTN_bUrl else strIsUrl param -> isurl in
let if param == nil then btnstr.PBTN_sPath else param -> url in
(
set btnstr.PBTN_bUrl = isurl;
set btnstr.PBTN_sPath = url;
if (!btnstr.PBTN_bShow) then nil else
(
if(btnstr.PBTN_iState == 2) then nil else
set btnstr.PBTN_iState = 0;
if !btnstr.PBTN_bUrl then
(
let G2DloadAlphaBmp _channel btnstr.PBTN_sPath -> bmp in
if bmp == nil then nil else
(
set btnstr.PBTN_AlphaBuffer = bmp;
createPicture inst btnstr;
updateButton btnstr;
SO3WidgetSetVisibility btnstr.PBTN_win 1;
);
0;
)
else
(
if (btnstr.PBTN_httpReq == nil) then nil else
(
killHttpRequest btnstr.PBTN_httpReq;
set btnstr.PBTN_httpReq = nil;
);
set btnstr.PBTN_httpReq = downloadFile btnstr.PBTN_sPath mkfun3 @cbDownloaded btnstr;
0;
);
);
);
0;;
fun cbEnable(inst, from, action, param, reply, btnstr)=
set btnstr.PBTN_iState = 0;
0;;
fun cbDisable(inst, from, action, param, reply, btnstr)=
set btnstr.PBTN_iState = 2;
0;;
fun cbSetLabel(inst, from, action, param, reply, btnstr)=
set btnstr.PBTN_sLabel = param;
updateButton btnstr;
0;;
fun cbSendLeftClick(inst, from, action, param, reply, btnstr)=
if (!btnstr.PBTN_bShow) then nil else
SendPluginEvent btnstr.PBTN_instance "LeftClick" nil nil;
0;;
fun cbSendRightClick(inst, from, action, param, reply, btnstr)=
if (!btnstr.PBTN_bShow) then nil else
SendPluginEvent btnstr.PBTN_instance "RightClick" nil nil;
0;;
fun cbSendMiddleClick(inst, from, action, param, reply, btnstr)=
if (!btnstr.PBTN_bShow) then nil else
SendPluginEvent btnstr.PBTN_instance "MiddleClick" nil nil;
0;;
fun cbSetState(inst, from, action, param, reply, btnstr)=
let strtrim param -> param in
if (!strcmpi param "Active") || ((atoi param) == 1) then
(
// active state
set btnstr.PBTN_iState = 0;
if(btnstr.PBTN_iAvStates <= 0) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
0;
)
else if (!strcmpi param "Hover") || ((atoi param) == 2) then
(
// hover state
set btnstr.PBTN_iState = 1;
if(btnstr.PBTN_iAvStates <= 0) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
0;
)
else if (!strcmpi param "Down") || ((atoi param) == 3) then
(
// hover state
set btnstr.PBTN_iState = 2;
if(btnstr.PBTN_iAvStates <= 0) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
0;
)
else if (!strcmpi param "Disable") || ((atoi param) == 4) then
(
// disable state
set btnstr.PBTN_iState = 3;
if(btnstr.PBTN_iAvStates <= 1) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
0;
)
else nil;
0;;
fun cbShow(inst, from, action, param, reply, btnstr)=
if (btnstr.PBTN_bShow) then nil else
(
if(btnstr.PBTN_iState == 2) then nil else
set btnstr.PBTN_iState = 0;
if !btnstr.PBTN_bUrl then
(
let G2DloadAlphaBmp _channel btnstr.PBTN_sPath -> bmp in
if bmp == nil then nil else
(
set btnstr.PBTN_AlphaBuffer = bmp;
createPicture inst btnstr;
updateButton btnstr;
if (btnstr.PBTN_iTransition == 0) then
(
SO3WidgetSetVisibility btnstr.PBTN_win 1;
if (btnstr.PBTN_iNbFrames <= 1) then nil else
setPluginInstanceCbScenePreRender btnstr.PBTN_instance mkfun4 @cbControlPreRenderAnim btnstr;
SendPluginEvent btnstr.PBTN_instance "Shown" nil nil;
0;
)
else
(
SO3WidgetSetOpacity btnstr.PBTN_win (btnstr.PBTN_fTransOpacity *. 0.01);
SO3WidgetSetVisibility btnstr.PBTN_win 1;
setPluginInstanceCbScenePreRender inst mkfun4 @cbControlPreRenderShow btnstr;
0;
);
);
0;
)
else
(
if (btnstr.PBTN_httpReq == nil) then nil else
(
killHttpRequest btnstr.PBTN_httpReq;
set btnstr.PBTN_httpReq = nil;
);
set btnstr.PBTN_httpReq = downloadFile btnstr.PBTN_sPath mkfun3 @cbDownloaded btnstr;
0;
);
set btnstr.PBTN_bShow = 1;
);
0;;
fun cbHide(inst, from, action, param, reply, btnstr)=
if (!btnstr.PBTN_bShow) then nil else
(
if (btnstr.PBTN_iTransition == 0) then
(
if (btnstr.PBTN_win == nil) then nil else
(
setPluginInstanceCbScenePreRender inst nil;
V3DremoveWidgetControl (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) btnstr.PBTN_win;
SO3WidgetDestroy btnstr.PBTN_win;
set btnstr.PBTN_win = nil;
_DSalphaBitmap btnstr.PBTN_AlphaBuffer;
set btnstr.PBTN_AlphaBuffer = nil;
SendPluginEvent btnstr.PBTN_instance "Hidden" nil nil;
);
0;
)
else
(
SO3WidgetSetOpacity btnstr.PBTN_win (btnstr.PBTN_fTransOpacity *. 0.01);
setPluginInstanceCbScenePreRender inst mkfun4 @cbControlPreRenderHide btnstr;
0;
);
if(btnstr.PBTN_iState == 2) then nil else
set btnstr.PBTN_iState = 0;
if (!btnstr.PBTN_bShowCursor || !btnstr.PBTN_bLastCursor || (!V3DgetCursorVisible (V3DgetSessionView c3dXsession))) then nil else
(
set btnstr.PBTN_bLastCursor = 0;
V3DsetCursor (V3DgetSessionView c3dXsession) cPrevCursor;
set cPrevCursor = nil;
);
set btnstr.PBTN_lInputs = nil;
set btnstr.PBTN_bShow = 0;
);
0;;
fun cbInput(inst, from, action, param, reply, btnstr)=
if (!btnstr.PBTN_bShow) || (param == nil) || (btnstr.PBTN_win == nil) then nil else
let strextr param -> lp in
let atoi (nth_list (hd lp) 0) -> sx in
let atoi (nth_list (hd lp) 1) -> sy in
let (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) -> viewportstr in
let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in
let computePosSize btnstr vw vh -> [px py pw ph] in
(
let switchstr btnstr.PBTN_lInputs from -> icontrol in
(
// if not already int the list we add it
if (icontrol == nil) then
(
set btnstr.PBTN_lInputs = [from [sx sy]]::btnstr.PBTN_lInputs;
0;
)
else
(
mutate icontrol <- [sx sy];
0;
);
);
let sizelist btnstr.PBTN_lInputs -> size in
let 0 -> i in
let 0 -> over in
(
while (i < size) do
(
let nth_list btnstr.PBTN_lInputs i -> [n [sx sy]] in
if ((sx > px) && (sx < (px + pw)) && (sy > py) && (sy < (py + ph))) then
set over = 1
else nil;
set i = i + 1;
);
if (over == 1) then
(
if (btnstr.PBTN_iLastInputState) then nil else
(
set btnstr.PBTN_iLastInputState = 1;
cbMouseIn nil btnstr;
);
0;
)
else if (!btnstr.PBTN_iLastInputState) then nil else
(
set btnstr.PBTN_iLastInputState = 0;
cbMouseOut nil btnstr;
0;
);
);
);
0;;
// multi touch
fun cbAddCursor(inst, viewstr, id, sx, sy, btnstr)=
set btnstr.PBTN_listfull = btnstr.PBTN_listfull +1;
//if there is more than one control, dont add any more
if ((hd btnstr.PBTN_lInputs) != nil) then nil else
(
let (V3DgetDefaultViewport viewstr) -> viewportstr in
let sy-btnstr.PBTN_iYcenter -> cursordifference in
(
//if touchpoint is too far from the centerline we don't do anything
if (abs (sy- btnstr.PBTN_iYcenter) > 45) ||(abs (sy- btnstr.PBTN_iYcenter) < -45) then
(
SendPluginEvent btnstr.PBTN_instance "sendtouchpointdata" strcatn "not on center. center is at"::(itoa btnstr.PBTN_iYcenter)::"the cursor is this far away from center: "::(itoa cursordifference)::"\n "::nil nil;
0;
)
else
(
SendPluginEvent btnstr.PBTN_instance "sendtouchpointdata" strcatn "on center, center is at"::(itoa btnstr.PBTN_iYcenter)::"the cursor is this far away from center: "::(itoa cursordifference)::"\n "::nil nil;
if (!btnstr.PBTN_bShow) || (btnstr.PBTN_win == nil) then nil else
(
if (btnstr.PBTN_trmMouseState == nil) then nil else
(
_deltimer btnstr.PBTN_trmMouseState;
set btnstr.PBTN_trmMouseState = nil;
);
//disable mouse
SO3WidgetEnterEventCb btnstr.PBTN_win nil nil;
SO3WidgetExitEventCb btnstr.PBTN_win nil nil;
SO3WidgetMouseDownEventCb btnstr.PBTN_win nil nil;
SO3WidgetMouseUpEventCb btnstr.PBTN_win nil nil;
SO3WidgetMouseMoveEventCb btnstr.PBTN_win nil nil;
SO3WidgetFocusEventCb btnstr.PBTN_win @cbFocused nil;
set btnstr.PBTN_iClick = 0;
//make this touchpoint the one we want to track with updatecursor, other touchpoints we will ignore with updatecursor
set btnstr.PBTN_iToggleID = id;
//place touchpoint image at center vertical and horizontal
set btnstr.PBTN_throttle_handle_widget = SO3BitmapWidgetCreate (V3DgetSession c3dXsession) viewportstr.V3D_viewport (strcatn (getPluginInstanceName btnstr.PBTN_instance)::"_tip"::(itoa id)::nil) ((btnstr.PBTN_iWidth/2)-32) (btnstr.PBTN_iYcenter-32) 64 64 100000;
SO3WidgetSetTransparency btnstr.PBTN_throttle_handle_widget 1;
SO3WidgetSetKeyboardEnable btnstr.PBTN_throttle_handle_widget 0;
SO3WidgetSetMouseEnable btnstr.PBTN_throttle_handle_widget 0;
SO3WidgetSetForeground btnstr.PBTN_throttle_handle_widget 1;
SO3BitmapWidgetBlitAlpha btnstr.PBTN_throttle_handle_widget btnstr.PBTN_throttle_handle_image;
set btnstr.PBTN_widgetcreated = 1;
// let if (!btnstr.PBTN_iAvStates) then 0 else statew * btnstr.PBTN_iState -> ypos in
let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in
let computePosSize btnstr vw vh -> [px py pw ph] in
(
if ((sx > px) && (sx < (px + pw)) && (sy > py) && (sy < (py + ph))) then
let switchstr btnstr.PBTN_lInputs (itoa id) -> icontrol in
(
// if not already int the list we add it
if (icontrol == nil) then
(
set btnstr.PBTN_lInputs = [(itoa id) [sx sy]]::btnstr.PBTN_lInputs;
0;
)
else
(
mutate icontrol <- [sx sy];
0;
);
if (btnstr.PBTN_iState == 3) || (btnstr.PBTN_iState == 2) then nil else
(
set btnstr.PBTN_iState = 1;
//update bitmap
if(btnstr.PBTN_iAvStates <= 0) then nil else
(
updateButton btnstr;
0;
);
SendPluginEvent btnstr.PBTN_instance "MouseOver" nil nil;
set btnstr.PBTN_iState = 2;
//update bitmap
if(btnstr.PBTN_iAvStates <= 1) then nil else
(
updateButton btnstr;
0;
);
SendPluginEvent btnstr.PBTN_instance "Pushed" nil nil;
set btnstr.PBTN_tLastPos = [sx sy];
);
)
else nil;
);
);
0;
);
);
0;
);
0;;
/*
PBTN_iPosX : I,
PBTN_iPosY : I,
PBTN_iRight_Margin : I,
PBTN_iBottom_Margin
*/
fun cbUpdateCursor(inst, viewstr, id, sx, sy, vx, vy, btnstr)=
//do nothing if touchpoint being updated is not the one created at the center
if (id != btnstr.PBTN_iToggleID) then nil else
(
if (sx < btnstr.PBTN_iPosX) || (sx > btnstr.PBTN_iRight_Margin) || (sy < btnstr.PBTN_iPosY) || (sy > btnstr.PBTN_iBottom_Margin) then
(
// SendPluginEvent btnstr.PBTN_instance "sendtouchpointdata" strcatn "pushed move"::"\n ":: "right margin is: ":: (itoa btnstr.PBTN_iRight_Margin):: "bottom margin is: ":: (itoa btnstr.PBTN_iBottom_Margin)::"x position is: "::(itoa btnstr.PBTN_iPosX):: "y position is":: (itoa btnstr.PBTN_iPosY):: "xpoint= :"::(itoa sx)::"ypoint is:" :: (itoa sy) :: "\n"::nil nil;
SendPluginEvent btnstr.PBTN_instance "sendtouchpointdata" strcatn "cursor outside of button. cursor is at x: "::(itoa sx) ::"cursor is at y: "::(itoa sy):: " it must be between x1:"::(itoa btnstr.PBTN_iPosX):: "and x2:":: (itoa btnstr.PBTN_iRight_Margin):: "and y1: ":: (itoa btnstr.PBTN_iPosY)::" and y2: "::(itoa btnstr.PBTN_iBottom_Margin)::"button width is: "::(itoa btnstr.PBTN_iWidth ):: "\n "::nil nil;
0;
)
else
(
if (!btnstr.PBTN_bShow) || (btnstr.PBTN_win == nil) then nil else
(
let switchstr btnstr.PBTN_lInputs (itoa id) -> icontrol in
if (icontrol == nil) || (btnstr.PBTN_tLastPos == nil) then nil else
(
let icontrol -> [ppx ppy] in
//don't change value if touchpoint is not moving, we don't want to set speed if finger accidently touches throttle
if ((ppx == sx) && (ppy == sy)) then nil else
(
mutate icontrol <- [sx sy];
let btnstr.PBTN_tLastPos -> [px py] in
//get difference betwwne screen y coordinate and vertical center
let sy- btnstr.PBTN_iYcenter -> iThrottle_difference in
let (itof iThrottle_difference) /. (itof (btnstr.PBTN_iHeight/2)) ->fy in
//let (itof (py - sy)) /. (itof btnstr.PBTN_iHeight) -> fy in
let if (fy >. 1.0) then 1.0 else if (fy <. (-.1.0)) then (-.1.0) else fy -> fy in
(
SO3WidgetSetPosition btnstr.PBTN_throttle_handle_widget ((btnstr.PBTN_iWidth/2)-32) (sy-32);
SendPluginEvent btnstr.PBTN_instance "throttle" (ftoa fy) nil;
SendPluginEvent btnstr.PBTN_instance "throttle_data" strcatn "throttle amount is"::(ftoa fy) :: "\n"::nil nil;
);
0;
);
0;
);
0;
);
0;
);
0;
);
0;;
fun cbResetMouse(trm, btnstr)=
SO3WidgetEnterEventCb btnstr.PBTN_win @cbMouseIn btnstr;
SO3WidgetExitEventCb btnstr.PBTN_win @cbMouseOut btnstr;
SO3WidgetMouseDownEventCb btnstr.PBTN_win @cbClick btnstr;
SO3WidgetMouseUpEventCb btnstr.PBTN_win @cbUnClick btnstr;
SO3WidgetMouseMoveEventCb btnstr.PBTN_win @cbMouseMove btnstr;
SO3WidgetFocusEventCb btnstr.PBTN_win @cbFocused btnstr;
0;;
fun cbRemoveCursor(inst, viewstr, id, btnstr)=
//if there already is a control in the list of controls (I.E.,TL LIST ==NIL) (which is limited to one memeber), then don't trigger release
if (btnstr.PBTN_throttle_handle_widget==nil)|| (btnstr.PBTN_listfull >1) then nil else
(
SO3WidgetDestroy btnstr.PBTN_throttle_handle_widget;
//snap widget back to original position
//SO3WidgetSetPosition btnstr.PBTN_throttle_handle_widget ((btnstr.PBTN_iWidth/2)-32) (btnstr.PBTN_iYcenter-32);
let switchstr btnstr.PBTN_lInputs (itoa id) -> icontrol in
if (icontrol == nil) then nil else
let icontrol -> [sx sy] in
let (V3DgetDefaultViewport (V3DgetSessionView c3dXsession)) -> viewportstr in
let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in
let computePosSize btnstr vw vh -> [px py pw ph] in
(
let sizelist btnstr.PBTN_lInputs -> size in
let 0 -> i in
let 0 -> over in
(
while (i < size) do
(
let nth_list btnstr.PBTN_lInputs i -> [n [sx sy]] in
if ((sx > px) && (sx < (px + pw)) && (sy > py) && (sy < (py + ph)) && (strcmp n (itoa id))) then
set over = 1
else nil;
set i = i + 1;
);
if (over == 1) then nil else
(
if (btnstr.PBTN_iState == 3) || (btnstr.PBTN_iState == 0) then nil else
(
set btnstr.PBTN_iState = 0;
if(btnstr.PBTN_iAvStates <= 0) then nil else
//update bitmap
(
updateButton btnstr;
0;
);
SendPluginEvent btnstr.PBTN_instance "Released" nil nil;
SendPluginEvent btnstr.PBTN_instance "MouseOut" nil nil;
if ((sx > px) && (sx < (px + pw)) && (sy > py) && (sy < (py + ph))) then
SendPluginEvent btnstr.PBTN_instance "LeftClick" nil nil
else nil;
set btnstr.PBTN_tLastPos = nil;
);
);
);
);
set btnstr.PBTN_lInputs = remove_sid_from_list btnstr.PBTN_lInputs (itoa id);
//enable mouse again
if ((sizelist btnstr.PBTN_lInputs) > 0) then nil else
set btnstr.PBTN_trmMouseState = _rfltimer _starttimer _channel 500 @cbResetMouse btnstr;
0;
);
set btnstr.PBTN_listfull= btnstr.PBTN_listfull-1;
0;;
fun cbSetPosition(inst, from, action, param, reply, btnstr)=
if param == nil then nil else
let strextr param -> lp in
let (nth_list (hd lp) 0) -> sx in
let (nth_list (hd lp) 1) -> sy in
let V3DgetViewSize (V3DgetSessionView c3dXsession) -> [vw vh] in
(
let 0 -> xpercent in
let if (!strcmp "%" (substr sx ((strlen sx) - 1) 1)) then
(
set xpercent = 1;
atoi sx;
)
else
atoi sx
-> px in
let 0 -> ypercent in
let if (!strcmp "%" (substr sy ((strlen sy) - 1) 1)) then
(
set ypercent = 1;
atoi sy;
)
else
atoi sy
-> py in
let [(if px == nil then 0 else px) (if py == nil then 0 else py)] -> [px py] in
(
mutate btnstr.PBTN_tPercent <- [xpercent ypercent _ _ _ _ _ _];
set btnstr.PBTN_iPosX = px;
set btnstr.PBTN_iPosY = py;
let computePosSize btnstr vw vh -> [px py pw ph] in
(
SO3WidgetSetPosition btnstr.PBTN_win px py;
SO3WidgetSetSize btnstr.PBTN_win pw ph;
);
);
);
0;;
fun cbSetSize(inst, from, action, param, reply, btnstr)=
if param == nil then nil else
let strextr param -> lp in
let (nth_list (hd lp) 0) -> sx in
let (nth_list (hd lp) 1) -> sy in
let V3DgetViewSize (V3DgetSessionView c3dXsession) -> [vw vh] in
(
let 0 -> wpercent in
let if (!strcmp "%" (substr sx ((strlen sx) - 1) 1)) then
(
set wpercent = 1;
atoi sx;
)
else
atoi sx
-> px in
let 0 -> hpercent in
let if (!strcmp "%" (substr sy ((strlen sy) - 1) 1)) then
(
set hpercent = 1;
atoi sy;
)
else
atoi sy
-> py in
let [(if px == nil then 0 else px) (if py == nil then 0 else py)] -> [px py] in
(
mutate btnstr.PBTN_tPercent <- [_ _ wpercent hpercent _ _ _ _];
set btnstr.PBTN_iWidth = px;
set btnstr.PBTN_iHeight = py;
let computePosSize btnstr vw vh -> [px py pw ph] in
(
SO3WidgetSetPosition btnstr.PBTN_win px py;
SO3WidgetSetSize btnstr.PBTN_win pw ph;
);
);
);
0;;
fun cbSetOpacity(inst, from, action, param, reply, btnstr)=
if (param == nil) || (!strcmp "" strtrim param) || ((atoi param) == nil) then nil else
let atoi param -> opacity in
(
set btnstr.PBTN_iOpacity = opacity;
SO3WidgetSetOpacity btnstr.PBTN_win (itof btnstr.PBTN_iOpacity) *. 0.01;
);
0;;
// Destroy instance
fun deleteOb(inst, btnstr)=
setPluginInstanceCbScenePreRender inst nil;
if (btnstr.PBTN_trmMouseState == nil) then nil else
(
_deltimer btnstr.PBTN_trmMouseState;
set btnstr.PBTN_trmMouseState = nil;
);
if (btnstr.PBTN_httpReq == nil) then nil else
(
killHttpRequest btnstr.PBTN_httpReq;
set btnstr.PBTN_httpReq = nil;
);
restoreTexture btnstr;
0;;
fun cbNewOb(inst)=
let (getPluginInstanceParam inst "object") -> objname in
let (getPluginInstanceParam inst "material") -> matname in
let atoi (getPluginInstanceParam inst "technique") -> technique in
let if (technique == nil) || (technique < 0) then 0 else technique -> technique in
let atoi (getPluginInstanceParam inst "pass") -> pass in
let if (pass == nil) || (pass < 0) then 0 else pass -> pass in
let atoi (getPluginInstanceParam inst "texture") -> texture in
let if (texture == nil) || (texture < 0) then 0 else texture -> texture in
let atoi (getPluginInstanceParam inst "istexture") -> istexture in
let if istexture == nil then 0 else istexture -> istexture in
let (getPluginInstanceParam inst "path") -> path in
let atoi (getPluginInstanceParam inst "isurl") -> isurl in
let if isurl == nil then 0 else isurl -> isurl in
let (getPluginInstanceParam inst "url") -> url in
let atoi (getPluginInstanceParam inst "btnstates") -> btnstates in
let if btnstates == nil then 0 else btnstates -> btnstates in
let atoi (getPluginInstanceParam inst "nbframes") -> nbframes in
let if (nbframes == nil) || (nbframes < 1) then 1 else nbframes -> nbframes 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 "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 "height") -> height in
let if height == nil then 100 else height -> height in
let getPluginInstanceParam inst "fontname" -> fname in
let if fname == nil then "Arial" else fname -> fname in
let atoi (getPluginInstanceParam inst "fontcolor") -> fcolor in
let if fcolor == nil then 0 else fcolor -> fcolor in
let atoi (getPluginInstanceParam inst "fontsize") -> fsize in
let if fsize == nil then 12 else fsize -> fsize in
let atoi (getPluginInstanceParam inst "fontbold") -> fbold in
let if fbold == nil then 0 else fbold -> fbold in
let getPluginInstanceParam inst "label" -> label in
let if label == nil then "" else label -> label in
let _CRfont _channel fsize 0 FF_PIXEL|(if fbold then FF_WEIGHT else 0) fname -> font in
let atoi (getPluginInstanceParam inst "opacity") -> opacity in
let if opacity == nil then 100 else opacity -> opacity in
let atoi (getPluginInstanceParam inst "transition") -> transition in
let if transition == nil then 0 else transition -> transition in
let atoi (getPluginInstanceParam inst "transparency") -> trans in
let if (trans == nil) then 0 else trans -> trans in
let atoi (getPluginInstanceParam inst "enablemouse") -> enablemouse in
let if enablemouse == nil then 1 else enablemouse -> enablemouse in
let atoi (getPluginInstanceParam inst "cursor") -> cursor in
let if cursor == nil then 1 else cursor -> cursor in
let atoi (getPluginInstanceParam inst "show") -> show in
let if (show == nil) then 1 else show -> show in
let if !isurl then path else url -> file in
let V3DgetSessionView c3dXsession -> viewstr in
let V3DgetViewPosSize viewstr -> [screenx screeny screen_width screen_height] in
let screen_width -(screen_width-(width + posx)) -> rightmargin in
let screen_height -(screen_height - (height + posy))-> bottommargin in
let 0 -> xcenter in
let screen_height -(screen_height - ((height/2) + posy)) -> ycenter in
let 0 -> toggle_ID in
let 0 -> listfull in
let 0 -> widgetcreated in
//load the touchpoint image
let G2DloadAlphaBmp _channel strcatn (getPluginDirectory (getInstancePlugin inst))::"/res/tips.png"::nil -> fingtertip_alphabitmap in
let if !istexture then nil else SO3SceneGetMaterial (V3DgetSession c3dXsession) (getPluginInstanceGroupName inst) matname -> mat in
let MkPlugButton [inst istexture mat technique pass texture nil nil nil fingtertip_alphabitmap posx posy rightmargin bottommargin toggle_ID width height xcenter ycenter [xpercent ypercent wpercent hpercent xoffset yoffset woffset hoffset] [xalign yalign] trans opacity transition 0.0 font label fcolor isurl file 0 0 cursor enablemouse 0 btnstates 0 nbframes 0 0 0 nil nil nil listfull widgetcreated nil] -> btnstr in
(
if btnstr.PBTN_bOnMaterial then nil else
setPluginInstanceCbResizeView inst mkfun5 @cbResizeCtrl btnstr;
if show then
cbShow inst nil nil nil nil btnstr
else
cbHide inst nil nil nil nil btnstr;
PluginRegisterAction inst "Show" mkfun6 @cbShow btnstr;
PluginRegisterAction inst "Hide" mkfun6 @cbHide btnstr;
PluginRegisterAction inst "Change" mkfun6 @cbChange btnstr;
PluginRegisterAction inst "Enable" mkfun6 @cbEnable btnstr;
PluginRegisterAction inst "Disable" mkfun6 @cbDisable btnstr;
PluginRegisterAction inst "Set state" mkfun6 @cbSetState btnstr;
PluginRegisterAction inst "Set label" mkfun6 @cbSetLabel btnstr;
PluginRegisterAction inst "Send left click" mkfun6 @cbSendLeftClick btnstr;
PluginRegisterAction inst "Send right click" mkfun6 @cbSendRightClick btnstr;
PluginRegisterAction inst "Send middle click" mkfun6 @cbSendMiddleClick btnstr;
PluginRegisterAction inst "Set position" mkfun6 @cbSetPosition btnstr;
PluginRegisterAction inst "Set size" mkfun6 @cbSetSize btnstr;
PluginRegisterAction inst "Set opacity" mkfun6 @cbSetOpacity btnstr;
setPluginInstanceCbTouchPointAdd inst mkfun6 @cbAddCursor btnstr;
setPluginInstanceCbTouchPointRemove inst mkfun4 @cbRemoveCursor btnstr;
setPluginInstanceCbTouchPointUpdate inst mkfun8 @cbUpdateCursor btnstr;
setPluginInstanceCbDel inst mkfun2 @deleteOb btnstr;
SendPluginEvent btnstr.PBTN_instance "Started" nil nil;
);
0;;
fun IniPlug(file) =
set sHandCursor = strcat APPBASEDIR sHandCursor;
let _LDbitmap _channel _checkpack sHandCursor -> bmpcursor in
let _CRcursor _channel bmpcursor 12 6 0x000000 0xffffff -> cursor in
(
_DSbitmap bmpcursor;
set cHandCursor = cursor;
);
PlugRegister @cbNewOb nil;
setPluginEditor @dynamicedit;
0;;
Offline
for some reason if i set the button width to 10, and check % directly to the right, when the code extracts the btnstr.PBTN_tPercent tuple, the third item of the list turns into 8....hmph
Offline
fun computePosSize(btnstr, vw, vh)=
_showconsole;
_fooS strcatn "view size"::(itoa vw)::nil;
_fooS strcatn "view heighh"::(itoa vh)::nil;
// ....
_fooS strcatn "button width"::(itoa pw)::nil;
_fooS strcatn "button height"::(itoa ph)::nil;
// ....
These entries are in the log file ? If yes, what are the values ?
Offline
yes here is an example. this is some simple arithmetic or variable assigement i'm missing...
maximized
view size960
view heighh683
percent width796
button width796
button height717
back in resize control fucnction,button width796
back in resize control fucnction,button height717
_CHANGEobjNodeCoordinates: ObjNode is nil !
_CHANGEobjNodeCoordinates: ObjNode is nil !
maximized
view size837
view heighh105
percent width6662
button width6662
button height752
back in resize control fucnction,button width6662
back in resize control fucnction,button height752
_CHANGEobjNodeCoordinates: ObjNode is nil !
_CHANGEobjNodeCoordinates: ObjNode is nil !
maximized
view size960
view heighh683
percent width63955
button width63955
button height5136
back in resize control fucnction,button width63955
back in resize control fucnction,button height5136
Offline
whatever you do you should not encounter a crash.
can you make a zip of your plugIT and send it to me with an xos scene that make it crash ?
Offline
whatever you do you should not encounter a crash.
can you make a zip of your plugIT and send it to me with an xos scene that make it crash ?
for the .xos file, yes i will try to do this tonight my time, thx!
here are the plugit files:
ifam.net/mediaoctopus3d/throttle.zip
Last edited by hebdemnobad (26-Nov-2014 18:05:20)
Offline
Your size callback and calculation are bad, and you try to create a too huge bitmap size.
Ogre return an exception because of a memory issue.
I added a try catch for this case to try to prevent the crash but you should correct the code anyway.
Offline
Your size callback and calculation are bad, and you try to create a too huge bitmap size.
Ogre return an exception because of a memory issue.I added a try catch for this case to try to prevent the crash but you should correct the code anyway.
thx, yes i know this....i just cannot find out where the code gremlin is (aside from me).
Offline
if you change the values in the resize callback that are definied in the editor, and this values are used to compute the position and size.
So you get an incremental behavior.
if you want to get the current widget pos and size use directly widget functions.
Do not change values that are used to compute the current position.
Offline
if you change the values in the resize callback that are definied in the editor, and this values are used to compute the position and size.
So you get an incremental behavior.if you want to get the current widget pos and size use directly widget functions.
Do not change values that are used to compute the current position.
i see, so i use SO3WidgetGetPosition and SO3WidgetGetSize, etc.
this is strange, in your version of the button plugit you don't do this, you get the values from the struct. oh well, i will fix it and won't worry too much about how i broke it.
fun computePosSize(btnstr, vw, vh)=
let btnstr.PBTN_tPercent -> [px py pw ph xo yo wo ho] in
let btnstr.PBTN_tAlign -> [ax ay] in
let if pw then (ftoi (((itof btnstr.PBTN_iWidth) /. 100.0) *. (itof vw))) + wo else btnstr.PBTN_iWidth -> pw in
let if ph then (ftoi (((itof btnstr.PBTN_iHeight) /. 100.0) *. (itof vh))) + ho else btnstr.PBTN_iHeight -> ph in
let if px then (ftoi (((itof btnstr.PBTN_iPosX) /. 100.0) *. (itof vw))) + xo else btnstr.PBTN_iPosX -> px in
let if (ax == 1) then ((vw / 2) - (pw / 2)) + px else if (ax == 2) then (vw - pw) - px else px -> px in
let if py then (ftoi (((itof btnstr.PBTN_iPosY) /. 100.0) *. (itof vh))) + yo else btnstr.PBTN_iPosY -> py in
let if (ay == 1) then ((vh / 2) - (ph / 2)) + py else if (ay == 2) then (vh - ph) - py else py -> py in
[px py pw ph];;
fun cbResizeCtrl(inst, viewstr, vw, vh, btnstr)=
if btnstr.PBTN_win == nil || btnstr.PBTN_bOnMaterial then nil else
let computePosSize btnstr vw vh -> [px py pw ph] in
(
SO3WidgetSetPosition btnstr.PBTN_win px py;
SO3WidgetSetSize btnstr.PBTN_win pw ph;
updateButton btnstr;
);
0;;
Offline
computePosSize calculate the new position of the widget on resize from the parameters set in the editor.
if you change btnstr.PBTN_iWidth or something else latter or in resize function the values will not be correct anymore.
Offline
computePosSize calculate the new position of the widget on resize from the parameters set in the editor.
if you change btnstr.PBTN_iWidth or something else latter or in resize function the values will not be correct anymore.
+1
Offline
computePosSize calculate the new position of the widget on resize from the parameters set in the editor.
if you change btnstr.PBTN_iWidth or something else latter or in resize function the values will not be correct anymore.
aha, i see....well the only thing i guess i will have to recalculate are the horizontal and vertical centers of the button at each resize event, since i am varying output by offset from the center of the throttle. i know what to do i think. thx.
Offline
why did you change the resize code ?
I did this in order to revise the horizontal center and offset values that control widget output... as you said, I will get those with the widget methods and set my struct according to the widget properties and not the initial values set in the editor.
Offline
I removed the setting of PBTN_iWidth and PBTN_iHeight cbResizeCtrl and the button is behaving itself (not incrementing in size). and resizing is resulting in the correct button vertical center values. will do more work later in weekend/early next week, thx guys
Offline
Pages: 1