/* ----------------------------------------------------------------------------- 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 ----------------------------------------------------------------------------- */ /*! @defgroup v3DApi OpenSpace3D 3D view API * OpenSpace3D 3D view API * @{ */ /** @} */ /************************************************** SO3Engine (Ogre 3D) library Version: 1.0 Author: Bastien BOURINEAU / I-maginer Last update: 02.04.2009 **************************************************/ // Meter var iGlobalUnit = 1;; var sV3DDEFAULTRESOURCESPATH = "tools/os3dlib/res/";; var sV3DHIDECURSOR = "hide_cursor.bmp";; var sV3DResourcesGroup = "V3DdefaultResources";; var iV3Ddebug = 0;; // Frames handling var iV3DmaxFramerate = 90;; // Maximum possible framerate var iV3DIndex = 0;; var iV3DSessionIndex = 0;; // - Mouse - var V3DCLICK_NO = 0;; var V3DCLICK_LEFT = 1;; var V3DCLICK_RIGHT = 2;; var V3DCLICK_SHIFT = 4;; var V3DCLICK_CTRL = 8;; var V3DCLICK_MIDDLE = 16;; var V3DAXIS_X = 32;; var V3DAXIS_Y = 64;; var V3DAXIS_Z = 128;; var V3DAXIS_H = 256;; var iDefaultBackGroundRColor = 123;; var iDefaultBackGroundGColor = 123;; var iDefaultBackGroundBColor = 123;; var iDefaultAmbiantRColor = 50;; var iDefaultAmbiantGColor = 50;; var iDefaultAmbiantBColor = 50;; var iDefaultShadowTextureSize = 512;; var fDefaultShadowTextureFadeStart = 0.65;; var fDefaultShadowTextureFadeEnd = 0.9;; var iShadowTextureSize = 512;; var fShadowTextureFadeStart = 0.65;; var fShadowTextureFadeEnd = 0.9;; var fDefaultAnimationSpeed = 1.0;; var iMaxHelpers = 128;; var iNodeFlagScene = 2;; var iNodeFlagTools = 4;; var iNodeFlagPlugIT = 8;; var iNodeFlagVUI = 16;; var iNodeFlagGroup = 32;; var iNodeFlagClick = 2048;; var iNodeFlagController = 4096;; var iDefaultAxisRef = 0;; //!< 0 local 1 world 2 view typeof cHIDECURSOR = ObjCursor;; // - Struct viewport - struct V3Dviewport = [ V3D_iViewportIndex : I, //!< viewport index V3D_viewport : SO3_VIEWPORT, //!< SO3 viewport object V3D_iViewportX : F, //!< X float position V3D_iViewportY : F, //!< Y float position V3D_iViewportW : F, //!< width float position V3D_iViewportH : F, //!< height float position V3D_lWidgetControl : [SO3_WIDGET r1], //!< list of widgets V3D_iBgColor : I, //!< background color V3D_iPolygonMode : I, //!< render polygon mode V3D_lCompositor : [[S S] r1] //!< list of viewport compositors ] mkV3Dviewport;; // - Struct Axis - struct V3Daxis = [ V3D_axisFather : SO3_OBJECT, //!< parent node V3D_axisShell : SO3_OBJECT, //!< shell axis V3D_xAxisObject : SO3_OBJECT, //!< X axis object V3D_yAxisObject : SO3_OBJECT, //!< Y axis object V3D_zAxisObject : SO3_OBJECT, //!< Z axis object V3D_hAxisObject : SO3_OBJECT, //!< h axis object V3D_xAxisTextObject : SO3_OBJECT, //!< X axis letter object V3D_yAxisTextObject : SO3_OBJECT, //!< Y axis letter object V3D_zAxisTextObject : SO3_OBJECT, //!< Z axis letter object V3D_xAxisMaterial : SO3_MATERIAL, V3D_yAxisMaterial : SO3_MATERIAL, V3D_zAxisMaterial : SO3_MATERIAL, V3D_hAxisMaterial : SO3_MATERIAL, V3D_xAxisColor : I, V3D_yAxisColor : I, V3D_zAxisColor : I, V3D_hAxisColor : I, V3D_sAxisColor : I, V3D_iAxisRef : I, //!< 0 local 1 world 2 view V3D_tAxisClickPRS : [[F F F] [F F F F] [F F F]], V3D_cbAxisClick : fun [V3Daxis V3Dsession SO3_OBJECT I I I I] I, V3D_cbAxisUnClick : fun [V3Dsession SO3_OBJECT I I I I] I, V3D_cbAxisMove : fun [V3Dsession V3Daxis I I I I F] I, V3D_iAxisMode : I, //!< axis mode, 1 translation, 2 rotation, 3 scale V3D_iAxisInputId : I ] mkV3Daxis;; // - Struct Helper - struct V3Dhelper = [ V3D_helperFather : SO3_OBJECT, //!< parent node V3D_helperIcon : SO3_OBJECT, //!< helper icon object V3D_iHelperMode : I //!< helper type, 1 node, 4 light, 8 camera ] mkV3Dhelper;; // - Struct Session - struct V3Dsession = [ V3D_sessionView : V3Dview, //!< 3d View structure V3D_session : SO3_SCENE, //!< SO3 scene V3D_defaultLight : SO3_OBJECT, //!< default scene light V3D_lCamera : [[I SO3_OBJECT] r1], //!< list of scene cameras V3D_defaultCamera : SO3_OBJECT, //!< current default camera V3D_lPrevDefaultCamera : [SO3_OBJECT r1], //!< previous default camera V3D_shellNavigate : SO3_OBJECT, //!< default navigation shell V3D_physics : V3Dphysics, //!< physic structure V3D_lAxis : [[SO3_OBJECT V3Daxis] r1], //!< list of scene axis V3D_mLastAxisMat : SO3_MATERIAL, //!< last axis over material V3D_lHelper : [[SO3_OBJECT V3Dhelper] r1], //!< list of scene helpers V3D_helperGrid : [SO3_OBJECT [SO3_OBJECT r1]], //!< helper grid V3D_bHelpersState : I, //!< helpers visibility state V3D_selectedAxis : [V3Daxis I], //!< current selected axis V3D_bNavigate : I, //!< default navigation state V3D_bNavigateControl : I, //!< all navigation control state V3D_lAnimations : [[S V3Danim] r1], //!< list of scene animations V3D_cbScenePreRender : fun [V3Dsession I] I, V3D_cbScenePreRender2 : fun [V3Dsession I] I, V3D_cbScenePreRenderPhysic : fun [V3Dsession I] I, V3D_cbScenePostRender : fun [V3Dsession I] I, V3D_cbHUDPreRender : fun [V3Dsession I] I, V3D_cbHUDPostRender : fun [V3Dsession] I, V3D_cbNavigateControlState : fun [V3Dsession I] I ] mkV3Dsession;; struct V3Danim = [ V3D_animSession : V3Dsession, V3D_anim : SO3_ANIM, V3D_iAnimId : I, V3D_sBaseName : S, V3D_meshAnim : SO3_OBJECT, // Animated object / node V3D_nodePRS : [[F F F] [F F F F] [F F F]], V3D_sAnimName : S, V3D_bAnimState : I, V3D_bAnimSkipFrame : I, V3D_fAnimWeight : F, // Current animation weight V3D_iAnimLength : F, // anim length V3D_iAnimType : I, // define if this animation is an mesh, skeletal, node or animation sequence V3D_cbAnimPlay : fun [V3Danim] I, V3D_cbAnimPause : fun [V3Danim] I, V3D_cbAnimStop : fun [V3Danim] I, V3D_bAnimReset : I ] mkV3Danim;; // - Struct 3D - struct V3Dview = [ V3D_win : ObjWin, //!< buffer scol window V3D_buffer : SO3_BUFFER, //!< SO3 3D buffer V3D_channel : Chn, //!< view scol channel V3D_iWinW : I, //!< view width V3D_iWinH : I, //!< view height V3D_iWinX : I, //!< view X position V3D_iWinY : I, //!< view Y position V3D_iOldWinW : I, //!< previous view width V3D_iOldWinH : I, //!< previous view height V3D_lSessions : [[I V3Dsession] r1], //!< list of scenes associated with this view V3D_bPaused : I, //!< pause state // ressources V3D_iRenderTick : I, //!< render last tick // mouse / keyboard V3D_iClickStatus : I, //!< last mouse click state V3D_lClickCoords : [[I [I I]] r1], //!< last input click coordinates V3D_lMoveCoords : [[I [I I]] r1], //!< last input coordinates V3D_lClickPos : [[I [I I]] r1], //!< last mouse on click V3D_lClickMove : [[I [I I]] r1], //!< last mouse move on click V3D_lPointerClick : [[I [[F F F] [F F F F] [F F F] F]] r1], //!< last pointer on click V3D_lPointerMove : [[I [[F F F] [F F F F] F]] r1], //!< last pointer move V3D_lastMouseData : [[I [V3Dsession SO3_VIEWPORT SO3_OBJECT SO3_MATERIAL I [I [[F F F] [F F F] [F F F]] [[F F] [F F] [F F]]] [F F F] [F F] F]] r1], //!< last complete mouse data // Cursor direction V3D_lInputDir : [[I [I I]] r1], //!< last input cursor direction V3D_lRenderCoords : [[I [I I]] r1], //!< last input move coordinate in render view V3D_iMoveClickStatus : I, //!< last mouse move click state V3D_bMouseEnabled : I, //!< mouse enable state V3D_bKeyboardEnabled : I, //!< keyboard enable state // Callback V3D_cbInit : fun [V3Dview] I, V3D_cbDestroy : fun [V3Dview] I, V3D_cbPreRenderEffects : fun [V3Dview] I, V3D_cbPreRender : fun [V3Dview] I, V3D_cbPreRender2 : fun [V3Dview] I, V3D_cbPostRender : fun [V3Dview] I, V3D_cbClick : fun [V3Dview I I I] I, V3D_cbDbClick : fun [V3Dview I I I] I, V3D_cbUnClick : fun [V3Dview I I I] I, V3D_cbWheel : fun [V3Dview I I I I] I, V3D_cbCursorMove : fun [V3Dview I I I] I, V3D_cbAddTouchPoint : fun [V3Dview I I I] I, V3D_cbRemoveTouchPoint : fun [V3Dview I] I, V3D_cbUpdateTouchPoint : fun [V3Dview I I I I I] I, V3D_cbKeyDown : fun [V3Dview I I] I, V3D_cbKeyUp : fun [V3Dview I] I, V3D_cbInputClick : fun [V3Dview I I I I [SO3_OBJECT SO3_MATERIAL I [F F F] [F F] F]] I, V3D_cbInputUnClick : fun [V3Dview I I I I [SO3_OBJECT SO3_MATERIAL I [F F F] [F F] F]] I, V3D_cbInputUpdate : fun [V3Dview I I I I [SO3_OBJECT SO3_MATERIAL I [F F F] [F F] F]] I, V3D_cbKeyDownHUD : fun [V3Dview I I] I, V3D_cbKeyUpHUD : fun [V3Dview I] I, V3D_cbDropFile : fun [V3Dview I I [P r1]] I, V3D_cbCameraChange : fun [V3Dview V3Dsession SO3_OBJECT] I, V3D_cbResizeHUDView : fun [V3Dview I I] I, V3D_cbResizeView : fun [V3Dview I I] I, V3D_cbFocusView : fun [V3Dview] I, V3D_cbKillFocusView : fun [V3Dview] I, V3D_cbVrModeChanged : fun [V3Dview I] I, V3D_lViewport : [[I V3Dviewport] r1], V3D_bFullScreen : I, //!< current fullscreen state V3D_bState : I, //!< current view state V3D_bShowCursor : I, //!< current show cursor state V3D_bVRmode : I, //!< VR mode V3D_bVRpointer : I //!< VR pointer are in use / disable mouse injection ]mkV3Dview;; typeof lV3DSessions = [[SO3_SCENE V3Dsession] r1];; typeof lV3DViews = [V3Dview r1];; proto V3DviewSetFocus = fun [V3Dview] I;; proto V3DphysCreate = fun [V3Dsession] I;; proto V3DphysDestroy = fun [V3Dsession] I;; proto V3DphysReset = fun [V3Dsession] I;; proto V3DsetWindowedMode = fun [V3Dview] I;; proto V3DenableHelpers = fun [V3Dviewport V3Dsession I] I;; proto V3DgetViewportCamera = fun [V3Dviewport] SO3_OBJECT;; //proto V3DphysUpdate = fun [V3Dsession] I;; /* ********************************************************************************************* / Common / ********************************************************************************************* */ fun V3Dlcat(p, q)= if p==nil then q else let p -> [h nxt] in h::V3Dlcat nxt q;; fun V3DisUrl(url)= if (!strcmpi "http://" (substr url 0 7)) || (!strcmpi "https://" (substr url 0 8)) || (!strcmpi "ftp://" (substr url 0 6)) || (!strcmpi "mms://" (substr url 0 6)) || (!strcmpi "rstp://" (substr url 0 7)) then 1 else 0;; fun V3DgetPathFile(longfile, file)= if (longfile==nil) || (strlen longfile)==0 || (nth_char longfile ((strlen longfile)-1)) == '/ then ( if (strfind "." file 0) != nil then [longfile file] else if file != nil then [strcatn longfile::file::"/"::nil nil] else [longfile nil]; ) else V3DgetPathFile substr longfile 0 (strlen longfile)-1 strcat substr longfile ((strlen longfile)-1) 1 file;; // return the fileName without Path and Extension fun V3DgetFileNameWithoutExt(file)= let V3DgetPathFile file "" -> [_ file2] in substr file2 0 (strfind "." file2 0);; fun V3DgetFileExt(file)= let V3DgetPathFile file "" -> [_ file2] in substr file2 ((strfind "." file2 0) + 1) 1024;; fun V3DgetFilePathWithoutExt(file)= substr file 0 (strfind "." file 0);; fun V3DremoveIdxFromList(l, idx)= if l==nil then nil else let hd l -> [id _] in if id == idx then tl l else (hd l)::V3DremoveIdxFromList tl l idx;; fun V3DremoveSidxFromList(l, idx)= if l==nil then nil else let hd l -> [id _] in if (!strcmpi id idx) then tl l else (hd l)::V3DremoveIdxFromList tl l idx;; fun V3DremoveTupFromListBy2ndElem(l, s2nd)= if l==nil then nil else let hd l -> [_ elem] in if elem == s2nd then tl l else (hd l)::V3DremoveTupFromListBy2ndElem tl l s2nd;; fun V3DremoveTupFromListByName(l, name)= if l==nil then nil else let hd l -> [sname _] in if (!strcmp name sname) then tl l else (hd l)::V3DremoveTupFromListByName tl l name;; fun V3DupdateLastPointerClick(viewstr, id, data)= let data -> [pos ang p3d dist] in let switch viewstr.V3D_lPointerClick id -> mdata in if ((mdata == nil) && (data != nil)) then ( set viewstr.V3D_lPointerClick = [id [pos ang p3d dist]]::viewstr.V3D_lPointerClick; 0; ) else if ((mdata != nil) && (data == nil)) then ( set viewstr.V3D_lPointerClick = remove_idx_from_list viewstr.V3D_lPointerClick id; 0; ) else ( mutate mdata <- [pos ang p3d dist]; 0; ); 0;; fun V3DgetLastPointerClick(viewstr, id)= switch viewstr.V3D_lPointerClick id;; fun V3DupdateLastPointerMove(viewstr, id, data)= let data -> [pos ang dist] in let switch viewstr.V3D_lPointerMove id -> mdata in if ((mdata == nil) && (data != nil)) then ( set viewstr.V3D_lPointerMove = [id [pos ang dist]]::viewstr.V3D_lPointerMove; 0; ) else if ((mdata != nil) && (data == nil)) then ( set viewstr.V3D_lPointerMove = remove_idx_from_list viewstr.V3D_lPointerMove id; 0; ) else ( mutate mdata <- [pos ang dist]; 0; ); 0;; fun V3DgetLastPointerMove(viewstr, id)= switch viewstr.V3D_lPointerMove id;; fun V3DupdateLastMouseData(viewstr, id, data)= let data -> [msessionstr viewport obj mat ent pdata p3d puv dist] in let switch viewstr.V3D_lastMouseData id -> mdata in if ((mdata == nil) && (data != nil)) then ( set viewstr.V3D_lastMouseData = [id [msessionstr viewport obj mat ent pdata p3d puv dist]]::viewstr.V3D_lastMouseData; 0; ) else if ((mdata != nil) && (data == nil)) then ( set viewstr.V3D_lastMouseData = remove_idx_from_list viewstr.V3D_lastMouseData id; 0; ) else ( mutate mdata <- [msessionstr viewport obj mat ent pdata p3d puv dist]; 0; ); 0;; fun V3DgetLastMouseData(viewstr, id)= switch viewstr.V3D_lastMouseData id;; fun V3DupdateLastMouseMove(viewstr, id, x, y)= let switch viewstr.V3D_lMoveCoords id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lMoveCoords = [id [x y]]::viewstr.V3D_lMoveCoords; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lMoveCoords = remove_idx_from_list viewstr.V3D_lMoveCoords id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastMouseMove(viewstr, id)= switch viewstr.V3D_lMoveCoords id;; fun V3DupdateLastMouseClick(viewstr, id, x, y)= let switch viewstr.V3D_lClickCoords id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lClickCoords = [id [x y]]::viewstr.V3D_lClickCoords; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lClickCoords = remove_idx_from_list viewstr.V3D_lClickCoords id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastMouseClick(viewstr, id)= switch viewstr.V3D_lClickCoords id;; fun V3DupdateLastMouseRender(viewstr, id, x, y)= let switch viewstr.V3D_lRenderCoords id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lRenderCoords = [id [x y]]::viewstr.V3D_lRenderCoords; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lRenderCoords = remove_idx_from_list viewstr.V3D_lRenderCoords id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastMouseRender(viewstr, id)= switch viewstr.V3D_lRenderCoords id;; fun V3DupdateLastMouseDir(viewstr, id, x, y)= let switch viewstr.V3D_lInputDir id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lInputDir = [id [x y]]::viewstr.V3D_lInputDir; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lInputDir = remove_idx_from_list viewstr.V3D_lInputDir id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastMouseDir(viewstr, id)= switch viewstr.V3D_lInputDir id;; fun V3DupdateLastClickPos(viewstr, id, x, y)= let switch viewstr.V3D_lClickPos id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lClickPos = [id [x y]]::viewstr.V3D_lClickPos; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lClickPos = remove_idx_from_list viewstr.V3D_lClickPos id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastClickPos(viewstr, id)= switch viewstr.V3D_lClickPos id;; fun V3DupdateLastClickMove(viewstr, id, x, y)= let switch viewstr.V3D_lClickMove id -> mdata in if ((mdata == nil) && (x != nil) && (y != nil)) then ( set viewstr.V3D_lClickMove = [id [x y]]::viewstr.V3D_lClickMove; 0; ) else if ((mdata != nil) && ((x == nil) || (y == nil))) then ( set viewstr.V3D_lClickMove = remove_idx_from_list viewstr.V3D_lClickMove id; 0; ) else ( mutate mdata <- [x y]; 0; ); 0;; fun V3DgetLastClickMove(viewstr, id)= switch viewstr.V3D_lClickMove id;; /* ********************************************************************************************* / Session / ********************************************************************************************* */ fun V3DgetSessionIndex(viewstr, sessionstr)= let sizelist viewstr.V3D_lSessions -> size in let nil -> idx in let 0 -> i in ( while i < size && idx == nil do ( let nth_list viewstr.V3D_lSessions i -> [sidx sstr] in if sstr != sessionstr then nil else set idx = sidx; set i = i + 1; ); idx; );; fun V3DgetSession(sessionstr)= sessionstr.V3D_session;; fun V3DgetSessionByIndex(viewstr, idx)= switch viewstr.V3D_lSessions idx;; /*! @ingroup v3DApi * \brief Get the default viewport of a 3d view structure * * Prototype: fun [V3Dview] V3Dviewport * * \param V3Dview : the 3d view structure * * \return V3Dviewport : the viewport structure, nil if not set **/ fun V3DgetDefaultViewport(viewstr)= switch viewstr.V3D_lViewport 0;; fun V3DgetDefaultSession(viewstr)= let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in if (sessionstr == nil) then switch viewstr.V3D_lSessions 0 else sessionstr;; fun V3DdegToRad(f)=f *. ((2.0 *. PIf) /. 360.0);; fun V3DradToDeg(f)=f /. ((2.0 *. PIf) /. 360.0);; /*! @ingroup v3DApi * \brief Get an object euler rotation in degree * * Prototype: fun [SO3_OBJECT] [F F F] * * \param SO3_OBJECT : the 3d object * * \return [F F F] : the euler rotation in degree **/ fun V3DgetObjectOrientationDeg(obj)= let SO3MathsQuatToEulerXYZ SO3ObjectGetOrientation obj -> [ax ay az] in [(SO3MathsRadianToDegree ax) (SO3MathsRadianToDegree ay) (SO3MathsRadianToDegree az)];; /*! @ingroup v3DApi * \brief Set an object euler rotation in degree * * Prototype: fun [SO3_OBJECT [F F F]] [F F F] * * \param SO3_OBJECT : the 3d object * \param [F F F] : euler rotation in degree * * \return [F F F] : the same rotation **/ fun V3DsetObjectOrientationDeg(obj, ang)= let ang -> [ax ay az] in let [(SO3MathsDegreeToRadian ax) (SO3MathsDegreeToRadian ay) (SO3MathsDegreeToRadian az)] -> rang in ( SO3ObjectSetOrientation obj SO3MathsEulerXYZToQuat rang; ang; );; /*! @ingroup v3DApi * \brief Get an object global euler rotation in degree * * Prototype: fun [SO3_OBJECT] [F F F] * * \param SO3_OBJECT : the 3d object * * \return [F F F] : the global euler rotation in degree **/ fun V3DgetObjectGlobalOrientationDeg(obj)= let SO3MathsQuatToEulerXYZ SO3ObjectGetGlobalOrientation obj -> [ax ay az] in [(SO3MathsRadianToDegree ax) (SO3MathsRadianToDegree ay) (SO3MathsRadianToDegree az)];; /*! @ingroup v3DApi * \brief Set an object global euler rotation in degree * * Prototype: fun [SO3_OBJECT [F F F]] [F F F] * * \param SO3_OBJECT : the 3d object * \param [F F F] : global euler rotation in degree * * \return [F F F] : the same rotation **/ fun V3DsetObjectGlobalOrientationDeg(obj, ang)= let ang -> [ax ay az] in let [(SO3MathsDegreeToRadian ax) (SO3MathsDegreeToRadian ay) (SO3MathsDegreeToRadian az)] -> rang in ( SO3ObjectSetGlobalOrientation obj SO3MathsEulerXYZToQuat rang; ang; );; /*! @ingroup v3DApi * \brief Get the V3Dview structure from a V3Dsession structure * * Prototype: fun [V3Dsession] V3Dview * * \param V3Dsession : the scene structure * * \return V3Dview : the 3d view structure **/ fun V3DgetSessionView(sessionstr) = sessionstr.V3D_sessionView;; /*! @ingroup v3DApi * \brief Get a 3d object by his name or camera type * * Prototype: fun [V3Dsession S] SO3_OBJECT * * \param V3Dsession : the scene structure * \param S : the object name * * \return SO3_OBJECT : the object, nil if not found **/ fun V3DgetObjectByName(sessionstr, name) = let V3DgetSessionView sessionstr -> viewstr in let (V3DgetDefaultViewport viewstr) -> viewportstr in if (!strcmpi "Current camera" name) then V3DgetViewportCamera viewportstr //sessionstr.V3D_defaultCamera else if (!strcmpi "Current camera shell" name) then ( let SO3ObjectGetParent (V3DgetViewportCamera viewportstr) -> node in let SO3ObjectGetSceneRoot (V3DgetSession sessionstr) -> rootnode in let nil -> ancestor in ( while (((set ancestor = SO3ObjectGetParent node) != nil) && (ancestor != rootnode)) do set node = ancestor; node; ); ) else SO3SceneGetObject (V3DgetSession sessionstr) name;; /*! @ingroup v3DApi * \brief Get a 3d object mode by it's name * * Prototype: fun [S] SO3_OBJECT * * \param S : the object name * * \return I : mode 1 if this is the default camera, 2 if this is the navigation shell, 0 if none **/ fun V3DgetObjectTypeByName(name) = if (!strcmpi "Current camera" name) then 1 else if (!strcmpi "Current camera shell" name) then 2 else 0;; /*! @ingroup v3DApi * \brief Get a camera object by type, the camera or the navigation shell * * Prototype: fun [V3Dsession SO3_OBJECT I] SO3_OBJECT * * \param V3Dsession : the scene structure * \param SO3_OBJECT : the camera * \param I : the type, 1 the same camera, 2 the navigation shell * * \return SO3_OBJECT : the object, nil if not found **/ fun V3DgetCameraByType(sessionstr, cam, type) = if (type == 2) then ( let SO3ObjectGetParent cam -> parent in let SO3ObjectGetParent parent -> ancestor in let SO3ObjectGetSceneRoot (V3DgetSession sessionstr) -> rootnode in // the navigation shell should be the 2nd parent if ((ancestor == nil) || (ancestor == rootnode)) then parent else // the navigation shell should be the 3nd parent let SO3ObjectGetParent parent -> parent in let SO3ObjectGetParent parent -> ancestor in ( if ((ancestor == nil) || (ancestor == rootnode)) then parent else ancestor; ); ) else cam;; /* ********************************************************************************************* / Viewport / ********************************************************************************************* */ /*! @ingroup v3DApi * \brief Get a viewport structure from it's index in 3d view * * Prototype: fun [V3Dview I] V3Dviewport * * \param V3Dview : the 3d view structure * \param I : the viewport index * * \return V3Dviewport : the viewport structure, nil if not found **/ fun V3DgetViewportByIndex(viewstr, idx)= switch viewstr.V3D_lViewport idx;; /*! @ingroup v3DApi * \brief Get the current viewport camera * * Prototype: fun [V3Dviewport] SO3_OBJECT * * \param V3Dviewport : the viewport structure * * \return SO3_OBJECT : the camera, nil if not set **/ fun V3DgetViewportCamera(viewportstr)= SO3ViewportGetCamera viewportstr.V3D_viewport;; /*! @ingroup v3DApi * \brief Get a viewport index in a 3d view structure * * Prototype: fun [V3Dview V3Dviewport] I * * \param V3Dview : the 3d view structure * \param V3Dviewport : the viewport structure * * \return I : the viewport index **/ fun V3DgetViewportIndex(viewstr, viewport)= let sizelist viewstr.V3D_lViewport -> size in let nil -> idx in let 0 -> i in ( while i < size && idx == nil do ( let nth_list viewstr.V3D_lViewport i -> [sidx view] in if view != viewport then nil else set idx = sidx; set i = i + 1; ); idx; );; /*! @ingroup v3DApi * \brief Set a viewport backgroung color * * Prototype: fun [V3Dviewport I] I * * \param V3Dviewport : the viewport structure * \param I : the background color * * \return 0 **/ fun V3DsetViewportColor(viewportstr, color)= set viewportstr.V3D_iBgColor = color; SO3ViewportSetBackgroundColor viewportstr.V3D_viewport color; 0;; /*! @ingroup v3DApi * \brief Get a viewport backgroung color * * Prototype: fun [V3Dviewport] I * * \param V3Dviewport : the viewport structure * * \return I : the viewport background color **/ fun V3DgetViewportColor(viewportstr)= SO3ViewportGetBackgroundColor viewportstr.V3D_viewport;; /*! @ingroup v3DApi * \brief Remove a viewport * * Prototype: fun [V3Dview V3Dviewport] I * * \param V3Dview : the 3d view structure * \param V3Dviewport : the viewport structure * * \return 0 **/ fun V3DdelViewport(viewstr, viewportstr)= SO3ViewportDestroy viewportstr.V3D_viewport; let V3DgetViewportIndex viewstr viewportstr -> idx in set viewstr.V3D_lViewport = V3DremoveIdxFromList viewstr.V3D_lViewport idx; 0;; /*! @ingroup v3DApi * \brief Add a viewport * * Prototype: fun [V3Dview F F F F I] V3Dviewport * * \param V3Dview : the 3d view structure * \param F : the X position between 0 and 1 * \param F : the Y position between 0 and 1 * \param F : the width between 0 and 1 * \param F : the height between 0 and 1 * \param I : the background color * * \return V3Dviewport : the new viewport structure **/ fun V3DaddViewport(viewstr, x, y, w, h, backcolor)= let let 0 -> i in ( while ((switch viewstr.V3D_lViewport i) != nil) do ( set i = i + 1; ); i; ) -> idx in let mkV3Dviewport [idx nil x y w h nil backcolor SO3_POLY_SOLID nil] -> newviewport in ( set viewstr.V3D_lViewport = V3Dlcat viewstr.V3D_lViewport [idx newviewport]::nil; newviewport; );; /*! @ingroup v3DApi * \brief Set a viewport polygon render mode * * Prototype: fun [V3Dviewport I] I * * \param V3Dviewport : the viewport structure * \param I : the render mode, SO3_POLY_POINTS, SO3_POLY_SOLID or SO3_POLY_WIREFRAME * * \return 0 **/ fun V3DsetViewportPolygonMode(viewportstr, mode)= set viewportstr.V3D_iPolygonMode = mode; let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in SO3CameraSetPolygonMode camera viewportstr.V3D_iPolygonMode; 0;; /*! @ingroup v3DApi * \brief Get a viewport polygon render mode * * Prototype: fun [V3Dviewport I] I * * \param V3Dviewport : the viewport structure * * \return I : the render mode, SO3_POLY_POINTS, SO3_POLY_SOLID or SO3_POLY_WIREFRAME **/ fun V3DgetViewportPolygonMode(viewportstr)= viewportstr.V3D_iPolygonMode;; /*! @ingroup v3DApi * \brief Set a viewport camera and display it * * Prototype: fun [V3Dview V3Dviewport SO3_OBJECT] I * * \param V3Dview : the 3d view structure * \param V3Dviewport : the viewport structure * \param SO3_OBJECT : the camera object * * \return 0 **/ fun V3DsetViewport(viewstr, viewportstr, camera)= if viewportstr.V3D_viewport == nil then ( SO3CameraSetPolygonMode camera viewportstr.V3D_iPolygonMode; set viewportstr.V3D_viewport = SO3ViewportCreate viewstr.V3D_channel viewstr.V3D_buffer camera viewportstr.V3D_iViewportX viewportstr.V3D_iViewportY viewportstr.V3D_iViewportW viewportstr.V3D_iViewportH viewportstr.V3D_iViewportIndex; SO3ViewportSetBackgroundColor viewportstr.V3D_viewport viewportstr.V3D_iBgColor; SO3ViewportSetShadowEnabled viewportstr.V3D_viewport 1; 0; ) else ( SO3CameraSetPolygonMode camera viewportstr.V3D_iPolygonMode; SO3CameraSetViewport viewportstr.V3D_viewport camera; 0; ); 0;; /*! @ingroup v3DApi * \brief Resize a viewport * * Prototype: fun [V3Dviewport F F F F] I * * \param V3Dviewport : the viewport structure * \param F : the X position between 0 and 1 * \param F : the Y position between 0 and 1 * \param F : the width between 0 and 1 * \param F : the height between 0 and 1 * * \return 0 **/ fun V3DsetViewportPositionSize(viewportstr, x, y, w, h)= if viewportstr.V3D_viewport == nil then nil else ( set viewportstr.V3D_iViewportX = x; set viewportstr.V3D_iViewportY = y; set viewportstr.V3D_iViewportW = w; set viewportstr.V3D_iViewportH = h; SO3ViewportSetPositionSize viewportstr.V3D_viewport x y w h; ); 0;; /*! @ingroup v3DApi * \brief Change a viewport camera * * Prototype: fun [V3Dsession V3Dviewport SO3_OBJECT] I * * \param V3Dsession : the 3d scene structure * \param V3Dviewport : the viewport structure * \param SO3_OBJECT : the camera object * * \return 0 **/ fun V3DchangeCameraViewport(sessionstr, viewportstr, camera)= let if viewportstr == nil then V3DgetDefaultViewport (V3DgetSessionView sessionstr) else viewportstr -> viewportstr in ( V3DsetViewport (V3DgetSessionView sessionstr) viewportstr camera; exec sessionstr.V3D_sessionView.V3D_cbCameraChange with [sessionstr.V3D_sessionView sessionstr camera]; ); 0;; /*! @ingroup v3DApi * \brief Add a compositor to a viewport * * Prototype: fun [V3Dviewport S S] I * * \param V3Dviewport : the viewport structure * \param S : the compositor name * \param S : the compositor scheme name * * \return 0 **/ fun V3DregisterCompositor(viewportstr, compo, scheme)= set viewportstr.V3D_lCompositor = V3DremoveSidxFromList viewportstr.V3D_lCompositor compo; set viewportstr.V3D_lCompositor = [compo scheme]::viewportstr.V3D_lCompositor; 0;; /*! @ingroup v3DApi * \brief Remove a compositor from a viewport * * Prototype: fun [V3Dviewport S] I * * \param V3Dviewport : the viewport structure * \param S : the compositor name * * \return 0 **/ fun V3DunRegisterCompositor(viewportstr, compo)= set viewportstr.V3D_lCompositor = V3DremoveSidxFromList viewportstr.V3D_lCompositor compo; 0;; /*! @ingroup v3DApi * \brief Get the scheme name associated with a viewport compositor * * Prototype: fun [V3Dviewport S] S * * \param V3Dviewport : the viewport structure * \param S : the compositor name * * \return S : the compositor scheme name **/ fun V3DgetCompositorScheme(viewportstr, compo)= switchstr viewportstr.V3D_lCompositor compo;; /* ********************************************************************************************* / Camera / ********************************************************************************************* */ /*! @ingroup v3DApi * \brief Set a camera settings * * Prototype: fun [SO3_OBJECT F F F F] SO3_OBJECT * * \param SO3_OBJECT : the camera object * \param F : FOV length * \param F : FOVy * \param F : near clip distance * \param F : far clip distance * * \return SO3_OBJECT : the same camera **/ fun V3DsetCamera(camera, fovlength, fovy, nclip, fclip)= if fovlength == nil then nil else SO3CameraSetFocalLength camera fovlength; if fovy == nil then nil else SO3CameraSetFOVy camera fovy; if nclip == nil then nil else SO3CameraSetNearClipDistance camera nclip; if fclip == nil then nil else SO3CameraSetFarClipDistance camera fclip; camera;; fun V3DgetCameraByIndex(sessionstr, idx)= switch sessionstr.V3D_lCamera idx;; fun V3DgetCameraIndex(sessionstr, camera)= let sizelist sessionstr.V3D_lCamera -> size in let nil -> idx in let 0 -> i in ( while i < size && idx == nil do ( let nth_list sessionstr.V3D_lCamera i -> [sidx cam] in if cam != camera then nil else set idx = sidx; set i = i + 1; ); idx; );; fun V3DrestaurePreviousDefaultCamera(sessionstr)= if (sessionstr.V3D_lPrevDefaultCamera != nil) then ( set sessionstr.V3D_defaultCamera = hd sessionstr.V3D_lPrevDefaultCamera; set sessionstr.V3D_lPrevDefaultCamera = tl sessionstr.V3D_lPrevDefaultCamera; exec sessionstr.V3D_sessionView.V3D_cbCameraChange with [sessionstr.V3D_sessionView sessionstr sessionstr.V3D_defaultCamera]; 0; ) else let SO3SceneGetObject (V3DgetSession sessionstr) "default_camera" -> defaultcam in ( set sessionstr.V3D_defaultCamera = defaultcam; exec sessionstr.V3D_sessionView.V3D_cbCameraChange with [sessionstr.V3D_sessionView sessionstr defaultcam]; 0; ); V3DchangeCameraViewport sessionstr (V3DgetDefaultViewport sessionstr.V3D_sessionView) sessionstr.V3D_defaultCamera; 0;; /*! @ingroup v3DApi * \brief Get the current default camera * * Prototype: fun [V3Dsession] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * * \return SO3_OBJECT : the camera **/ fun V3DgetDefaultCamera(sessionstr)= sessionstr.V3D_defaultCamera;; /*! @ingroup v3DApi * \brief Set the current default camera * * Prototype: fun [V3Dsession SO3_OBJECT] I * * \param V3Dsession : the 3d scene structure * \param SO3_OBJECT : the new default camera * * \return 0 **/ fun V3DsetDefaultCamera(sessionstr, camera)= if (camera == nil) || (camera == sessionstr.V3D_defaultCamera) then nil else ( set sessionstr.V3D_lPrevDefaultCamera = sessionstr.V3D_defaultCamera::sessionstr.V3D_lPrevDefaultCamera; set sessionstr.V3D_defaultCamera = camera; exec sessionstr.V3D_sessionView.V3D_cbCameraChange with [sessionstr.V3D_sessionView sessionstr camera]; V3DchangeCameraViewport sessionstr (V3DgetDefaultViewport sessionstr.V3D_sessionView) sessionstr.V3D_defaultCamera; ); 0;; /*! @ingroup v3DApi * \brief Remove the default camera * * Prototype: fun [V3Dsession SO3_OBJECT] I * * \param V3Dsession : the 3d scene structure * \param SO3_OBJECT : the default camera * * \return 0 **/ fun V3DremoveDefaultCamera(sessionstr, camera)= if (camera == nil) then nil else ( set sessionstr.V3D_lPrevDefaultCamera = remove_from_list sessionstr.V3D_lPrevDefaultCamera camera; if (camera != sessionstr.V3D_defaultCamera) then nil else V3DrestaurePreviousDefaultCamera sessionstr; ); 0;; fun V3DsetOrthographicMode(camera, mode)= SO3CameraSetProjectionType camera (if mode then SO3_PROJECTION_ORTHOGRAPHIC else SO3_PROJECTION_PERSPECTIVE); 0;; fun V3DgetOrthographicMode(camera)= if ((SO3CameraGetProjectionType camera) == SO3_PROJECTION_ORTHOGRAPHIC) then 1 else 0;; fun V3DsetOrthographicScale(camera, scale)= if !(V3DgetOrthographicMode camera) then nil else let if scale <. 0.1 then 0.1 else scale -> scale in let SO3CameraGetViewport camera -> viewport in let SO3ViewportGetPixelPositionSize viewport -> [_ _ vw vh] in let if (vh <= 0) then 1 else vh -> vh in let ((itof vw) /. (itof vh)) *. scale -> wscale in SO3CameraSetOrthoWindow camera wscale scale; 0;; fun V3DgetOrthographicScale(camera)= let SO3CameraGetOrthoWindow camera -> [_ scale] in scale;; fun V3DsetCbCameraChange(viewstr, cbfun)= set viewstr.V3D_cbCameraChange = cbfun; 0;; /*! @ingroup v3DApi * \brief Remove a camera * * Prototype: fun [V3Dsession SO3_OBJECT] I * * \param V3Dsession : the 3d scene structure * \param SO3_OBJECT : the camera * * \return 0 **/ fun V3DdelCamera(sessionstr, camera)= // remove this camera from the previous default camera list if this camera have been a default camera set sessionstr.V3D_lPrevDefaultCamera = remove_from_list sessionstr.V3D_lPrevDefaultCamera camera; if camera != sessionstr.V3D_defaultCamera then nil else V3DrestaurePreviousDefaultCamera sessionstr; let V3DgetCameraIndex sessionstr camera -> idx in set sessionstr.V3D_lCamera = V3DremoveIdxFromList sessionstr.V3D_lCamera idx; SO3ObjectDestroy camera; 0;; /*! @ingroup v3DApi * \brief Add a camera * * Prototype: fun [V3Dsession S] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the camera name (the name must be unique) * * \return SO3_OBJECT : the new camera **/ fun V3DaddCamera(sessionstr, name)= let let 0 -> i in ( while ((switch sessionstr.V3D_lCamera i) != nil) do ( set i = i + 1; ); i; ) -> idx in let SO3CameraCreate (V3DgetSession sessionstr) name -> newcam in ( set sessionstr.V3D_lCamera = V3Dlcat sessionstr.V3D_lCamera [idx newcam]::nil; if sessionstr.V3D_defaultCamera != nil then nil else set sessionstr.V3D_defaultCamera = newcam; newcam; );; /* ********************************************************************************************* / Particle Sytem / ********************************************************************************************* */ /*! @ingroup v3DApi * \brief Add a particle system * * Prototype: fun [V3Dsession S S] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the particle system name (the name must be unique) * \param S : the particle template name * * \return SO3_OBJECT : the new particle system **/ fun V3DaddParticleSystem(sessionstr, name, template)= SO3ParticleSystemCreateFromTemplate (V3DgetSession sessionstr) name template;; /* ********************************************************************************************* / Lights / ********************************************************************************************* */ /*! @ingroup v3DApi * \brief Set a light parameters * * Prototype: fun [SO3_OBJECT I I I F F F F] SO3_OBJECT * * \param SO3_OBJECT : the light object * \param I : the light type SO3_POINT_LIGHT, SO3_DIRECTIONAL_LIGHT or SO3_SPOT_LIGHT * \param I : diffuse color * \param I : specular color * \param F : light range * \param F : constant attenuation * \param F : linear attenuation * \param F : quadratic attenuation * * \return SO3_OBJECT : the same light object **/ fun V3DsetLight(light, type, dcolor, scolor, range, const, linear, quadr)= if (light == nil) then nil else ( SO3LightSetType light type; SO3LightSetDiffuseColor light dcolor; SO3LightSetSpecularColor light scolor; SO3LightSetAttenuation light [range const linear quadr]; light; );; /*! @ingroup v3DApi * \brief Enable or Disable a light * * Prototype: fun [SO3_OBJECT I] I * * \param SO3_OBJECT : the light object * \param I : 1 to enable the light, 0 to disable * * \return 0 **/ fun V3DenableLight(light, state)= SO3LightSetVisible light state; 0;; /*! @ingroup v3DApi * \brief Add a light * * Prototype: fun [V3Dsession S SO3_OBJECT I I I F F F F] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the light name (must be unique) * \param SO3_OBJECT : the parent node * \param I : the light type SO3_POINT_LIGHT, SO3_DIRECTIONAL_LIGHT or SO3_SPOT_LIGHT * \param I : diffuse color * \param I : specular color * \param F : light range * \param F : constant attenuation * \param F : linear attenuation * \param F : quadratic attenuation * * \return SO3_OBJECT : the new light object **/ fun V3DaddLight(sessionstr, name, father, type, dcolor, scolor, range, const, linear, quadr)= if sessionstr == nil then nil else let SO3LightCreate (V3DgetSession sessionstr) name -> light in ( if father == nil then nil else SO3ObjectLink light father; SO3LightSetType light type; SO3LightSetDiffuseColor light dcolor; SO3LightSetSpecularColor light scolor; SO3LightSetAttenuation light [range const linear quadr]; //SO3LightSetVisible light 0; //SO3LightSetSpotFallOff light falloff; //SO3LightSetPowerScale light 1000.0; //SO3ObjectLookAt light [0.0 0.0 0.0] 2; light; );; /*! @ingroup v3DApi * \brief Add a resource to a scene * * Prototype: fun [V3Dsession S S I] I * * \param V3Dsession : the 3d scene structure * \param S : the resource path * \param S : the resource group name * \param I : the resource type SO3_RESOURCE_MESH, SO3_RESOURCE_MATERIAL, SO3_RESOURCE_TEXTURE, SO3_RESOURCE_SKELETON, SO3_RESOURCE_GPUPROGRAM, SO3_RESOURCE_HIGHLEVELGPUPROGRAM or SO3_RESOURCE_PARTICLE_SYSTEM * * \return 0 **/ fun V3DaddResource(sessionstr, ressource, group, type)= let V3DgetPathFile ressource "" -> [longfile filename] in if longfile == nil && filename == nil then nil else ( if (filename == nil) then nil //SO3AddResourceLocationDirectory group (substr longfile 0 ((strlen longfile) - 1)) else if (V3DisUrl ressource) then nil //SO3AddResourceLocationURL group ressource else if (!strcmpi (V3DgetFileExt filename) "zip") then SO3AddResourceLocationZIP group _checkpack ressource else SO3SceneLoadResource (V3DgetSession sessionstr) group (_checkpack ressource) type; ); 0;; /*! @ingroup v3DApi * \brief Add a mesh to a scene * * Prototype: fun [V3Dsession S S I S SO3_OBJECT] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the mesh path * \param S : the mesh name * \param I : the mesh index (must be unique) * \param S : the resource group name * \param SO3_OBJECT : the parent node * * \return SO3_OBJECT : the new mesh **/ fun V3DaddMesh(sessionstr, file, name, idx, group, father)= if (sessionstr == nil) || (file == nil) then nil else ( V3DaddResource sessionstr file group SO3_RESOURCE_MESH; let SO3SceneLoadEntity (V3DgetSession sessionstr) group strcatn idx::"."::name::nil _checkpack file -> mesh in ( if father == nil then nil else SO3ObjectLink mesh father; mesh; ); );; fun cbV3DObjectLoaded(obj, p)= let p -> [cbfun sessionstr] in exec cbfun with [sessionstr obj]; 0;; /*! @ingroup v3DApi * \brief Add a mesh to a scene, the mesh is loaded in a background thread * * Prototype: fun [V3Dsession S S I S SO3_OBJECT fun [V3Dsession SO3_OBJECT] I] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the mesh path * \param S : the mesh name * \param I : the mesh index (must be unique) * \param S : the resource group name * \param SO3_OBJECT : the parent node * \param fun [V3Dsession SO3_OBJECT] I : loaded callback * * \return SO3_OBJECT : the new mesh **/ fun V3DloadMesh(sessionstr, file, name, idx, group, father, cbfun)= if (sessionstr == nil) || (file == nil) then nil else ( V3DaddResource sessionstr file group SO3_RESOURCE_MESH; let SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) group strcatn idx::"."::name::nil _checkpack file @cbV3DObjectLoaded [cbfun sessionstr] -> mesh in ( if father == nil then nil else SO3ObjectLink mesh father; mesh; ); );; /*! @ingroup v3DApi * \brief Add a shell node to a scene * * Prototype: fun [V3Dsession S I SO3_OBJECT [F F F] [F F F F]] SO3_OBJECT * * \param V3Dsession : the 3d scene structure * \param S : the shell name * \param I : the shell index (must be unique) * \param SO3_OBJECT : the parent node, this can be nil * \param [F F F] : the shell position, this can be nil * \param [F F F F] : the shell orientation (quaternion), this can be nil * * \return SO3_OBJECT : the new shell node **/ fun V3DaddShell(sessionstr, name, idx, father, pos, ang)= if sessionstr == nil then nil else let if name == nil || (!strcmp name "") then idx else if idx == nil || (!strcmp idx "") then name else strcatn idx::"."::name::nil -> name in let SO3SceneNodeCreate (V3DgetSession sessionstr) name -> shell in ( if father == nil then nil else SO3ObjectLink shell father; if pos == nil then nil else SO3ObjectSetPosition shell pos; if ang == nil then nil else SO3ObjectSetOrientation shell ang; shell; );; fun V3DsetAxisRef(axisstr, ref)= set axisstr.V3D_iAxisRef = ref; 0;; fun V3DsetDefaultAxisRef(ref)= set iDefaultAxisRef = ref; let sizelist lV3DSessions -> size in let 0 -> i in while (i < size) do ( let nth_list lV3DSessions i -> [_ sessionstr] in let sizelist sessionstr.V3D_lAxis -> axsize in let 0 -> j in while (j < axsize) do ( let nth_list sessionstr.V3D_lAxis j -> [_ axisstr] in V3DsetAxisRef axisstr ref; set j = j + 1; ); set i = i + 1; ); 0;; // update axis pos and scale fun V3DupdateObjectAxis(viewstr, sessionstr, axisstr)= if (axisstr == nil) || (axisstr.V3D_axisFather) == nil then nil else let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let SO3ObjectGetGlobalPosition camera -> [cx cy cz] in let SO3ObjectGetGlobalPosition axisstr.V3D_axisFather -> [ox oy oz] in let if (axisstr.V3D_iAxisRef == 0) then (SO3ObjectGetGlobalOrientation axisstr.V3D_axisFather) else if (axisstr.V3D_iAxisRef == 1) then [0.0 0.0 0.0 1.0] else (SO3ObjectGetGlobalOrientation camera) -> quat in let if (viewstr.V3D_bVRmode) then 400 else let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ _ wvh] in wvh -> vh in let if (vh <= 0) then 1 else vh -> vh in // same object size on different distances let if (viewstr.V3D_bVRmode) then 45.0 *. 0.0174533 else SO3CameraGetFOVy camera -> fovy in let if fovy <=. 0.0 then 0.000001 else fovy -> fovy in let V3DgetOrthographicMode camera -> ortho in let if ortho then 1.0 else fovy -> fovy in let normalizeVectorF (SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [0.0 0.0 (-.1.0)]) -> dir in let if ortho then V3DgetOrthographicScale camera else if (viewstr.V3D_bVRmode) then getVectorDistanceF [ox oy oz] [cx cy cz] else dotVectorF (subVectorF [ox oy oz] [cx cy cz]) dir -> dist in let maxf 0.000001 ((dist /. ((itof vh) /. 2.0)) *. fovy) /. 2.0 -> scale in //let if ortho then zdist else sqrt ((sqr(cx -. ox)) +. (sqr(cy -. oy)) +. (sqr(cz -. oz))) -> dist in //let if (ortho) then let SO3CameraGetOrthoWindow camera -> [scalex scaley] in (scalex /. scaley) *. 0.002 else maxf 0.000001 ((dist /. ((itof vh) /. 2.0)) *. fovy) /. 2.0 -> scale in ( SO3ObjectSetPosition axisstr.V3D_axisShell [ox oy oz]; SO3ObjectSetOrientation axisstr.V3D_axisShell quat; SO3ObjectSetScale axisstr.V3D_axisShell [scale scale scale]; SO3ObjectSetGlobalOrientation axisstr.V3D_xAxisTextObject (SO3ObjectGetNodeFacingOrientation axisstr.V3D_xAxisTextObject camera nil nil); SO3ObjectSetGlobalOrientation axisstr.V3D_yAxisTextObject (SO3ObjectGetNodeFacingOrientation axisstr.V3D_yAxisTextObject camera nil nil); SO3ObjectSetGlobalOrientation axisstr.V3D_zAxisTextObject (SO3ObjectGetNodeFacingOrientation axisstr.V3D_zAxisTextObject camera nil nil); ); axisstr;; fun V3DupdateAxisTarget(viewstr, sessionstr)= let sizelist sessionstr.V3D_lAxis -> size in let 0 -> i in while i < size do ( let nth_list sessionstr.V3D_lAxis i -> [refobj axisstr] in V3DupdateObjectAxis viewstr sessionstr axisstr; set i = i + 1; ); 0;; fun cbV3DAxisLoaded(mesh, p)= let p -> [mode axisstr] in let if mode == 1 then axisstr.V3D_xAxisMaterial else if mode == 2 then axisstr.V3D_yAxisMaterial else if mode == 3 then axisstr.V3D_zAxisMaterial else axisstr.V3D_hAxisMaterial -> mat in ( SO3EntitySetMaterial mesh mat 0; SO3EntitySetVisibilityFlagIndexEnable mesh 3 0; SO3ObjectSetMouseForeGround mesh 1; SO3ObjectSetFlags mesh iNodeFlagTools; SO3ObjectSetCastShadows mesh 0; SO3ObjectSetRenderOverlay mesh 1; ); 0;; fun V3DshowObjectAxis(viewstr, sessionstr, refobj, mode, state)= if (refobj == nil) then nil else if state then let (switch sessionstr.V3D_lAxis refobj) -> axisstr in let make_rgba 255 0 0 255 -> xcolor in let make_rgba 0 255 0 255 -> ycolor in let make_rgba 0 0 255 255 -> zcolor in let make_rgba 0 145 237 255 -> hcolor in let make_rgba 255 255 0 255 -> scolor in let if (axisstr != nil) then axisstr else mkV3Daxis [nil nil nil nil nil nil nil nil nil nil nil nil nil xcolor ycolor zcolor hcolor scolor iDefaultAxisRef nil nil nil nil nil nil] -> axisstr in let SO3ObjectGetName refobj -> refname in let SO3ObjectGetGlobalPosition refobj -> pos in let SO3ObjectGetGlobalOrientation refobj -> quat in let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in ( if (axisstr.V3D_iAxisMode == mode) then ( SO3ObjectSetPosition axisstr.V3D_axisShell pos; SO3ObjectSetOrientation axisstr.V3D_axisShell quat; axisstr; ) else ( set sessionstr.V3D_lAxis = V3DremoveIdxFromList sessionstr.V3D_lAxis refobj; set axisstr.V3D_iAxisMode = mode; // reset axis if exist SO3ObjectDestroy axisstr.V3D_xAxisObject; SO3ObjectDestroy axisstr.V3D_yAxisObject; SO3ObjectDestroy axisstr.V3D_zAxisObject; SO3ObjectDestroy axisstr.V3D_hAxisObject; SO3ObjectDestroy axisstr.V3D_xAxisTextObject; SO3ObjectDestroy axisstr.V3D_yAxisTextObject; SO3ObjectDestroy axisstr.V3D_zAxisTextObject; SO3ObjectDestroy axisstr.V3D_axisShell; set axisstr.V3D_xAxisObject = nil; set axisstr.V3D_yAxisObject = nil; set axisstr.V3D_zAxisObject = nil; set axisstr.V3D_hAxisObject = nil; set axisstr.V3D_xAxisTextObject = nil; set axisstr.V3D_yAxisTextObject = nil; set axisstr.V3D_zAxisTextObject = nil; set axisstr.V3D_axisShell = nil; if (axisstr.V3D_xAxisMaterial != nil) then nil else ( set axisstr.V3D_xAxisMaterial = SO3MaterialCreate (V3DgetSession sessionstr) strcat refname "_os3d_axis_x" sV3DResourcesGroup; SO3MaterialSetReceiveShadows axisstr.V3D_xAxisMaterial 0; SO3MaterialSetIgnoreSlicePlane axisstr.V3D_xAxisMaterial 1; SO3MaterialSetSelfIllumination axisstr.V3D_xAxisMaterial xcolor; SO3MaterialSetAmbient axisstr.V3D_xAxisMaterial xcolor; SO3MaterialSetDiffuse axisstr.V3D_xAxisMaterial xcolor; SO3MaterialSetSpecular axisstr.V3D_xAxisMaterial xcolor; SO3MaterialSetShininess axisstr.V3D_xAxisMaterial 100.0; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_xAxisMaterial 0 0 0; SO3MaterialSetPassCullingEnable axisstr.V3D_xAxisMaterial 0 0 0; SO3MaterialAddTechnique axisstr.V3D_xAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_xAxisMaterial 1 "HDR"; SO3MaterialAddPass axisstr.V3D_xAxisMaterial 1; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_xAxisMaterial 1 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_xAxisMaterial 1 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_xAxisMaterial 1 0 0; SO3MaterialAddTechnique axisstr.V3D_xAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_xAxisMaterial 2 "SSAO"; SO3MaterialAddPass axisstr.V3D_xAxisMaterial 2; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_xAxisMaterial 2 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_xAxisMaterial 2 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_xAxisMaterial 2 0 0; ); if (axisstr.V3D_yAxisMaterial != nil) then nil else ( set axisstr.V3D_yAxisMaterial = SO3MaterialCreate (V3DgetSession sessionstr) strcat refname "_os3d_axis_y" sV3DResourcesGroup; SO3MaterialSetReceiveShadows axisstr.V3D_yAxisMaterial 0; SO3MaterialSetIgnoreSlicePlane axisstr.V3D_yAxisMaterial 1; SO3MaterialSetSelfIllumination axisstr.V3D_yAxisMaterial ycolor; SO3MaterialSetAmbient axisstr.V3D_yAxisMaterial ycolor; SO3MaterialSetDiffuse axisstr.V3D_yAxisMaterial ycolor; SO3MaterialSetSpecular axisstr.V3D_yAxisMaterial ycolor; SO3MaterialSetShininess axisstr.V3D_yAxisMaterial 100.0; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_yAxisMaterial 0 0 0; SO3MaterialSetPassCullingEnable axisstr.V3D_yAxisMaterial 0 0 0; SO3MaterialAddTechnique axisstr.V3D_yAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_yAxisMaterial 1 "HDR"; SO3MaterialAddPass axisstr.V3D_yAxisMaterial 1; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_yAxisMaterial 1 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_yAxisMaterial 1 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_yAxisMaterial 1 0 0; SO3MaterialAddTechnique axisstr.V3D_yAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_yAxisMaterial 2 "SSAO"; SO3MaterialAddPass axisstr.V3D_yAxisMaterial 2; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_yAxisMaterial 2 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_yAxisMaterial 2 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_yAxisMaterial 2 0 0; ); if (axisstr.V3D_zAxisMaterial != nil) then nil else ( set axisstr.V3D_zAxisMaterial = SO3MaterialCreate (V3DgetSession sessionstr) strcat refname "_os3d_axis_z" sV3DResourcesGroup; SO3MaterialSetReceiveShadows axisstr.V3D_zAxisMaterial 0; SO3MaterialSetIgnoreSlicePlane axisstr.V3D_zAxisMaterial 1; SO3MaterialSetSelfIllumination axisstr.V3D_zAxisMaterial zcolor; SO3MaterialSetAmbient axisstr.V3D_zAxisMaterial zcolor; SO3MaterialSetDiffuse axisstr.V3D_zAxisMaterial zcolor; SO3MaterialSetSpecular axisstr.V3D_zAxisMaterial zcolor; SO3MaterialSetShininess axisstr.V3D_zAxisMaterial 100.0; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_zAxisMaterial 0 0 0; SO3MaterialSetPassCullingEnable axisstr.V3D_zAxisMaterial 0 0 0; SO3MaterialAddTechnique axisstr.V3D_zAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_zAxisMaterial 1 "HDR"; SO3MaterialAddPass axisstr.V3D_zAxisMaterial 1; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_zAxisMaterial 1 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_zAxisMaterial 1 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_zAxisMaterial 1 0 0; SO3MaterialAddTechnique axisstr.V3D_zAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_zAxisMaterial 2 "SSAO"; SO3MaterialAddPass axisstr.V3D_zAxisMaterial 2; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_zAxisMaterial 2 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_zAxisMaterial 2 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_zAxisMaterial 2 0 0; ); if (axisstr.V3D_hAxisMaterial != nil) then nil else ( set axisstr.V3D_hAxisMaterial = SO3MaterialCreate (V3DgetSession sessionstr) strcat refname "_os3d_axis_h" sV3DResourcesGroup; SO3MaterialSetReceiveShadows axisstr.V3D_hAxisMaterial 0; SO3MaterialSetIgnoreSlicePlane axisstr.V3D_hAxisMaterial 1; SO3MaterialSetSelfIllumination axisstr.V3D_hAxisMaterial hcolor; SO3MaterialSetAmbient axisstr.V3D_hAxisMaterial hcolor; SO3MaterialSetDiffuse axisstr.V3D_hAxisMaterial hcolor; SO3MaterialSetSpecular axisstr.V3D_hAxisMaterial hcolor; SO3MaterialSetShininess axisstr.V3D_hAxisMaterial 100.0; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_hAxisMaterial 0 0 0; //SO3MaterialSetPassCullingEnable axisstr.V3D_hAxisMaterial 0 0 0; SO3MaterialAddTechnique axisstr.V3D_hAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_hAxisMaterial 1 "HDR"; SO3MaterialAddPass axisstr.V3D_hAxisMaterial 1; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_hAxisMaterial 1 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_hAxisMaterial 1 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_hAxisMaterial 1 0 0; SO3MaterialAddTechnique axisstr.V3D_hAxisMaterial; SO3MaterialSetTechniqueSchemeName axisstr.V3D_hAxisMaterial 2 "SSAO"; SO3MaterialAddPass axisstr.V3D_hAxisMaterial 2; SO3MaterialSetPassDepthCheckEnabled axisstr.V3D_hAxisMaterial 2 0 0; SO3MaterialSetPassDepthWriteEnabled axisstr.V3D_hAxisMaterial 2 0 0; SO3MaterialSetPassColourWriteEnabled axisstr.V3D_hAxisMaterial 2 0 0; ); set axisstr.V3D_axisFather = refobj; set axisstr.V3D_axisShell = SO3SceneNodeCreate (V3DgetSession sessionstr) strcat refname ".coord_axis"; SO3ObjectSetFlags axisstr.V3D_axisShell iNodeFlagTools; if mode == 1 then ( set axisstr.V3D_xAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_x" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_x.mesh") @cbV3DAxisLoaded [1 axisstr]; set axisstr.V3D_yAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_y" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_y.mesh") @cbV3DAxisLoaded [2 axisstr]; set axisstr.V3D_zAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_z" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_z.mesh") @cbV3DAxisLoaded [3 axisstr]; ) else if mode == 2 then ( set axisstr.V3D_xAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_ang_axis_x" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_x.mesh") @cbV3DAxisLoaded [1 axisstr]; set axisstr.V3D_yAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_ang_axis_y" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_y.mesh") @cbV3DAxisLoaded [2 axisstr]; set axisstr.V3D_zAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_ang_axis_z" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_z.mesh") @cbV3DAxisLoaded [3 axisstr]; ) else if mode == 3 then ( set axisstr.V3D_xAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_scale_x" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_x.mesh") @cbV3DAxisLoaded [1 axisstr]; set axisstr.V3D_yAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_scale_y" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_y.mesh") @cbV3DAxisLoaded [2 axisstr]; set axisstr.V3D_zAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_scale_z" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_z.mesh") @cbV3DAxisLoaded [3 axisstr]; set axisstr.V3D_hAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_h_scale" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_h_scale.mesh") @cbV3DAxisLoaded [4 axisstr]; ) else ( set axisstr.V3D_xAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_x" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_x.mesh") @cbV3DAxisLoaded [1 axisstr]; set axisstr.V3D_yAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_y" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_y.mesh") @cbV3DAxisLoaded [2 axisstr]; set axisstr.V3D_zAxisObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_z" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_z.mesh") @cbV3DAxisLoaded [3 axisstr]; ); set axisstr.V3D_xAxisTextObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_text_x" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_x.mesh") @cbV3DAxisLoaded [1 axisstr]; set axisstr.V3D_yAxisTextObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_text_y" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_y.mesh") @cbV3DAxisLoaded [2 axisstr]; set axisstr.V3D_zAxisTextObject = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".coords_axis_text_z" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_z.mesh") @cbV3DAxisLoaded [3 axisstr]; SO3ObjectLink axisstr.V3D_xAxisObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_yAxisObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_zAxisObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_hAxisObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_xAxisTextObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_yAxisTextObject axisstr.V3D_axisShell; SO3ObjectLink axisstr.V3D_zAxisTextObject axisstr.V3D_axisShell; SO3ObjectSetPosition axisstr.V3D_xAxisTextObject [95.0 0.0 0.0]; SO3ObjectSetPosition axisstr.V3D_yAxisTextObject [0.0 95.0 0.0]; SO3ObjectSetPosition axisstr.V3D_zAxisTextObject [0.0 0.0 95.0]; SO3ObjectSetPosition axisstr.V3D_axisShell pos; SO3ObjectSetOrientation axisstr.V3D_axisShell quat; /* SO3ObjectSetAutoTracking axisstr.V3D_xAxisTextObject camera 1 [0.0 0.0 (-.1.0)] nil; SO3ObjectSetAutoTracking axisstr.V3D_yAxisTextObject camera 1 [0.0 0.0 (-.1.0)] nil; SO3ObjectSetAutoTracking axisstr.V3D_zAxisTextObject camera 1 [0.0 0.0 (-.1.0)] nil; */ set sessionstr.V3D_lAxis = V3Dlcat sessionstr.V3D_lAxis [refobj axisstr]::nil; axisstr; ); V3DupdateObjectAxis viewstr sessionstr axisstr; ) else ( let (switch sessionstr.V3D_lAxis refobj) -> axisstr in if axisstr == nil then nil else ( SO3ObjectDestroy axisstr.V3D_xAxisObject; SO3ObjectDestroy axisstr.V3D_yAxisObject; SO3ObjectDestroy axisstr.V3D_zAxisObject; SO3ObjectDestroy axisstr.V3D_hAxisObject; SO3ObjectDestroy axisstr.V3D_xAxisTextObject; SO3ObjectDestroy axisstr.V3D_yAxisTextObject; SO3ObjectDestroy axisstr.V3D_zAxisTextObject; SO3ObjectDestroy axisstr.V3D_axisShell; set axisstr.V3D_xAxisObject = nil; set axisstr.V3D_yAxisObject = nil; set axisstr.V3D_zAxisObject = nil; set axisstr.V3D_hAxisObject = nil; set axisstr.V3D_xAxisTextObject = nil; set axisstr.V3D_yAxisTextObject = nil; set axisstr.V3D_zAxisTextObject = nil; set axisstr.V3D_axisShell = nil; SO3MaterialDestroy axisstr.V3D_xAxisMaterial; SO3MaterialDestroy axisstr.V3D_yAxisMaterial; SO3MaterialDestroy axisstr.V3D_zAxisMaterial; SO3MaterialDestroy axisstr.V3D_hAxisMaterial; set sessionstr.V3D_lAxis = V3DremoveIdxFromList sessionstr.V3D_lAxis refobj; ); nil; );; // update axis pos and scale fun V3DupdateObjectHelper(viewstr, sessionstr, helperstr)= if (helperstr == nil) || (helperstr.V3D_helperFather) == nil then nil else let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let SO3ObjectGetGlobalPosition camera -> [cx cy cz] in let SO3ObjectGetGlobalPosition helperstr.V3D_helperFather -> [ox oy oz] in let SO3ObjectGetGlobalOrientation helperstr.V3D_helperFather -> quat in let if (viewstr.V3D_bVRmode) then 400 else let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ _ wvh] in wvh -> vh in let if (vh <= 0) then 1 else vh -> vh in // same object size on different distances let if (viewstr.V3D_bVRmode) then 45.0 *. 0.0174533 else SO3CameraGetFOVy camera -> fovy in let if fovy <=. 0.0 then 0.000001 else fovy -> fovy in let if V3DgetOrthographicMode camera then 1.0 else fovy -> fovy in let SO3ObjectGetPosition camera -> [_ _ zdist] in let if V3DgetOrthographicMode camera then zdist else sqrt ((sqr(cx -. ox)) +. (sqr(cy -. oy)) +. (sqr(cz -. oz))) -> dist in let maxf 0.000001 ((dist /. ((itof vh) /. 2.0)) *. fovy) /. 2.0 -> scale in ( //hide the default camera helper (seen in othographic mode) if (helperstr.V3D_helperFather != (V3DgetDefaultCamera sessionstr)) then nil else SO3ObjectSetVisible helperstr.V3D_helperIcon 0 0; SO3ObjectSetPosition helperstr.V3D_helperIcon [ox oy oz]; SO3ObjectSetOrientation helperstr.V3D_helperIcon quat; SO3ObjectSetScale helperstr.V3D_helperIcon [scale scale scale]; ); 0;; fun V3DupdateHelper(viewstr, sessionstr, l)= if (l == nil) then nil else ( let hd l -> [refobj helperstr] in V3DupdateObjectHelper viewstr sessionstr helperstr; V3DupdateHelper viewstr sessionstr tl l; ); 0;; fun V3DupdateHelpersTarget(viewstr, sessionstr)= if !sessionstr.V3D_bHelpersState then nil else V3DupdateHelper viewstr sessionstr sessionstr.V3D_lHelper; 0;; fun cbV3DHelperLoaded(mesh, helperstr)= //change to render priority SO3ObjectSetCastShadows mesh 0; SO3ObjectSetRenderQueue mesh 49; SO3EntitySetVisibilityFlagIndexEnable mesh 3 0; SO3ObjectSetFlags mesh iNodeFlagTools; 0;; fun V3DshowObjectHelper(viewstr, sessionstr, refobj, mode, state)= if (refobj == nil) then nil else if state then let (switch sessionstr.V3D_lHelper refobj) -> phelperstr in let if phelperstr != nil then phelperstr else mkV3Dhelper [nil nil mode] -> helperstr in let SO3ObjectGetName refobj -> refname in let SO3ObjectGetGlobalPosition refobj -> pos in let SO3ObjectGetGlobalOrientation refobj -> quat in ( if ((sizelist sessionstr.V3D_lHelper) > iMaxHelpers) then ( V3DenableHelpers (V3DgetDefaultViewport viewstr) sessionstr 0; 0; ) else ( // reset helper if exist if phelperstr == nil then nil else ( SO3ObjectDestroy phelperstr.V3D_helperIcon; set sessionstr.V3D_lHelper = V3DremoveIdxFromList sessionstr.V3D_lHelper refobj; ); set helperstr.V3D_helperFather = refobj; if !sessionstr.V3D_bHelpersState then nil else ( if mode == 4 then // light ( let SO3LightGetType refobj -> lightType in if(lightType == SO3_DIRECTIONAL_LIGHT) then set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_dir_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dir_light.mesh") @cbV3DHelperLoaded helperstr else if(lightType == SO3_SPOT_LIGHT) then set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_spot_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_spot_light.mesh") @cbV3DHelperLoaded helperstr else set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_light.mesh") @cbV3DHelperLoaded helperstr; ) else if mode == 8 then // camera ( set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_camera" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_camera.mesh") @cbV3DHelperLoaded helperstr; ) else // dummy ( set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_dummy" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dummy.mesh") @cbV3DHelperLoaded helperstr; ); //SO3ObjectSetMouseForeGround helperstr.V3D_helperIcon 1; SO3ObjectSetPosition helperstr.V3D_helperIcon pos; SO3ObjectSetOrientation helperstr.V3D_helperIcon quat; ); set sessionstr.V3D_lHelper = V3Dlcat sessionstr.V3D_lHelper [refobj helperstr]::nil; 0; ); ) else ( let (switch sessionstr.V3D_lHelper refobj) -> helperstr in if helperstr == nil then nil else ( SO3ObjectDestroy helperstr.V3D_helperIcon; set sessionstr.V3D_lHelper = V3DremoveIdxFromList sessionstr.V3D_lHelper refobj; ); 0; ); 0;; fun V3DisSceneHelperVisible(sessionstr)= if !sessionstr.V3D_bHelpersState then 0 else 1;; fun V3DenableHelpers(viewportstr, sessionstr, state)= let sizelist sessionstr.V3D_lHelper -> size in let 0 -> i in while i < size do ( let nth_list sessionstr.V3D_lHelper i -> [_ helperstr] in if state then let SO3ObjectGetGlobalPosition helperstr.V3D_helperFather -> pos in let SO3ObjectGetGlobalOrientation helperstr.V3D_helperFather -> quat in let SO3ObjectGetName helperstr.V3D_helperFather -> refname in if (refname == nil) then nil else ( // reset helper if exist SO3ObjectDestroy helperstr.V3D_helperIcon; if helperstr.V3D_iHelperMode == 4 then // light ( let SO3LightGetType helperstr.V3D_helperFather -> lightType in if(lightType == SO3_DIRECTIONAL_LIGHT) then set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_dir_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dir_light.mesh") @cbV3DHelperLoaded helperstr else if(lightType == SO3_SPOT_LIGHT) then set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_spot_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_spot_light.mesh") @cbV3DHelperLoaded helperstr else set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_light" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_light.mesh") @cbV3DHelperLoaded helperstr; ) else if helperstr.V3D_iHelperMode == 8 then // camera ( set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_camera" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_camera.mesh") @cbV3DHelperLoaded helperstr; ) else // dummy ( set helperstr.V3D_helperIcon = SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat refname ".helper_dummy" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dummy.mesh") @cbV3DHelperLoaded helperstr; ); //SO3ObjectSetMouseForeGround helperstr.V3D_helperIcon 1; SO3ObjectSetCastShadows helperstr.V3D_helperIcon 0; SO3ObjectSetPosition helperstr.V3D_helperIcon pos; SO3ObjectSetOrientation helperstr.V3D_helperIcon quat; //change to render priority SO3ObjectSetRenderQueue helperstr.V3D_helperIcon 49; SO3EntitySetVisibilityFlagIndexEnable helperstr.V3D_helperIcon 3 0; 0; ) else ( SO3ObjectDestroy helperstr.V3D_helperIcon; 0; ); set i = i + 1; ); set sessionstr.V3D_bHelpersState = state; V3DupdateHelpersTarget sessionstr.V3D_sessionView sessionstr; 0;; fun V3DgetObjectFromHelper(sessionstr, obj)= let nil -> found in ( let sizelist sessionstr.V3D_lHelper -> size in let 0 -> i in while i < size && found == nil do ( let nth_list sessionstr.V3D_lHelper i -> [_ helperstr] in if helperstr.V3D_helperIcon != obj then nil else set found = helperstr.V3D_helperFather; set i = i + 1; ); if found == nil then obj else found; );; fun V3DgetObjectSize(object)= let SO3ObjectGetWorldBoundingBoxInfo object 0 -> [size _ _] in size;; fun V3DgetGlobalObjectCenter(object)= let SO3ObjectGetGlobalPosition object -> [x y z] in let SO3ObjectGetWorldBoundingBoxInfo object 0 -> [_ bpos _] in let bpos -> [bx by bz] in if bpos == nil then [x y z] else bpos;; fun V3DgetObjectRadius(sessionstr, object)= let V3DgetObjectSize object -> size in let size -> [px py pz] in let if px >. py then px else py -> radius in let if radius >. pz then radius else pz -> radius in let if size == nil then 100.0 else radius -> radius in radius;; fun V3DisSceneGridVisible(sessionstr)= if sessionstr.V3D_helperGrid == nil then 0 else 1;; fun V3DshowSceneGrid(sessionstr, mode)= if (mode && (sessionstr.V3D_helperGrid != nil)) then nil else if mode then ( let SO3SceneNodeCreate (V3DgetSession sessionstr) "default_helper_grid" -> node in let SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup "default_helper_grid_square" _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/default_grid_helper.mesh") nil nil -> square in let square::nil -> lobj in ( SO3ObjectSetFlags node iNodeFlagTools; SO3ObjectSetScale square [(0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit))]; SO3ObjectLink square node; SO3ObjectSetMouseClick square 0; SO3ObjectSetCastShadows square 0; SO3ObjectSetFlags square iNodeFlagTools; let -5 * iGlobalUnit -> i in while i < (5 * iGlobalUnit) do ( let SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat "default_helper_grid_hline_" (itoa i) _checkpack (strcat sV3DDEFAULTRESOURCESPATH (if i == 0 then "helpers/h_line_b.mesh" else "helpers/h_line_w.mesh")) nil nil -> hline in let SO3SceneLoadEntityInBackground (V3DgetSession sessionstr) sV3DResourcesGroup strcat "default_helper_grid_vline_" (itoa i) _checkpack (strcat sV3DDEFAULTRESOURCESPATH (if i == 0 then "helpers/v_line_b.mesh" else "helpers/v_line_w.mesh")) nil nil -> vline in ( SO3ObjectSetScale hline [(0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit))]; SO3ObjectSetScale vline [(0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit)) (0.01 *. (itof iGlobalUnit))]; SO3ObjectLink hline node; SO3ObjectLink vline node; SO3ObjectSetMouseClick hline 0; SO3ObjectSetMouseClick vline 0; SO3ObjectSetFlags hline iNodeFlagTools; SO3ObjectSetFlags vline iNodeFlagTools; SO3ObjectSetCastShadows hline 0; SO3ObjectSetCastShadows vline 0; SO3ObjectSetPosition hline [0.0 0.0 (itof i)]; SO3ObjectSetPosition vline [(itof i) 0.0 0.0]; set lobj = hline::vline::lobj; ); set i = i + iGlobalUnit; ); set sessionstr.V3D_helperGrid = [node lobj]; ); 0; ) else if (sessionstr.V3D_helperGrid != nil) then let sessionstr.V3D_helperGrid -> [node lobj] in ( let sizelist lobj -> size in let 0 -> i in while i < size do ( let nth_list lobj i -> obj in SO3ObjectDestroy obj; set i = i + 1; ); SO3ObjectDestroy node; set sessionstr.V3D_helperGrid = nil; 0; ) else nil; 0;; fun V3DcameraPan(sessionstr, viewportstr, x, y) = let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let SO3CameraGetFOVy camera -> fovy in let if fovy <=. 0.0 then 0.000001 else fovy -> fovy in let if V3DgetOrthographicMode camera then 1.0 else fovy -> fovy in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [vx vy vw vh] in let if (vw <= 0) then 1 else vw -> vw in let if (vh <= 0) then 1 else vh -> vh in let SO3ObjectGetPosition camera -> [_ _ dist] in let ((itof vw)) /. atan fovy -> dx in let ((-.dist *. ((itof vw))) /. dx /. ((itof vh))) -> coef in let (itof x) *. coef -> mx in let (itof y) *. coef -> my in let [mx my 0.0] -> vect in SO3ObjectTranslate sessionstr.V3D_shellNavigate vect SO3_LOCAL_TS; 0;; fun V3DsetShellNavPos(sessionstr, pos)= SO3ObjectSetPosition sessionstr.V3D_shellNavigate pos; 0;; fun V3DsetShellNavAng(sessionstr, quat)= SO3ObjectSetOrientation sessionstr.V3D_shellNavigate quat; 0;; fun V3DgetShellNavPos(sessionstr)= SO3ObjectGetPosition sessionstr.V3D_shellNavigate;; fun V3DgetShellNavAng(sessionstr)= SO3ObjectGetOrientation sessionstr.V3D_shellNavigate;; /*! @ingroup v3DApi * \brief Set the scene ambient color * * Prototype: fun [V3Dsession I] I * * \param V3Dsession : the 3d scene structure * \param I : the new ambient color * * \return 0 **/ fun V3DsetAmbientLight(sessionstr, color) = SO3SceneSetAmbientLight (V3DgetSession sessionstr) color; 0;; /*! @ingroup v3DApi * \brief Get the scene ambient color * * Prototype: fun [V3Dsession] I * * \param V3Dsession : the 3d scene structure * * \return I : the scene ambient color **/ fun V3DgetAmbientLight(sessionstr) = SO3SceneGetAmbientLight (V3DgetSession sessionstr);; fun V3DsetShadowTechnique(sessionstr, type, dist, color, self)= SO3SceneSetShadowTechnique (V3DgetSession sessionstr) (if type == nil then SO3_SHADOWTYPE_NONE else type); SO3SceneSetShadowFarDistance (V3DgetSession sessionstr) (if dist == nil then 3000.0 else dist); SO3SceneSetShadowColor (V3DgetSession sessionstr) (if color == nil then 0x000000 else color); SO3SceneSetSelfShadowTexture (V3DgetSession sessionstr) (if self == nil then 1 else self); 0;; fun V3DsetShadowCameraType(sessionstr, camtype, px, py, pz, pd)= if camtype == SO3_PLANE_SHADOW_CAMERA then ( SO3SceneSetPlaneShadowCamera (V3DgetSession sessionstr) [px py pz] pd; ) else if camtype == SO3_FOCUSED_SHADOW_CAMERA then ( SO3SceneSetFocusedShadowCamera (V3DgetSession sessionstr); ) else if camtype == SO3_LISPSM_SHADOW_CAMERA then ( SO3SceneSetLISPSMShadowCamera (V3DgetSession sessionstr); ) else // SO3_DEFAULT_SHADOW_CAMERA ( SO3SceneSetDefaultShadowCamera (V3DgetSession sessionstr); ); 0;; fun V3DgetShadowCameraType(sessionstr)= SO3SceneGetShadowCameraSetup (V3DgetSession sessionstr);; fun V3DsetShadowTextureParams(sessionstr, size, count, offset, fadestart, fadestop)= SO3SceneSetShadowTextureSize (V3DgetSession sessionstr) (if size == nil then 512 else size); SO3SceneSetShadowTextureCount (V3DgetSession sessionstr) (if count == nil then 1 else count); SO3SceneSetShadowDirLightTextureOffset (V3DgetSession sessionstr) (if offset == nil then 0.0 else offset); SO3SceneSetShadowTextureFadeStart (V3DgetSession sessionstr) (if fadestart == nil then 0.7 else fadestart); SO3SceneSetShadowTextureFadeEnd (V3DgetSession sessionstr) (if fadestop == nil then 0.9 else fadestop); 0;; fun V3DsetObjectReceiveShadows(sessionstr, obj, bool)= let SO3EntityMaterialList obj -> l in let sizelist l -> size in let 0 -> i in while i < size do ( let nth_list l i -> mat in SO3MaterialSetReceiveShadows mat bool; set i = i + 1; ); 0;; fun V3DsetSceneFog(sessionstr, mode, color, density, linearstart, linearend)= let if mode != nil then mode else SO3SceneGetFogMode (V3DgetSession sessionstr) -> mode in let if color != nil then color else SO3SceneGetFogColor (V3DgetSession sessionstr) -> color in let if density != nil then density else SO3SceneGetFogDensity (V3DgetSession sessionstr) -> density in let if linearstart != nil then linearstart else SO3SceneGetFogStart (V3DgetSession sessionstr) -> linearstart in let if linearend != nil then linearend else SO3SceneGetFogEnd (V3DgetSession sessionstr) -> linearend in SO3SceneSetFog (V3DgetSession sessionstr) mode color density linearstart linearend; 0;; /* ********************************************************************************************* / Animations / ********************************************************************************************* */ /*! @ingroup v3DApi * \brief Get an animation by it's name * * Prototype: fun [V3Dsession S] V3Danim * * \param V3Dsession : the 3d scene structure * \param S : the animation name * * \return V3Danim : the animation, nil if not found **/ fun V3DgetAnimationByName(sessionstr, name)= if name == nil then nil else switchstr sessionstr.V3D_lAnimations name;; /*! @ingroup v3DApi * \brief Get an animation structure from the SO3_ANIM object * * Prototype: fun [V3Dsession SO3_ANIM] V3Danim * * \param V3Dsession : the 3d scene structure * \param SO3_ANIM : SO3 animation object * * \return V3Danim : the animation, nil if not found **/ fun V3DgetAnimationByAnim(sessionstr, anim)= if anim == nil then nil else let nil -> fanimstr in ( let sizelist sessionstr.V3D_lAnimations -> size in let 0 -> i in while (i < size) && (fanimstr == nil) do ( let nth_list sessionstr.V3D_lAnimations i -> [_ animstr] in if animstr.V3D_anim != anim then nil else set fanimstr = animstr; set i = i + 1; ); fanimstr; );; /*! @ingroup v3DApi * \brief Add an animation to the scene * * Prototype: fun [V3Dsession SO3_OBJECT I S S F F F I I I I] V3Danim * * \param V3Dsession : the 3d scene structure * \param SO3_OBJECT : the object containing the animation * \param I : index (must be unique) * \param S : base name * \param S : name * \param F : length * \param F : speed * \param F : weight * \param I : initial state * \param I : 1 for loop mode, 0 otherwise * \param I : translation interpolation mode SO3_IM_LINEAR or SO3_IM_SPLINE * \param I : rotation interpolation mode SO3_RIM_LINEAR or SO3_RIM_SPHERICAL * * \return V3Danim : the animation **/ fun V3DaddAnimation(sessionstr, obj, id, basename, name, length, speed, weight, state, loop, transmode, rotmode)= let switchstr sessionstr.V3D_lAnimations name -> animexist in if animexist != nil then animexist else let if weight == nil then 1.0 else weight -> weight in let mkV3Danim [sessionstr nil id basename obj nil name state 1 weight 0.0 SO3_SCENENODE_ANIM nil nil nil 1] -> animstr in ( set animstr.V3D_anim = SO3ObjectCreateNodesAnimation obj animstr.V3D_sAnimName length; SO3AnimationSetLoop animstr.V3D_anim loop; SO3AnimationSetInterpMode animstr.V3D_anim transmode; SO3AnimationSetRotInterpMode animstr.V3D_anim rotmode; SO3AnimationSetWeight animstr.V3D_anim weight; SO3AnimationSetSpeed animstr.V3D_anim speed; set sessionstr.V3D_lAnimations = [name animstr]::sessionstr.V3D_lAnimations; animstr; );; /*! @ingroup v3DApi * \brief Add a sequence animation to the scene * * Prototype: fun [V3Dsession I S S F F I I] V3Danim * * \param V3Dsession : the 3d scene structure * \param I : index (must be unique) * \param S : base name * \param S : name * \param F : speed * \param F : weight * \param I : initial state * \param I : 1 for loop mode, 0 otherwise * * \return V3Danim : the animation **/ fun V3DaddSequenceAnimation(sessionstr, id, basename, name, speed, weight, state, loop)= let switchstr sessionstr.V3D_lAnimations name -> animexist in if animexist != nil then animexist else let if weight == nil then 1.0 else weight -> weight in let mkV3Danim [sessionstr nil id basename nil nil name state 1 weight 0.0 SO3_SEQUENCE_ANIM nil nil nil 1] -> animstr in ( set animstr.V3D_anim = SO3SceneCreateAnimationSequence (V3DgetSession sessionstr) animstr.V3D_sAnimName; SO3AnimationSetLoop animstr.V3D_anim loop; SO3AnimationSetWeight animstr.V3D_anim weight; SO3AnimationSetSpeed animstr.V3D_anim speed; set sessionstr.V3D_lAnimations = [name animstr]::sessionstr.V3D_lAnimations; animstr; );; /*! @ingroup v3DApi * \brief Get the number of animation tracks * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : the number of tracks **/ fun V3DgetNbAnimationTracks(animstr)= SO3AnimationNumOfAnimationTrack animstr.V3D_anim;; /*! @ingroup v3DApi * \brief Get the number of animation track keys * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : index of the animation track * * \return I : the number of track keys **/ fun V3DgetNbAnimationTrackKeys(animstr, trackidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in SO3AnimTrackGetNumKeys track;; /*! @ingroup v3DApi * \brief Add a sequence animation track * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : return the track index **/ fun V3DaddSequenceAnimationTrack(animstr)= SO3AnimationCreateAnimTrack animstr.V3D_anim nil nil; (SO3AnimationNumOfAnimationTrack animstr.V3D_anim) -1;; /*! @ingroup v3DApi * \brief Remove a sequence animation track * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : index of the animation track * * \return 0 **/ fun V3DdelSequenceAnimationTrack(animstr, trackidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in SO3AnimTrackDestroy track; 0;; /*! @ingroup v3DApi * \brief Move a sequence animation track key * * Prototype: fun [V3Danim I I I] I * * \param V3Danim : the animation structure * \param I : index of the animation track * \param I : index of key * \param I : new index of key * * \return 0 **/ fun V3DmoveSequenceAnimationKey(animstr, trackidx, keyidx, newidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in SO3AnimTrackMoveSequenceKey track keyidx newidx; 0;; /*! @ingroup v3DApi * \brief Get a sequence animation track key * * Prototype: fun [V3Danim I I] V3Danim * * \param V3Danim : the animation structure * \param I : index of the animation track * \param I : index of key * * \return V3Danim : the animation used as a sequence animation key **/ fun V3DgetSequenceAnimationKey(animstr, trackidx, keyidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in let SO3AnimTrackGetSequenceKey track keyidx -> [kanim _ _ _ _] in V3DgetAnimationByAnim animstr.V3D_animSession kanim;; /*! @ingroup v3DApi * \brief Get a sequence animation track key infos * * Prototype: fun [V3Danim I I] [V3Danim F F F F] * * \param V3Danim : the animation structure * \param I : index of the animation track * \param I : index of key * * \return [V3Danim F F F F] : the animation used as a sequence animation key, the key position, the key length, the key transition time and the key offset **/ fun V3DgetSequenceAnimationKeyInfos(animstr, trackidx, keyidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in let SO3AnimTrackGetSequenceKey track keyidx -> [kanim pos length trans decal] in [(V3DgetAnimationByAnim animstr.V3D_animSession kanim) pos length trans decal];; /*! @ingroup v3DApi * \brief Set a sequence animation track key infos * * Prototype: fun [V3Danim I I F F F] I * * \param V3Danim : the animation structure * \param I : index of the animation track * \param I : index of key * \param F : length * \param F : transition time in second * \param F : offset in second * * \return 0 **/ fun V3DsetSequenceAnimationKeyInfos(animstr, trackidx, keyidx, length, trans, decal)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in SO3AnimTrackSetSequenceKey track keyidx length trans decal; 0;; /*! @ingroup v3DApi * \brief Add a sequence animation track key * * Prototype: fun [V3Danim I V3Danim F F F] I * * \param V3Danim : the animation structure * \param I : index of the animation track * \param V3Danim : the animation structure to use as a key * \param F : length * \param F : transition time in second * \param F : offset in second * * \return I : the key index **/ fun V3DaddSequenceAnimationKey(animstr, trackidx, keyanimstr, length, transition, decal)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in ( SO3AnimTrackCreateSequenceKey track keyanimstr.V3D_anim length transition decal; (SO3AnimTrackGetNumKeys track) - 1; );; /*! @ingroup v3DApi * \brief Remove a sequence animation track key * * Prototype: fun [V3Danim I I] I * * \param V3Danim : the animation structure * \param I : index of the animation track * \param I : index of key * * \return 0 **/ fun V3DdelSequenceAnimationKey(animstr, trackidx, keyidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> track in SO3AnimTrackRemoveKey track keyidx; 0;; /*! @ingroup v3DApi * \brief Add a morph animation to the scene * * Prototype: fun [V3Dsession SO3_ANIM SO3_OBJECT I S S F F I I] V3Danim * * \param V3Dsession : the 3d scene structure * \param SO3_ANIM : the SO3 animation object * \param SO3_OBJECT : the 3d object * \param I : index (must be unique) * \param S : base name * \param S : name * \param F : speed * \param F : weight * \param I : initial state * \param I : 1 for loop mode, 0 otherwise * * \return V3Danim : the animation **/ fun V3DaddMorphAnimation(sessionstr, anim, obj, id, basename, name, speed, weight, state, loop)= if anim == nil then nil else let switchstr sessionstr.V3D_lAnimations name -> animexist in if animexist != nil then animexist else let if weight == nil then 1.0 else weight -> weight in let mkV3Danim [sessionstr anim id basename obj nil name state 1 weight 0.0 SO3_VERTEX_ANIM nil nil nil 1] -> animstr in ( SO3AnimationSetLoop animstr.V3D_anim loop; SO3AnimationSetWeight animstr.V3D_anim weight; SO3AnimationSetSpeed animstr.V3D_anim speed; set sessionstr.V3D_lAnimations = [name animstr]::sessionstr.V3D_lAnimations; animstr; );; /*! @ingroup v3DApi * \brief Delete an animation * * Prototype: fun [V3Dsession V3Danim] I * * \param V3Dsession : the 3d scene structure * \param V3Danim : the animation structure to delete * * \return 0 **/ fun V3DdelAnimation(sessionstr, animstr)= if animstr.V3D_anim == nil then nil else SO3AnimationDestroy animstr.V3D_anim; set sessionstr.V3D_lAnimations = V3DremoveTupFromListByName sessionstr.V3D_lAnimations animstr.V3D_sAnimName; 0;; /*! @ingroup v3DApi * \brief Add an animation node key * * Prototype: fun [V3Danim [F F F] [F F F F] [F F F] F] I * * \param V3Danim : the animation structure * \param [F F F] : position vector * \param [F F F F] : orientation quaternion * \param [F F F] : scale vector * \param F : key time position * * \return 0 **/ fun V3DaddAnimationKey(animstr, pos, quat, scale, ftime)= let SO3AnimationGetAnimTrack animstr.V3D_anim 0 -> animtrack in let if animtrack == nil then (SO3AnimationCreateAnimTrack animstr.V3D_anim nil nil) else animtrack -> animtrack in SO3AnimTrackCreateKey animtrack ftime pos quat scale; 0;; /*! @ingroup v3DApi * \brief Delete an animation track * * Prototype: fun [V3Dsession V3Danim I] I * * \param V3Dsession : the 3d scene structure * \param V3Danim : the animation structure * \param I : track index to delete * * \return 0 **/ fun V3DdelAnimationTrack(sessionstr, animstr, trackidx)= let SO3AnimationGetAnimTrack animstr.V3D_anim trackidx -> animtrack in if animtrack == nil then nil else SO3AnimTrackDestroy animtrack; 0;; /*! @ingroup v3DApi * \brief Set an animation weight * * Prototype: fun [V3Danim F] I * * \param V3Danim : the animation structure * \param F : animation weight * * \return 0 **/ fun V3DsetAnimationWeight(animstr, weight)= set animstr.V3D_fAnimWeight = weight; SO3AnimationSetWeight animstr.V3D_anim weight; 0;; /*! @ingroup v3DApi * \brief Get an animation weight * * Prototype: fun [V3Danim] F * * \param V3Danim : the animation structure * * \return F : animation weight **/ fun V3DgetAnimationWeight(animstr)= animstr.V3D_fAnimWeight;; /*! @ingroup v3DApi * \brief Set an animation state * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : state * * \return I : the new state **/ fun V3DsetAnimationState(animstr, state)= set animstr.V3D_bAnimState = state;; /*! @ingroup v3DApi * \brief Set an animation loop * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : loop state * * \return 0 **/ fun V3DsetAnimationLoop(animstr, loop)= SO3AnimationSetLoop animstr.V3D_anim loop;; /*! @ingroup v3DApi * \brief Set an animation speed factor * * Prototype: fun [V3Danim F] I * * \param V3Danim : the animation structure * \param F : speed factor * * \return 0 **/ fun V3DsetAnimationSpeed(animstr, speed)= SO3AnimationSetSpeed animstr.V3D_anim speed;; /*! @ingroup v3DApi * \brief Set an animation translation interpolation mode * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : interpolation mode, SO3_IM_LINEAR or SO3_IM_SPLINE * * \return 0 **/ fun V3DsetAnimationInterpolationMode(animstr, mode)= SO3AnimationSetInterpMode animstr.V3D_anim mode;; /*! @ingroup v3DApi * \brief Set an animation rotation interpolation mode * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : interpolation mode, SO3_RIM_LINEAR or SO3_RIM_SPHERICAL * * \return 0 **/ fun V3DsetAnimationRotInterpolationMode(animstr, mode)= SO3AnimationSetRotInterpMode animstr.V3D_anim mode;; /*! @ingroup v3DApi * \brief Get an animation state * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : the current animation state **/ fun V3DgetAnimationState(animstr)= animstr.V3D_bAnimState;; /*! @ingroup v3DApi * \brief Get an animation loop state * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : the current loop state **/ fun V3DgetAnimationLoop(animstr)= SO3AnimationGetLoop animstr.V3D_anim;; /*! @ingroup v3DApi * \brief Get an animation speed factor * * Prototype: fun [V3Danim] F * * \param V3Danim : the animation structure * * \return F : the current speed factor **/ fun V3DgetAnimationSpeed(animstr)= SO3AnimationGetSpeed animstr.V3D_anim;; /*! @ingroup v3DApi * \brief Get an animation type * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : the animation type, SO3_SCENENODE_ANIM, SO3_SKELETAL_ANIM, SO3_VERTEX_ANIM, SO3_POSE_ANIM, SO3_SEQUENCE_ANIM **/ fun V3DgetAnimationType(animstr)= animstr.V3D_iAnimType;; /*! @ingroup v3DApi * \brief Set an animation position * * Prototype: fun [V3Danim F] I * * \param V3Danim : the animation structure * \param F : time position * * \return 0 **/ fun V3DsetAnimationPosition(animstr, pos)= SO3AnimationSetTimePosition animstr.V3D_anim pos;; /*! @ingroup v3DApi * \brief Get an animation position * * Prototype: fun [V3Danim] F * * \param V3Danim : the animation structure * * \return F : time position **/ fun V3DgetAnimationPosition(animstr)= SO3AnimationGetTimePosition animstr.V3D_anim;; /*! @ingroup v3DApi * \brief Get an animation length * * Prototype: fun [V3Danim] F * * \param V3Danim : the animation structure * * \return F : animation length **/ fun V3DgetAnimationLength(animstr)= SO3AnimationGetLength animstr.V3D_anim;; fun V3DsetAnimationCbPlay(animstr, cbfun)= set animstr.V3D_cbAnimPlay = cbfun;; fun V3DsetAnimationCbPause(animstr, cbfun)= set animstr.V3D_cbAnimPause = cbfun;; fun V3DsetAnimationCbStop(animstr, cbfun)= set animstr.V3D_cbAnimStop = cbfun;; /*! @ingroup v3DApi * \brief Get an animation enable state * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : animation enable state **/ fun V3DgetAnimationEnable(animstr)= SO3AnimationGetEnable animstr.V3D_anim;; /*! @ingroup v3DApi * \brief Reset an animation * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return 0 **/ fun V3DresetAnimation(animstr)= V3DsetAnimationState animstr 0; SO3AnimationSetEnable animstr.V3D_anim 0; SO3AnimationSetTimePosition animstr.V3D_anim 0.0; if (animstr.V3D_iAnimType == SO3_SCENENODE_ANIM) then let animstr.V3D_nodePRS -> [vec quat scale] in ( SO3ObjectSetPosition animstr.V3D_meshAnim vec; SO3ObjectSetOrientation animstr.V3D_meshAnim quat; SO3ObjectSetScale animstr.V3D_meshAnim scale; 0; ) else if (animstr.V3D_iAnimType == SO3_SEQUENCE_ANIM) then ( let SO3AnimationNumOfAnimationTrack animstr.V3D_anim -> sizetrack in let 0 -> i in while i < sizetrack do ( let SO3AnimationGetAnimTrack animstr.V3D_anim i -> track in let SO3AnimTrackGetNumKeys track -> sizekey in let if sizekey == nil then 0 else sizekey -> sizekey in let 0 -> j in while j < sizekey do ( let SO3AnimTrackGetSequenceKey track j -> [kanim _ _ _ _] in let V3DgetAnimationByAnim animstr.V3D_animSession kanim -> kanimstr in V3DresetAnimation kanimstr; set j = j + 1; ); set i = i + 1; ); 0; ) else ( SO3ObjectResetToInitialState animstr.V3D_meshAnim; 0; ); set animstr.V3D_bAnimReset = 1; 0;; /*! @ingroup v3DApi * \brief Reset all scene animations * * Prototype: fun [V3Dsession] I * * \param V3Dsession : the 3d scene structure * * \return 0 **/ fun V3DresetAnimations(sessionstr)= let sizelist sessionstr.V3D_lAnimations -> size in let 0 -> i in while i < size do ( let nth_list sessionstr.V3D_lAnimations i -> [_ animstr] in SO3AnimationSetTimePosition animstr.V3D_anim 0.0; set i = i + 1; ); 0;; /*! @ingroup v3DApi * \brief Pause an animation * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return 0 **/ fun V3DpauseAnimation(animstr)= V3DsetAnimationState animstr 0; exec animstr.V3D_cbAnimPause with [animstr]; SO3AnimationSetPause animstr.V3D_anim 1; 0;; /*! @ingroup v3DApi * \brief Play an animation * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return 0 **/ fun V3DplayAnimation(animstr)= if (animstr.V3D_bAnimState) then nil else ( let SO3AnimationGetLength animstr.V3D_anim -> length in let SO3AnimationGetTimePosition animstr.V3D_anim -> pos in let SO3AnimationGetSpeed animstr.V3D_anim -> speed in if !(SO3AnimationGetPause animstr.V3D_anim) || ((pos >=. length) && speed >. 0.0) || ((pos == 0.0) && speed <. 0.0) then SO3AnimationSetTimePosition animstr.V3D_anim if (speed >. 0.0) then 0.0 else length else nil; V3DsetAnimationState animstr 1; exec animstr.V3D_cbAnimPlay with [animstr]; SO3AnimationSetEnable animstr.V3D_anim 1; ); 0;; /*! @ingroup v3DApi * \brief Play an animation from a position * * Prototype: fun [V3Danim F] I * * \param V3Danim : the animation structure * \param F : the start time position * * \return 0 **/ fun V3DplayAnimationFromPos(animstr, startpos)= SO3AnimationSetTimePosition animstr.V3D_anim startpos; V3DsetAnimationState animstr 1; exec animstr.V3D_cbAnimPlay with [animstr]; SO3AnimationSetEnable animstr.V3D_anim 1; 0;; /*! @ingroup v3DApi * \brief Stop an animation * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return 0 **/ fun V3DstopAnimation(animstr)= V3DsetAnimationState animstr 0; SO3AnimationSetEnable animstr.V3D_anim 0; exec animstr.V3D_cbAnimStop with [animstr]; SO3AnimationSetTimePosition animstr.V3D_anim 0.0; 0;; /*! @ingroup v3DApi * \brief Set an animation enable state * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : the enable state * * \return 0 **/ fun V3DenableAnimation(animstr, state)= if !state then ( SO3AnimationSetTimePosition animstr.V3D_anim 0.0; SO3AnimationSetEnable animstr.V3D_anim 0; if animstr.V3D_iAnimType == SO3_VERTEX_ANIM || animstr.V3D_iAnimType == SO3_SKELETAL_ANIM then SO3ObjectResetToInitialState animstr.V3D_meshAnim else nil; ) else ( if animstr.V3D_iAnimType == SO3_VERTEX_ANIM || animstr.V3D_iAnimType == SO3_SKELETAL_ANIM then SO3ObjectSetInitialState animstr.V3D_meshAnim else nil; SO3AnimationSetEnable animstr.V3D_anim animstr.V3D_bAnimState; 0; ); 0;; fun V3DinitializeAnimation(animstr, state)= SO3AnimationSetTimePosition animstr.V3D_anim 0.0; SO3AnimationSetEnable animstr.V3D_anim 0; if animstr.V3D_meshAnim == nil then nil else ( set animstr.V3D_nodePRS = [(SO3ObjectGetPosition animstr.V3D_meshAnim) (SO3ObjectGetOrientation animstr.V3D_meshAnim) (SO3ObjectGetScale animstr.V3D_meshAnim)]; if animstr.V3D_iAnimType == SO3_VERTEX_ANIM || animstr.V3D_iAnimType == SO3_SKELETAL_ANIM then SO3ObjectSetInitialState animstr.V3D_meshAnim else nil; ); if (animstr.V3D_iAnimType != SO3_SEQUENCE_ANIM) then nil else ( let SO3AnimationNumOfAnimationTrack animstr.V3D_anim -> sizetrack in let 0 -> i in while i < sizetrack do ( let SO3AnimationGetAnimTrack animstr.V3D_anim i -> track in let SO3AnimTrackGetNumKeys track -> sizekey in let if sizekey == nil then 0 else sizekey -> sizekey in let 0 -> j in while j < sizekey do ( let SO3AnimTrackGetSequenceKey track j -> [kanim _ _ _ _] in let V3DgetAnimationByAnim animstr.V3D_animSession kanim -> kanimstr in ( if (!kanimstr.V3D_bAnimReset) then nil else V3DinitializeAnimation kanimstr state; SO3AnimationSetEnable kanimstr.V3D_anim 0; ); set j = j + 1; ); set i = i + 1; ); 0; ); SO3AnimationSetSkipFrame animstr.V3D_anim animstr.V3D_bAnimSkipFrame; if (!state) then nil else SO3AnimationSetEnable animstr.V3D_anim animstr.V3D_bAnimState; set animstr.V3D_bAnimReset = 0; 0;; /*! @ingroup v3DApi * \brief Set an animation skip frame state * * Prototype: fun [V3Danim I] I * * \param V3Danim : the animation structure * \param I : the skip frame state * * \return 0 **/ fun V3DanimationSetSkipFrame(animstr, state)= SO3AnimationSetSkipFrame animstr.V3D_anim state;; /*! @ingroup v3DApi * \brief Get an animation skip frame state * * Prototype: fun [V3Danim] I * * \param V3Danim : the animation structure * * \return I : the skip frame state **/ fun V3DanimationGetSkipFrame(animstr)= SO3AnimationGetSkipFrame animstr.V3D_anim;; fun V3DanimationGetDefaultSkipFrame(animstr)= animstr.V3D_bAnimSkipFrame;; fun V3DanimationSetDefaultSkipFrame(animstr, state)= set animstr.V3D_bAnimSkipFrame = state; SO3AnimationSetSkipFrame animstr.V3D_anim animstr.V3D_bAnimSkipFrame; 0;; fun V3DanimationsEnableScene(sessionstr, state, play)= let sizelist sessionstr.V3D_lAnimations -> size in let 0 -> i in while i < size do ( let nth_list sessionstr.V3D_lAnimations i -> [_ animstr] in ( if state then ( V3DinitializeAnimation animstr play; 0; ) else if (animstr.V3D_bAnimReset == 1) then nil else ( V3DresetAnimation animstr; 0; ); ); set i = i + 1; ); 0;; /* ********************************************************************************************* / RENDER / ********************************************************************************************* */ fun V3DgetSessionByScene(viewstr, scene)= switch lV3DSessions scene;; fun cbV3DbufferPreRender(buffer, viewstr)= exec viewstr.V3D_cbPreRender with [viewstr]; if viewstr.V3D_bPaused then nil else exec viewstr.V3D_cbPreRenderEffects with [viewstr]; let V3DgetDefaultSession viewstr -> sessionstr in exec sessionstr.V3D_cbHUDPostRender with [sessionstr]; exec viewstr.V3D_cbPreRender2 with [viewstr]; 0;; fun cbV3DbufferPostRender(buffer, viewstr)= exec viewstr.V3D_cbPostRender with [viewstr]; 0;; fun V3DWidgetCtrlHasFocus(viewstr)= let sizelist viewstr.V3D_lViewport -> sizev in let 0 -> iv in let nil -> ret in ( while (iv < sizev && ret == nil) do ( let nth_list viewstr.V3D_lViewport iv -> [_ viewportstr] in let sizelist viewportstr.V3D_lWidgetControl -> size in let 0 -> i in while (i < size && ret == nil) do ( let nth_list viewportstr.V3D_lWidgetControl i -> widgetctrl in if (SO3WidgetHasFocus widgetctrl) then set ret = widgetctrl else nil; set i = i + 1; ); set iv = iv + 1; ); ret; );; fun V3DisAxis(sessionstr, obj)= let sessionstr.V3D_selectedAxis -> [axisstr axisflag] in if ((obj == nil) || (sessionstr.V3D_selectedAxis == nil) || (axisstr == nil)) then 0 else if (obj == axisstr.V3D_xAxisObject) || (obj == axisstr.V3D_yAxisObject) || (obj == axisstr.V3D_zAxisObject) || ((axisstr.V3D_hAxisObject != nil) && (obj == axisstr.V3D_hAxisObject)) then 1 else 0;; fun findCurrentMouseAxis(sessionstr, id)= let sessionstr.V3D_sessionView -> viewstr in let sessionstr.V3D_selectedAxis -> [selectedaxisstr axisflag] in if ((sessionstr.V3D_selectedAxis == nil) || (selectedaxisstr == nil)) then let V3DgetLastMouseData viewstr id -> [_ _ obj mat _ _ _ _ _] in let sizelist sessionstr.V3D_lAxis -> size2 in let 0 -> i2 in while i2 < size2 do ( let nth_list sessionstr.V3D_lAxis i2 -> [_ axisstr] in if axisstr.V3D_iAxisMode then ( if ((obj != nil) && (obj == axisstr.V3D_xAxisObject) && ((axisstr.V3D_iAxisInputId == nil) || (axisstr.V3D_iAxisInputId == id))) then ( let SO3EntityGetMaterialByIndex axisstr.V3D_xAxisObject 0 -> mat in ( set sessionstr.V3D_mLastAxisMat = mat; SO3MaterialSetSelfIllumination mat axisstr.V3D_sAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_sAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_sAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_sAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_yAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_yAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_yAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_yAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_yAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_zAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_zAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_zAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_zAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_zAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_hAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_hAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_hAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_hAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_hAxisColor; ); set axisstr.V3D_iAxisInputId = id; 0; ) else if ((obj != nil) && (obj == axisstr.V3D_yAxisObject) && ((axisstr.V3D_iAxisInputId == nil) || (axisstr.V3D_iAxisInputId == id))) then ( let SO3EntityGetMaterialByIndex axisstr.V3D_xAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_xAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_xAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_xAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_xAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_yAxisObject 0 -> mat in ( set sessionstr.V3D_mLastAxisMat = mat; SO3MaterialSetSelfIllumination mat axisstr.V3D_sAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_sAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_sAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_sAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_zAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_zAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_zAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_zAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_zAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_hAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_hAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_hAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_hAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_hAxisColor; ); set axisstr.V3D_iAxisInputId = id; 0; ) else if ((obj != nil) && (obj == axisstr.V3D_zAxisObject) && ((axisstr.V3D_iAxisInputId == nil) || (axisstr.V3D_iAxisInputId == id))) then ( let SO3EntityGetMaterialByIndex axisstr.V3D_xAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_xAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_xAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_xAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_xAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_yAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_yAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_yAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_yAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_yAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_zAxisObject 0 -> mat in ( set sessionstr.V3D_mLastAxisMat = mat; SO3MaterialSetSelfIllumination mat axisstr.V3D_sAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_sAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_sAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_sAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_hAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_hAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_hAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_hAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_hAxisColor; ); set axisstr.V3D_iAxisInputId = id; 0; ) else if ((obj != nil) && (obj == axisstr.V3D_hAxisObject) && ((axisstr.V3D_iAxisInputId == nil) || (axisstr.V3D_iAxisInputId == id))) then ( let SO3EntityGetMaterialByIndex axisstr.V3D_xAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_xAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_xAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_xAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_xAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_yAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_yAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_yAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_yAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_yAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_zAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_zAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_zAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_zAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_zAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_hAxisObject 0 -> mat in ( set sessionstr.V3D_mLastAxisMat = mat; SO3MaterialSetSelfIllumination mat axisstr.V3D_sAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_sAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_sAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_sAxisColor; ); set axisstr.V3D_iAxisInputId = id; 0; ) else if ((sessionstr.V3D_mLastAxisMat != nil) && ((axisstr.V3D_iAxisInputId == nil) || (axisstr.V3D_iAxisInputId == id))) then ( let SO3EntityGetMaterialByIndex axisstr.V3D_xAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_xAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_xAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_xAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_xAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_yAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_yAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_yAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_yAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_yAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_zAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_zAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_zAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_zAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_zAxisColor; ); let SO3EntityGetMaterialByIndex axisstr.V3D_hAxisObject 0 -> mat in ( SO3MaterialSetSelfIllumination mat axisstr.V3D_hAxisColor; SO3MaterialSetAmbient mat axisstr.V3D_hAxisColor; SO3MaterialSetDiffuse mat axisstr.V3D_hAxisColor; SO3MaterialSetSpecular mat axisstr.V3D_hAxisColor; ); set axisstr.V3D_iAxisInputId = nil; set sessionstr.V3D_mLastAxisMat = nil; 0; ) else nil; ) else nil; set i2 = i2 + 1; ); 0;; fun cbV3DscenePreRender(session, sessionstr, etime)= exec sessionstr.V3D_cbScenePreRender with [sessionstr etime]; let sessionstr.V3D_sessionView -> viewstr in let _GETdesktopSize -> [sw sh] in let V3DgetLastMouseMove viewstr 0 -> [mx my] in let V3DgetLastMouseClick viewstr 0 -> [cx cy] in let V3DgetLastMouseRender viewstr 0 -> [rx ry] in let if rx == nil then cx else rx -> mvx in let if ry == nil then cy else ry -> mvy in let [(mx-mvx) (mvy-my)] -> [dx dy] in ( if (viewstr.V3D_bVRpointer) then nil else let SO3BufferGetLastMouseInfos viewstr.V3D_buffer -> infos in let infos -> [session viewport obj mat ent pdata p3d puv dist] in let V3DgetSessionByScene viewstr session -> msessionstr in ( V3DupdateLastMouseData viewstr 0 [msessionstr viewport obj mat ent pdata p3d puv dist]; findCurrentMouseAxis sessionstr 0; ); let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in let if (widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl) && (SO3WidgetIsMouseOver widgetctrl) then 1 else 0 -> disablenavig in ( // Camera rotation on mouse drag let sessionstr.V3D_selectedAxis -> [axisstr _] in if (viewstr.V3D_iMoveClickStatus != V3DCLICK_LEFT) || (_keybdstate != 0) || (!sessionstr.V3D_bNavigate) || (!sessionstr.V3D_bNavigateControl) || ((axisstr != nil) && axisstr.V3D_iAxisMode) || disablenavig then nil else let 3.14159265 /. ((itof sw) /. 2.0) *. (itof dx) -> fdx in let 3.14159265 /. ((itof sh) /. 2.0) *. (itof -dy) -> fdy in ( SO3ObjectRotateYaw sessionstr.V3D_shellNavigate (-. fdx) SO3_WORLD_TS; SO3ObjectRotatePitch sessionstr.V3D_shellNavigate (-. fdy) SO3_LOCAL_TS; ); // mouse pan with left Click + Ctrl if ((viewstr.V3D_iMoveClickStatus != V3DCLICK_MIDDLE) && (viewstr.V3D_iMoveClickStatus != V3DCLICK_LEFT|V3DCLICK_CTRL)) || (_keybdstate &4) || (_keybdstate &1) || (!sessionstr.V3D_bNavigate) || (!sessionstr.V3D_bNavigateControl) || disablenavig then nil else ( V3DcameraPan sessionstr V3DgetDefaultViewport viewstr dx dy; ); // mouse zoom with left click + Ctrl + Alt if (viewstr.V3D_iMoveClickStatus != V3DCLICK_CTRL|V3DCLICK_LEFT) || !(_keybdstate &4) || (!sessionstr.V3D_bNavigate) || (!sessionstr.V3D_bNavigateControl) || disablenavig then nil else ( let if iGlobalUnit > 1 then ((itof iGlobalUnit) /. 10.0) else (itof iGlobalUnit) -> unitdiv in ( let SO3ObjectGetPosition (V3DgetDefaultCamera sessionstr) -> [_ _ z] in let (((itof -dy) /. 10.0) *. (((absf z) +. 10.0) /. (100.0 /. unitdiv)) ) -> zm in if zm <. 0.0 && z <=. 0.0 then nil else ( SO3ObjectSetPosition (V3DgetDefaultCamera sessionstr) [0.0 0.0 z +. zm]; V3DsetOrthographicScale (V3DgetDefaultCamera sessionstr) (z +. zm); ); 0; ); ); // render stats and debug let sizelist viewstr.V3D_lViewport -> vsize in let SO3BufferGetAverageFPS viewstr.V3D_buffer -> avfps in let SO3BufferGetBatchCount viewstr.V3D_buffer -> bcount in let 0 -> v in while v < vsize do ( let nth_list viewstr.V3D_lViewport v -> [_ viewportstr] in if !(SO3DebugGetEnable viewportstr.V3D_viewport) then nil else let if (avfps <=. 0.0) then 0.0 else (1000.0 /. avfps) -> frametime in SO3DebugSetText viewportstr.V3D_viewport strcatn "FPS: "::(itoa (ftoi avfps))::"\n"::"Frametime (ms): "::(ftoa2d frametime)::"\n"::"Polygon count: "::(itoa SO3BufferGetTriangleCount viewstr.V3D_buffer)::"\n"::"Batch count: "::(itoa bcount)::"\n"::nil; set v = v + 1; ); set viewstr.V3D_iRenderTick = _tickcount; ); //update 3D sound listener let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let SO3ObjectGetGlobalPosition camera -> pos in let SO3ObjectGetDerivedDirection camera -> dir in _AudioSetListenerPosition pos dir; V3DupdateLastMouseDir viewstr 0 (if rx == nil then 0 else mx - rx) (if ry == nil then 0 else my - ry); V3DupdateLastMouseRender viewstr 0 mx my; ); 0;; fun cbV3DscenePreRender2(session, sessionstr, etime)= exec sessionstr.V3D_cbScenePreRender2 with [sessionstr etime]; exec sessionstr.V3D_cbHUDPreRender with [sessionstr etime]; 0;; fun cbV3DscenePreRenderPhysic(session, sessionstr, etime)= exec sessionstr.V3D_cbScenePreRenderPhysic with [sessionstr etime]; let sessionstr.V3D_sessionView -> viewstr in ( V3DupdateAxisTarget viewstr sessionstr; V3DupdateHelpersTarget viewstr sessionstr; ); 0;; fun cbV3DscenePostRender(buffer, sessionstr, etime)= exec sessionstr.V3D_cbScenePostRender with [sessionstr etime]; 0;; fun V3DgetDefaultCompositorsList(sessionstr)= SO3SceneParseCompositorsFromGroup (V3DgetSession sessionstr) "SO3/Internal";; fun V3DloadDefaultCompositors(sessionstr)= let strcat sV3DDEFAULTRESOURCESPATH "compositors" -> comppath in ( let getFilesFromDir comppath "program"::nil -> l in let sizelist l -> size in let 0 -> i in while i < size do ( let nth_list l i -> elt in SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack elt SO3_RESOURCE_GPUPROGRAM; set i = i + 1; ); let getFilesFromDir comppath "material"::nil -> l in let sizelist l -> size in let 0 -> i in while i < size do ( let nth_list l i -> elt in SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack elt SO3_RESOURCE_MATERIAL; set i = i + 1; ); let getFilesFromDir comppath "compositor"::nil -> l in let sizelist l -> size in let 0 -> i in while i < size do ( let nth_list l i -> elt in SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack elt SO3_RESOURCE_COMPOSITOR; set i = i + 1; ); ); 0;; fun V3DloadDefaultResources(sessionstr)= // helpers resources SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helpers.material") SO3_RESOURCE_MATERIAL; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_x.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_y.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/ang_axis_z.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_x.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_y.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_scale_z.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_x.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_y.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/base_axis_z.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_x.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_y.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_z.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_x.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_y.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/coords_axis_text_z.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_camera.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dummy.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_dir_light.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_spot_light.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/helper_light.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/default_grid_helper.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/h_line_b.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/h_line_w.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/v_line_b.mesh") SO3_RESOURCE_MESH; SO3SceneLoadResource (V3DgetSession sessionstr) sV3DResourcesGroup _checkpack (strcat sV3DDEFAULTRESOURCESPATH "helpers/v_line_w.mesh") SO3_RESOURCE_MESH; //V3DloadDefaultCompositors sessionstr; 0;; fun V3DuseDefaultLight(sessionstr, state)= if ((sessionstr.V3D_defaultLight == nil) && state) then ( set sessionstr.V3D_defaultLight = V3DaddLight sessionstr "default_light" nil SO3_DIRECTIONAL_LIGHT (make_rgba 250 250 250 0) (make_rgba 255 255 255 0) 15000.0 0.1 0.0 0.0; SO3ObjectSetPosition sessionstr.V3D_defaultLight [0.0 0.0 0.0]; SO3ObjectSetOrientation sessionstr.V3D_defaultLight [(-.0.146521) 0.853541 (-.0.353523) (-.0.353523)]; 0; ) else if (sessionstr.V3D_defaultLight != nil) then ( SO3ObjectSetVisible sessionstr.V3D_defaultLight state 0; 0; ) else nil; 0;; fun V3DisDefaultLightEnable(sessionstr)= if ((sessionstr.V3D_defaultLight == nil) || !(SO3ObjectGetVisible sessionstr.V3D_defaultLight)) then 0 else 1;; fun V3DgetDefaultLight(sessionstr)= sessionstr.V3D_defaultLight;; fun V3DdeleteSession(viewstr, sessionstr)= if sessionstr == nil then nil else ( set lV3DSessions = remove_idx_from_list lV3DSessions (V3DgetSession sessionstr); V3DphysDestroy sessionstr; SO3SceneDelete (V3DgetSession sessionstr); let V3DgetSessionIndex viewstr sessionstr -> idx in set viewstr.V3D_lSessions = V3DremoveIdxFromList viewstr.V3D_lSessions idx; ); 0;; /*! @ingroup v3DApi * \brief Create a 3d scene structure * * Prototype: fun [V3Dview, S] V3Dsession * * \param V3Dview : the 3d view structure * \param S : the scene name (must be unique) * * \return V3Dsession : the new 3d scene structure **/ fun V3DcrSession(viewstr, name)= let let 0 -> i in ( while ((switch viewstr.V3D_lSessions i) != nil) do ( set i = i + 1; ); i; ) -> idx in let mkV3Dsession [viewstr nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil] -> sessionstr in ( set viewstr.V3D_lSessions = V3Dlcat viewstr.V3D_lSessions [idx sessionstr]::nil; // create the new scene set sessionstr.V3D_session = SO3SceneCreate viewstr.V3D_channel strcatn (itoa iV3DSessionIndex)::"."::name::nil; set iV3DSessionIndex = iV3DSessionIndex + 1; set lV3DSessions = [sessionstr.V3D_session sessionstr]::lV3DSessions; //SO3GroupCreate sessionstr.V3D_session sV3DResourcesGroup; set sessionstr.V3D_bHelpersState = 0; // create the default camera V3DaddCamera sessionstr "default_camera"; // create a shell set sessionstr.V3D_shellNavigate = SO3SceneNodeCreate (V3DgetSession sessionstr) "camshell"; SO3ObjectSetFlags sessionstr.V3D_shellNavigate iNodeFlagTools; // set the shell position SO3ObjectSetPosition sessionstr.V3D_shellNavigate [0.0 0.0 0.0]; // set the shell orientation SO3ObjectRotatePitch sessionstr.V3D_shellNavigate (-.0.5) SO3_LOCAL_TS; // link the camera to the shell SO3ObjectLink (V3DgetDefaultCamera sessionstr) sessionstr.V3D_shellNavigate; // define that the camera always look at this point //SO3ObjectLookAt (V3DgetDefaultCamera sessionstr) [0.0 0.0 0.0] 2; SO3ObjectSetPosition (V3DgetDefaultCamera sessionstr) [0.0 0.0 (5.0 *. itof(iGlobalUnit))]; // set the ambient light color V3DsetAmbientLight sessionstr 0x000000; set sessionstr.V3D_bNavigate = 0; set sessionstr.V3D_bNavigateControl = 1; //V3DloadDefaultResources sessionstr; SO3CbScenePreRender (V3DgetSession sessionstr) @cbV3DscenePreRender sessionstr; SO3CbScenePreRenderPhysic (V3DgetSession sessionstr) @cbV3DscenePreRenderPhysic sessionstr; SO3CbScenePreRender2 (V3DgetSession sessionstr) @cbV3DscenePreRender2 sessionstr; SO3CbScenePostRender (V3DgetSession sessionstr) @cbV3DscenePostRender sessionstr; V3DphysCreate sessionstr; sessionstr; );; /*! @ingroup v3DApi * \brief Reset a 3d scene * * Prototype: fun [V3Dsession] I * * \param V3Dsession : the 3d scene structure * * \return 0 **/ fun V3DresetSession(sessionstr)= SO3SceneClear (V3DgetSession sessionstr); SO3GroupDelete (V3DgetSession sessionstr) sV3DResourcesGroup; set sessionstr.V3D_lCamera = nil; set sessionstr.V3D_lAxis = nil; set sessionstr.V3D_lHelper = nil; set sessionstr.V3D_shellNavigate = nil; set sessionstr.V3D_lAnimations = nil; set sessionstr.V3D_lPrevDefaultCamera = nil; set sessionstr.V3D_defaultCamera = nil; SO3ObjectDestroy sessionstr.V3D_defaultLight; set sessionstr.V3D_defaultLight = nil; V3DphysReset sessionstr; SO3SceneSetShadowCaster (V3DgetSession sessionstr) nil; SO3SceneSetShadowReceiver (V3DgetSession sessionstr) nil; SO3GroupCreate (V3DgetSession sessionstr) sV3DResourcesGroup; V3DsetCamera (V3DaddCamera sessionstr "default_camera") nil nil 0.01 10000.0; // create a shell set sessionstr.V3D_shellNavigate = SO3SceneNodeCreate (V3DgetSession sessionstr) "camshell"; SO3ObjectSetFlags sessionstr.V3D_shellNavigate iNodeFlagTools; // set the shell position SO3ObjectSetPosition sessionstr.V3D_shellNavigate [0.0 0.0 0.0]; // set the shell orientation SO3ObjectRotatePitch sessionstr.V3D_shellNavigate (-.0.5) SO3_LOCAL_TS; // link the camera to the shell SO3ObjectLink (V3DgetDefaultCamera sessionstr) sessionstr.V3D_shellNavigate; SO3ObjectSetPosition (V3DgetDefaultCamera sessionstr) [0.0 0.0 (5.0 *. itof(iGlobalUnit))]; V3DchangeCameraViewport sessionstr nil (V3DgetDefaultCamera sessionstr); V3DloadDefaultResources sessionstr; if sessionstr.V3D_helperGrid == nil then nil else ( set sessionstr.V3D_helperGrid = nil; V3DshowSceneGrid sessionstr 1; ); 0;; fun cbV3DkillFocus(win, viewstr)= if !viewstr.V3D_iClickStatus then nil else ( let V3DgetLastMouseClick viewstr 0 -> [cx cy] in if cx == nil || cy == nil then nil else exec viewstr.V3D_cbUnClick with [viewstr cx cy viewstr.V3D_iClickStatus]; set viewstr.V3D_iClickStatus = V3DCLICK_NO; ); if !viewstr.V3D_iMoveClickStatus then nil else ( let V3DgetLastMouseMove viewstr 0 -> [mx my] in if mx == nil || my == nil then nil else exec viewstr.V3D_cbUnClick with [viewstr mx my viewstr.V3D_iMoveClickStatus]; set viewstr.V3D_iMoveClickStatus = V3DCLICK_NO; ); exec viewstr.V3D_cbKillFocusView with [viewstr]; 0;; /*! @ingroup v3DApi * \brief Set the 3d view focus * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return 0 **/ fun V3DviewSetFocus(viewstr)= _SETfocus viewstr.V3D_win; 0;; fun V3DchangeSelectedAxis(sessionstr, objname, mode)= let SO3SceneGetObject (V3DgetSession sessionstr) objname -> refobj in let (switch sessionstr.V3D_lAxis refobj) -> axisstr in ( set axisstr.V3D_tAxisClickPRS = [(SO3ObjectGetGlobalPosition axisstr.V3D_axisFather) (SO3ObjectGetGlobalOrientation axisstr.V3D_axisFather) (SO3ObjectGetGlobalScale axisstr.V3D_axisFather)]; set sessionstr.V3D_selectedAxis = [axisstr mode]; axisstr; );; /*! @ingroup v3DApi * \brief Set the mouse cursor visibility state * * Prototype: fun [V3Dview I] I * * \param V3Dview : the 3d view structure * \param I : 1 to show the cursor, 0 to hide * * \return 0 **/ fun V3DshowCursor(viewstr, state)= if (state) then _SETwinCursor viewstr.V3D_win nil else _SETwinCursor viewstr.V3D_win cHIDECURSOR; set viewstr.V3D_bShowCursor = state; 0;; /*! @ingroup v3DApi * \brief Get a 3d view the mouse cursor visibility state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return I : the cursor visibility state **/ fun V3DgetCursorVisible(viewstr)= viewstr.V3D_bShowCursor;; /*! @ingroup v3DApi * \brief Get a 3d view mouse cursor * * Prototype: fun [V3Dview] ObjCursor * * \param V3Dview : the 3d view structure * * \return ObjCursor : the current 3d view mouse cursor **/ fun V3DgetCursor(viewstr)= _GETcursorWin viewstr.V3D_win;; fun cbV3DviewDropFile(win, viewstr, x, y, lp)= exec viewstr.V3D_cbDropFile with [viewstr x y lp]; 0;; fun cbV3DviewKeyDown(win, viewstr, key, ascode)= let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetKeyboardEnable widgetctrl)) then nil else ( let if (viewstr.V3D_cbKeyDownHUD == nil) then 0 else exec viewstr.V3D_cbKeyDownHUD with [viewstr key ascode] -> rep in if (rep) then nil else ( let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in if (!sessionstr.V3D_bNavigate || !sessionstr.V3D_bNavigateControl) then nil else ( if key == 328 then // UP ( SO3ObjectRotatePitch sessionstr.V3D_shellNavigate (-.0.1) SO3_LOCAL_TS; ) else nil; if key == 336 then // DOWN ( SO3ObjectRotatePitch sessionstr.V3D_shellNavigate (0.1) SO3_LOCAL_TS; ) else nil; if key == 331 then // LEFT ( SO3ObjectRotateYaw sessionstr.V3D_shellNavigate (-.0.1) SO3_WORLD_TS; ) else nil; if key == 333 then // RIGHT ( SO3ObjectRotateYaw sessionstr.V3D_shellNavigate (0.1) SO3_WORLD_TS; ) else nil; ); exec viewstr.V3D_cbKeyDown with [viewstr key ascode]; ); ); 0;; fun cbV3DviewKeyUp(win, viewstr, key)= let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetKeyboardEnable widgetctrl)) then nil else ( let if (viewstr.V3D_cbKeyUpHUD == nil) then 0 else exec viewstr.V3D_cbKeyUpHUD with [viewstr key] -> rep in if (rep) then nil else exec viewstr.V3D_cbKeyUp with [viewstr key]; ); 0;; fun cbV3DviewDbClick(win, viewstr, posx, posy, btn)= if (V3DgetCursorVisible viewstr) then nil else V3DshowCursor viewstr 0; //double click if (viewstr.V3D_bVRpointer) then nil else ( SO3BufferInjectMouseClick viewstr.V3D_buffer posx posy btn; SO3BufferInjectMouseUnClick viewstr.V3D_buffer posx posy btn; ); let SO3BufferGetLastMouseInfos viewstr.V3D_buffer -> infos in let infos -> [session viewport obj mat ent pdata p3d puv dist] in let V3DgetSessionByScene viewstr session -> msessionstr in V3DupdateLastMouseData viewstr 0 [msessionstr viewport obj mat ent pdata p3d puv dist]; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else //[posx posy] -> [posx posy] in ( let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl) && (SO3WidgetIsMouseOver widgetctrl)) then nil else ( exec viewstr.V3D_cbDbClick with [viewstr posx posy btn]; ); ); 0;; fun cbV3DviewClick(win, viewstr, posx, posy, btn)= V3DviewSetFocus viewstr; V3DupdateLastClickPos viewstr 0 posx posy; //addLogMessage strcatn "V3D Click in: "::(itoa posx)::" "::(itoa posy)::" "::(itoa btn)::nil; if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseClick viewstr.V3D_buffer posx posy btn; if (V3DgetCursorVisible viewstr) then nil else V3DshowCursor viewstr 0; let SO3BufferGetLastMouseInfos viewstr.V3D_buffer -> infos in let infos -> [session viewport obj mat ent pdata p3d puv dist] in let V3DgetSessionByScene viewstr session -> msessionstr in V3DupdateLastMouseData viewstr 0 [msessionstr viewport obj mat ent pdata p3d puv dist]; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl) && (SO3WidgetIsMouseOver widgetctrl)) then nil else ( V3DupdateLastMouseClick viewstr 0 posx posy; set viewstr.V3D_iClickStatus = if btn == nil then V3DCLICK_NO else btn; let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in ( //update axis color on selection findCurrentMouseAxis sessionstr 0; if sessionstr.V3D_selectedAxis != nil then nil else let V3DgetLastMouseData viewstr 0 -> [_ _ obj mat _ _ _ _ _] in let sizelist sessionstr.V3D_lAxis -> size2 in let 0 -> i2 in while (i2 < size2) && (sessionstr.V3D_selectedAxis == nil) do ( let nth_list sessionstr.V3D_lAxis i2 -> [_ axisstr] in ( set axisstr.V3D_tAxisClickPRS = [(SO3ObjectGetGlobalPosition axisstr.V3D_axisFather) (SO3ObjectGetGlobalOrientation axisstr.V3D_axisFather) (SO3ObjectGetGlobalScale axisstr.V3D_axisFather)]; if ((obj != nil) && (obj == axisstr.V3D_xAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_X]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_X posx posy btn]; ) else if ((obj != nil) && (obj == axisstr.V3D_yAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_Y]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_Y posx posy btn] ) else if ((obj != nil) && (obj == axisstr.V3D_zAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_Z]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_Z posx posy btn] ) else if ((obj != nil) && (obj == axisstr.V3D_hAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_H]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_H posx posy btn] ) else nil; ); set i2 = i2 + 1; ); ); exec viewstr.V3D_cbClick with [viewstr posx posy btn]; let V3DgetLastMouseData viewstr 0 -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputClick with [viewstr 0 posx posy btn [obj mat ent p3d puv dist]]; ); 0;; fun cbV3DviewPointerClick(viewstr, id, src, posx, posy, btn, pdata)= V3DviewSetFocus viewstr; V3DupdateLastClickPos viewstr id posx posy; let pdata -> [_ _ _ p3d _ d] in let src -> [spos squat] in V3DupdateLastPointerClick viewstr id [spos squat p3d d]; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in ( //update axis color on selection findCurrentMouseAxis sessionstr id; V3DupdateLastMouseClick viewstr id posx posy; set viewstr.V3D_iClickStatus = if btn == nil then V3DCLICK_NO else btn; let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in ( if sessionstr.V3D_selectedAxis != nil then nil else let V3DgetLastMouseData viewstr id -> [_ _ obj mat _ _ _ _ _] in let sizelist sessionstr.V3D_lAxis -> size2 in let 0 -> i2 in while (i2 < size2) && (sessionstr.V3D_selectedAxis == nil) do ( let nth_list sessionstr.V3D_lAxis i2 -> [_ axisstr] in ( set axisstr.V3D_tAxisClickPRS = [(SO3ObjectGetGlobalPosition axisstr.V3D_axisFather) (SO3ObjectGetGlobalOrientation axisstr.V3D_axisFather) (SO3ObjectGetGlobalScale axisstr.V3D_axisFather)]; if ((obj != nil) && (obj == axisstr.V3D_xAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_X]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_X posx posy btn]; ) else if ((obj != nil) && (obj == axisstr.V3D_yAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_Y]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_Y posx posy btn] ) else if ((obj != nil) && (obj == axisstr.V3D_zAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_Z]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_Z posx posy btn] ) else if ((obj != nil) && (obj == axisstr.V3D_hAxisObject)) then ( set sessionstr.V3D_selectedAxis = [axisstr V3DAXIS_H]; exec axisstr.V3D_cbAxisClick with [axisstr sessionstr axisstr.V3D_axisFather V3DAXIS_H posx posy btn] ) else nil; ); set i2 = i2 + 1; ); ); exec viewstr.V3D_cbClick with [viewstr posx posy btn]; exec viewstr.V3D_cbInputClick with [viewstr id posx posy btn pdata]; ); 0;; fun cbV3DviewPointerUpdate(viewstr, id, src, posx, posy, btn, pdata)= let pdata -> [obj mat subid p3d puv dist] in let V3DgetDefaultSession viewstr -> sessionstr in ( V3DupdateLastMouseData viewstr id [sessionstr nil obj mat subid nil p3d puv dist]; findCurrentMouseAxis sessionstr id; ); 0;; /*! @ingroup v3DApi * \brief Get a 3d view last cursor translation * * Prototype: fun [V3Dview] [I I] * * \param V3Dview : the 3d view structure * * \return [I I] : x, y cursor translation **/ fun V3DgetCursorTrans(viewstr)= if viewstr.V3D_iMoveClickStatus & (V3DCLICK_LEFT|V3DCLICK_RIGHT|V3DCLICK_MIDDLE) then let V3DgetLastMouseMove viewstr 0 -> [mx my] in let V3DgetLastMouseClick viewstr 0 -> [cx cy] in [(mx-cx) (cy-my)] else nil;; /*! @ingroup v3DApi * \brief Get a 3d view last cursor direction * * Prototype: fun [V3Dview] [I I] * * \param V3Dview : the 3d view structure * * \return [I I] : x, y cursor direction **/ fun V3DgetCursorDirection(viewstr)= V3DgetLastMouseDir viewstr 0;; /*! @ingroup v3DApi * \brief Get a 3d view last mouse click state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return I : 1 if the 3d view is clicked **/ fun V3DisClicked(viewstr)= viewstr.V3D_iClickStatus;; /*! @ingroup v3DApi * \brief Get a 3d view last mouse move click state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return I : 1 if the 3d view is clicked while cursor moving **/ fun V3DisMoveClicked(viewstr)= viewstr.V3D_iMoveClickStatus;; fun cbV3DviewUnclick(win, viewstr, posx, posy, btn) = if (V3DgetCursorVisible viewstr) then nil else V3DshowCursor viewstr 0; let V3DgetLastClickPos viewstr 0 -> lcp in let if (lcp == nil) then [posx posy] else lcp -> [cx cy] in V3DupdateLastClickMove viewstr 0 (cx - posx) (cy - posy); //addLogMessage strcatn "V3D UnClick in: "::(itoa posx)::" "::(itoa posy)::" "::(itoa btn)::nil; if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseUnClick viewstr.V3D_buffer posx posy btn; let SO3BufferGetLastMouseInfos viewstr.V3D_buffer -> infos in let infos -> [session viewport obj mat ent pdata p3d puv dist] in let V3DgetSessionByScene viewstr session -> msessionstr in V3DupdateLastMouseData viewstr 0 [msessionstr viewport obj mat ent pdata p3d puv dist]; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl)) then nil else ( if viewstr.V3D_iClickStatus == V3DCLICK_NO && viewstr.V3D_iMoveClickStatus == V3DCLICK_NO then nil else ( set viewstr.V3D_iClickStatus = V3DCLICK_NO; set viewstr.V3D_iMoveClickStatus = V3DCLICK_NO; V3DupdateLastMouseRender viewstr 0 nil nil; exec viewstr.V3D_cbUnClick with [viewstr posx posy btn]; let V3DgetLastMouseData viewstr 0 -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputUnClick with [viewstr 0 posx posy btn [obj mat ent p3d puv dist]]; let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in ( if sessionstr.V3D_selectedAxis == nil then nil else let sessionstr.V3D_selectedAxis -> [axisstr axisflag] in ( set axisstr.V3D_tAxisClickPRS = nil; exec axisstr.V3D_cbAxisUnClick with [sessionstr axisstr.V3D_axisFather axisflag posx posy btn]; set sessionstr.V3D_selectedAxis = nil; ); ); ); ); 0;; fun cbV3DviewPointerUnClick(viewstr, id, posx, posy, btn, pdata)= let V3DgetLastClickPos viewstr id -> lcp in let if (lcp == nil) then [posx posy] else lcp -> [cx cy] in V3DupdateLastClickMove viewstr id (cx - posx) (cy - posy); if viewstr.V3D_iClickStatus == V3DCLICK_NO && viewstr.V3D_iMoveClickStatus == V3DCLICK_NO then nil else let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in ( set viewstr.V3D_iClickStatus = V3DCLICK_NO; set viewstr.V3D_iMoveClickStatus = V3DCLICK_NO; V3DupdateLastMouseRender viewstr 0 nil nil; exec viewstr.V3D_cbUnClick with [viewstr posx posy btn]; exec viewstr.V3D_cbInputUnClick with [viewstr id posx posy btn pdata]; let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in ( if sessionstr.V3D_selectedAxis == nil then nil else let sessionstr.V3D_selectedAxis -> [axisstr axisflag] in ( exec axisstr.V3D_cbAxisUnClick with [sessionstr axisstr.V3D_axisFather axisflag posx posy btn]; set sessionstr.V3D_selectedAxis = nil; ); ); ); 0;; fun cbV3DviewWheel(win, viewstr, posx, posy, delta, btn)= if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseWheel viewstr.V3D_buffer posx posy delta; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in if ((widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl)) then nil else ( let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in if (!sessionstr.V3D_bNavigate || !sessionstr.V3D_bNavigateControl) then nil else ( let if iGlobalUnit > 1 then ((itof iGlobalUnit) /. 10.0) else (itof iGlobalUnit) -> unitdiv in ( let SO3ObjectGetPosition (V3DgetDefaultCamera sessionstr) -> [_ _ z] in let ((itof -delta) *. (((absf z) +. 10.0) /. (100.0 /. unitdiv)) ) -> zm in let if (_keybdstate &2) then zm *. 10.0 else if (_keybdstate &1) then zm /. 5.0 else zm -> zm in if zm <. 0.0 && z <=. 0.0 then nil else ( SO3ObjectSetPosition (V3DgetDefaultCamera sessionstr) [0.0 0.0 z +. zm]; V3DsetOrthographicScale (V3DgetDefaultCamera sessionstr) (z +. zm); ); 0; ); ); exec viewstr.V3D_cbWheel with [viewstr posx posy delta btn]; ); 0;; fun V3DgetMoveAxis(viewstr, posx, posy, btn)= let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let V3DgetOrthographicMode camera -> ortho in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in if sessionstr.V3D_lAxis == nil then nil else ( let sessionstr.V3D_selectedAxis -> [selectedaxisstr axisflag] in if ((sessionstr.V3D_selectedAxis == nil) || (selectedaxisstr == nil)) then nil else ( let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let V3DgetLastMouseMove viewstr 0 -> [mx my] in let [(posx - mx) (posy - my)] -> [mvx mvy] in let if (selectedaxisstr.V3D_iAxisMode != 2) then [mvx mvy] else let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [0.0 0.0 1.0] -> czdir in let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [-.1.0 0.0 0.0] -> cxdir in let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation selectedaxisstr.V3D_axisShell) (if axisflag == V3DAXIS_X then [1.0 0.0 0.0] else if axisflag == V3DAXIS_Y then [0.0 1.0 0.0] else [0.0 0.0 1.0]) -> rdir in let multiplyVectorF czdir rdir -> [ddx ddy ddz] in let ddx +. ddy +. ddz -> ds in let multiplyVectorF cxdir rdir -> [xdx xdy xdz] in let xdx +. xdy +. xdz -> xs in //let addLogMessage ftoa xs -> _ in if ((ds >. 0.55) || (xs >. 0.8)) then [ftoi (0.75 *. itof(-mvx)) ftoi (0.75 *. itof(-mvy))] else [ftoi (0.75 *. itof mvx) ftoi (0.75 *. itof mvy)] -> [rmvx rmvy] in if ortho then ( let if axisflag == V3DAXIS_X then [selectedaxisstr.V3D_xAxisObject selectedaxisstr.V3D_xAxisTextObject] else if axisflag == V3DAXIS_Y then [selectedaxisstr.V3D_yAxisObject selectedaxisstr.V3D_yAxisTextObject] else if axisflag == V3DAXIS_Z then [selectedaxisstr.V3D_zAxisObject selectedaxisstr.V3D_zAxisTextObject] else if axisflag == V3DAXIS_H then [selectedaxisstr.V3D_hAxisObject selectedaxisstr.V3D_hAxisObject] else nil -> [axisobj letterobj] in let SO3ObjectGetScreenPixelCoord axisobj viewportstr.V3D_viewport -> axp in let SO3ObjectGetScreenPixelCoord letterobj viewportstr.V3D_viewport -> axlp in if (axp == nil) || (axlp == nil) then nil else ( let axp -> [shpx shpy] in let axlp -> [lhpx lhpy] in let if (axisobj == letterobj) then [100.0 (-.100.0)] else [(itof (lhpx-shpx)) (itof (lhpy-shpy))] -> [u v] in let if (selectedaxisstr.V3D_iAxisMode != 1) then 2.0 else let SO3ObjectGetGlobalPosition camera -> [cx cy cz] in let SO3ObjectGetGlobalPosition selectedaxisstr.V3D_axisShell -> [ox oy oz] in let normalizeVectorF (SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [0.0 0.0 (-.1.0)]) -> dir in dotVectorF (subVectorF [ox oy oz] [cx cy cz]) dir -> dist in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let if (vw <= 0) then 1 else vw -> vw in let if (vh <= 0) then 1 else vh -> vh in // TODO find the real algo ! use global scale ? let maxf 0.000001 (dist /. (itof vh)) *. 98.5 -> scale in let ((scale *. (u *. (itof mvx) +. v *. (itof mvy))) /. sqr(0.000001+.sqrt((sqr u)+.(sqr v)))) -> coef in if u == nil || v == nil || coef == 0.0 then nil else ( exec selectedaxisstr.V3D_cbAxisMove with [sessionstr selectedaxisstr axisflag rmvx rmvy btn coef]; ); ); ) else ( let SO3ObjectGetGlobalPosition camera -> campos in let SO3ObjectGetGlobalPosition selectedaxisstr.V3D_axisShell -> axispos in let SO3ViewportGetWorldPosFromPixelPosition viewportstr.V3D_viewport posx posy 20.0 -> [[px py pz] [dx dy dz]] in let V3DgetLastMouseMove viewstr 0 -> [mx my] in let SO3ViewportGetWorldPosFromPixelPosition viewportstr.V3D_viewport mx my 20.0 -> [[lpx lpy lpz] [ldx ldy ldz]] in let if (selectedaxisstr.V3D_iAxisMode == 2) then [0.57735 0.57735 0.57735] else if axisflag == V3DAXIS_H then SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [1.0 1.0 1.0] else SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation selectedaxisstr.V3D_axisShell) if axisflag == V3DAXIS_X then if (selectedaxisstr.V3D_iAxisMode != 2) then [1.0 0.0 0.0] else [1.0 1.0 1.0] else if axisflag == V3DAXIS_Y then if (selectedaxisstr.V3D_iAxisMode != 2) then [0.0 1.0 0.0] else [1.0 1.0 1.0] else // V3DAXIS_Z if (selectedaxisstr.V3D_iAxisMode != 2) then [0.0 0.0 1.0] else [1.0 1.0 1.0] -> axisdir in let addVectorF axispos (multiplyVectorF axisdir [100.0 100.0 100.0]) -> planepoint3 in let getPlaneNormalF campos axispos planepoint3 -> planenormal in let projectVectorOnPlaneF [dx dy dz] planenormal -> pdir in let projectVectorOnPlaneF [ldx ldy ldz] planenormal -> pldir in let addVectorF (projectVectorF (subVectorF campos axispos) axisdir) axispos -> point2 in let subVectorF point2 campos -> knownedgevec in let getVectorLengthF knownedgevec -> knownedgelength in let getVectorOrientedAngleF knownedgevec pdir planenormal -> rawangle in let getVectorOrientedAngleF knownedgevec pldir planenormal -> rawlangle in let maxf ((-.0.499) *. PIf) (minf (0.499 *. PIf) rawangle) -> angle in let maxf ((-.0.499) *. PIf) (minf (0.499 *. PIf) rawlangle) -> langle in let if (selectedaxisstr.V3D_iAxisMode != 1) then (rawangle -. rawlangle) *. 3.0 else let (sin angle) *. knownedgelength /. (sin (PIf *. 0.5) -. angle) -> edge in let (sin langle) *. knownedgelength /. (sin (PIf *. 0.5) -. langle) -> ledge in edge -. ledge -> coef in if (coef == 0.0) then nil else ( exec selectedaxisstr.V3D_cbAxisMove with [sessionstr selectedaxisstr axisflag rmvx rmvy btn coef]; ); ); ); ); 0;; fun V3DgetMoveAxisPosition(viewstr, id, src, btn)= let (V3DgetDefaultViewport viewstr) -> viewportstr in let SO3ViewportGetCamera viewportstr.V3D_viewport -> camera in let switch lV3DSessions (SO3ObjectGetScene camera) -> sessionstr in if sessionstr.V3D_lAxis == nil then nil else ( let sessionstr.V3D_selectedAxis -> [selectedaxisstr axisflag] in if ((sessionstr.V3D_selectedAxis == nil) || (selectedaxisstr == nil)) then nil else ( let SO3ObjectGetGlobalPosition selectedaxisstr.V3D_axisShell -> axispos in let V3DgetLastPointerClick viewstr id -> [csrc cquat _ cdist] in let if (selectedaxisstr.V3D_iAxisMode == 2) then [0.57735 0.57735 0.57735] else if axisflag == V3DAXIS_H then SO3MathsQuatGetDirection cquat [1.0 1.0 1.0] else normalizeVectorF SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation selectedaxisstr.V3D_axisShell) if axisflag == V3DAXIS_X then [1.0 0.0 0.0] else if axisflag == V3DAXIS_Y then [0.0 1.0 0.0] else // V3DAXIS_Z [0.0 0.0 1.0] -> axisdir in let V3DgetLastPointerMove viewstr id -> pdata in let if (pdata == nil) then [csrc cquat cdist] else pdata -> [lsrc lquat ldist] in let src -> [tsrc tquat tdist] in let SO3MathsQuatGetDirection lquat [0.0 0.0 (-.1.0)] -> ldir in let SO3MathsQuatGetDirection tquat [0.0 0.0 (-.1.0)] -> tdir in let addVectorF axispos (multiplyVectorF axisdir [100.0 100.0 100.0]) -> planepoint3 in let getPlaneNormalF tsrc axispos planepoint3 -> planenormal in let projectVectorOnPlaneF tdir planenormal -> pdir in let projectVectorOnPlaneF ldir planenormal -> pldir in let addVectorF (projectVectorF (subVectorF tsrc axispos) axisdir) axispos -> point2 in let subVectorF point2 tsrc -> knownedgevec in let getVectorLengthF knownedgevec -> knownedgelength in let getVectorOrientedAngleF knownedgevec pdir planenormal -> rawangle in let getVectorOrientedAngleF knownedgevec pldir planenormal -> rawlangle in let maxf ((-.0.47) *. PIf) (minf (0.47 *. PIf) rawangle) -> angle in let maxf ((-.0.47) *. PIf) (minf (0.47 *. PIf) rawlangle) -> langle in let if ((absf (rawangle -. rawlangle)) >=. PIf) then // 360° protection 0.0 else if (selectedaxisstr.V3D_iAxisMode != 1) then (rawangle -. rawlangle) *. 2.0 else let (sin angle) *. knownedgelength /. (sin (PIf *. 0.5) -. angle) -> edge in let (sin langle) *. knownedgelength /. (sin (PIf *. 0.5) -. langle) -> ledge in edge -. ledge -> coef in let projectVectorF (subVectorF tsrc lsrc) axisdir -> mvec in let getVectorLengthF mvec -> mcoef in let if (dotVectorF mvec axisdir) <. 0.0 then -.mcoef else mcoef -> mcoef in let mcoef +. coef -> coef in if (coef == 0.0) then nil else let if (selectedaxisstr.V3D_iAxisMode != 2) then 90.0 else let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [0.0 0.0 1.0] -> czdir in let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation camera) [-.1.0 0.0 0.0] -> cxdir in let SO3MathsQuatGetDirection (SO3ObjectGetGlobalOrientation selectedaxisstr.V3D_axisShell) (if axisflag == V3DAXIS_X then [1.0 0.0 0.0] else if axisflag == V3DAXIS_Y then [0.0 1.0 0.0] else if axisflag == V3DAXIS_Z then [0.0 0.0 1.0] else [0.333333 0.333333 0.333333]) -> rdir in let multiplyVectorF czdir rdir -> [ddx ddy ddz] in let ddx +. ddy +. ddz -> ds in let multiplyVectorF cxdir rdir -> [xdx xdy xdz] in let xdx +. xdy +. xdz -> xs in if ((ds >. 0.55) || (xs >. 0.8)) then 90.0 else -.90.0 -> ts in ( exec selectedaxisstr.V3D_cbAxisMove with [sessionstr selectedaxisstr axisflag (ftoi ((rawangle -. rawlangle) *. 2.0 *. ts)) 0 btn coef]; ); ); ); 0;; fun cbV3DcursorMove(win, viewstr, posx, posy, btn)= if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseMove viewstr.V3D_buffer posx posy btn; let if viewstr.V3D_iClickStatus == V3DCLICK_NO then V3DCLICK_NO else btn -> btn in ( set viewstr.V3D_iMoveClickStatus = btn; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in ( V3DgetMoveAxis viewstr posx posy btn; V3DupdateLastMouseMove viewstr 0 posx posy; exec viewstr.V3D_cbCursorMove with [viewstr posx posy btn]; let V3DgetLastMouseData viewstr 0 -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputUpdate with [viewstr 0 posx posy btn [obj mat ent p3d puv dist]]; ); ); 0;; fun cbV3DPointerMove(viewstr, id, src, posx, posy, btn, pdata)= let if viewstr.V3D_iClickStatus == V3DCLICK_NO then V3DCLICK_NO else btn -> btn in ( set viewstr.V3D_iMoveClickStatus = btn; let //if ((_platform == SCOL_PLATFORM_ANDROID) || (_platform == SCOL_PLATFORM_IOS)) then let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof posx)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof posy)) -> y in [x y] //else // [posx posy] -> [posx posy] in let src -> [tsrc tquat] in let pdata -> [_ _ _ _ _ tdist] in ( V3DgetMoveAxisPosition viewstr id [tsrc tquat tdist] btn; V3DupdateLastPointerMove viewstr id [tsrc tquat tdist]; if (posx == nil) || (posy == nil) then nil else V3DupdateLastMouseMove viewstr id posx posy; let V3DgetLastMouseMove viewstr id -> [mx my] in exec viewstr.V3D_cbCursorMove with [viewstr mx my btn]; exec viewstr.V3D_cbInputUpdate with [viewstr id posx posy btn pdata]; ); ); 0;; fun V3DsetCbResizeHUDView(viewstr, cbfun)= set viewstr.V3D_cbResizeHUDView = cbfun; 0;; fun V3DsetCbResizeView(viewstr, cbfun)= set viewstr.V3D_cbResizeView = cbfun; 0;; fun V3DsetCbFocusView(viewstr, cbfun)= set viewstr.V3D_cbFocusView = cbfun; 0;; fun V3DsetCbKillFocusView(viewstr, cbfun)= set viewstr.V3D_cbKillFocusView = cbfun; 0;; fun V3DsetCbPreRenderEffects(viewstr, cbfun)= set viewstr.V3D_cbPreRenderEffects = cbfun; 0;; fun V3DsetCbPreRender(viewstr, cbfun)= set viewstr.V3D_cbPreRender = cbfun; 0;; fun V3DsetCbPreRender2(viewstr, cbfun)= set viewstr.V3D_cbPreRender2 = cbfun; 0;; fun V3DsetCbPostRender(viewstr, cbfun)= set viewstr.V3D_cbPostRender = cbfun; 0;; fun V3DsetCbScenePreRender(sessionstr, cbfun)= set sessionstr.V3D_cbScenePreRender = cbfun; 0;; fun V3DsetCbHUDPreRender(sessionstr, cbfun)= set sessionstr.V3D_cbHUDPreRender = cbfun; 0;; fun V3DsetCbHUDPostRender(sessionstr, cbfun)= set sessionstr.V3D_cbHUDPostRender = cbfun; 0;; fun V3DsetCbScenePreRender2(sessionstr, cbfun)= set sessionstr.V3D_cbScenePreRender2 = cbfun; 0;; fun V3DsetCbScenePreRenderPhysic(sessionstr, cbfun)= set sessionstr.V3D_cbScenePreRenderPhysic = cbfun; 0;; fun V3DsetCbScenePostRender(sessionstr, cbfun)= set sessionstr.V3D_cbScenePostRender = cbfun; 0;; fun V3DsetCbNavigateControlState(sessionstr, cbfun)= set sessionstr.V3D_cbNavigateControlState = cbfun; 0;; fun V3DsetCbKeyDown(viewstr, cbfun)= set viewstr.V3D_cbKeyDown = cbfun; 0;; fun V3DsetCbKeyUp(viewstr, cbfun)= set viewstr.V3D_cbKeyUp = cbfun; 0;; fun V3DsetCbKeyDownHUD(viewstr, cbfun)= set viewstr.V3D_cbKeyDownHUD = cbfun; 0;; fun V3DsetCbKeyUpHUD(viewstr, cbfun)= set viewstr.V3D_cbKeyUpHUD = cbfun; 0;; fun V3DsetCbDropFile(viewstr, cbfun)= set viewstr.V3D_cbDropFile = cbfun; 0;; fun V3DgetCbDropFile(viewstr)= viewstr.V3D_cbDropFile;; fun V3DsetCbClick(viewstr, cbfun)= set viewstr.V3D_cbClick = cbfun; 0;; fun V3DgetCbClick(viewstr)= viewstr.V3D_cbClick;; fun V3DsetCbDbClick(viewstr, cbfun)= set viewstr.V3D_cbDbClick = cbfun; 0;; fun V3DgetCbDbClick(viewstr)= viewstr.V3D_cbDbClick;; fun V3DsetCbUnClick(viewstr, cbfun)= set viewstr.V3D_cbUnClick = cbfun; 0;; fun V3DgetCbUnClick(viewstr)= viewstr.V3D_cbUnClick;; fun V3DsetCbWheel(viewstr, cbfun)= set viewstr.V3D_cbWheel = cbfun; 0;; fun V3DgetCbWheel(viewstr)= viewstr.V3D_cbWheel;; fun V3DsetCbCursorMove(viewstr, cbfun)= set viewstr.V3D_cbCursorMove = cbfun; 0;; fun V3DgetCbCursorMove(viewstr)= viewstr.V3D_cbCursorMove;; fun V3DsetCbInputClick(viewstr, cbfun)= set viewstr.V3D_cbInputClick = cbfun; 0;; fun V3DgetCbInputClick(viewstr)= viewstr.V3D_cbInputClick;; fun V3DsetCbInputUnClick(viewstr, cbfun)= set viewstr.V3D_cbInputUnClick = cbfun; 0;; fun V3DgetCbInputUnClick(viewstr)= viewstr.V3D_cbInputUnClick;; fun V3DsetCbInputUpdate(viewstr, cbfun)= set viewstr.V3D_cbInputUpdate = cbfun; 0;; fun V3DgetCbInputUpdate(viewstr)= viewstr.V3D_cbInputUpdate;; fun V3DsetCbAxisMove(axisstr, cbfun)= set axisstr.V3D_cbAxisMove = cbfun; axisstr;; fun V3DsetCbAxisClick(axisstr, cbfun)= set axisstr.V3D_cbAxisClick = cbfun; axisstr;; fun V3DsetCbAxisUnClick(axisstr, cbfun)= set axisstr.V3D_cbAxisUnClick = cbfun; axisstr;; /*! @ingroup v3DApi * \brief Set a 3d view keyboard state * * Prototype: fun [V3Dview I] I * * \param V3Dview : the 3d view structure * \param I : 1 to enable the keyboard, 0 to disable * * \return 0 **/ fun V3DenableKeyboard(viewstr, mode)= set viewstr.V3D_bKeyboardEnabled = mode; if !mode then ( //SO3CbBufferKeyDown viewstr.V3D_buffer nil nil; //SO3CbBufferKeyUp viewstr.V3D_buffer nil nil; _CBwinKeydown viewstr.V3D_win nil nil; _CBwinKeyup viewstr.V3D_win nil nil; ) else ( //SO3CbBufferKeyDown viewstr.V3D_buffer @cbV3DviewKeyDown viewstr; //SO3CbBufferKeyUp viewstr.V3D_buffer @cbV3DviewKeyUp viewstr; _CBwinKeydown viewstr.V3D_win @cbV3DviewKeyDown viewstr; _CBwinKeyup viewstr.V3D_win @cbV3DviewKeyUp viewstr; ); 0;; /*! @ingroup v3DApi * \brief Set a 3d view mouse state * * Prototype: fun [V3Dview I] I * * \param V3Dview : the 3d view structure * \param I : 1 to enable the mouse, 0 to disable * * \return 0 **/ fun V3DenableMouse(viewstr, mode)= set viewstr.V3D_bMouseEnabled = mode; if !mode then ( _CBwinClick viewstr.V3D_win nil nil; _CBwinUnclick viewstr.V3D_win nil nil; _CBwinWheel viewstr.V3D_win nil nil; _CBcursorMove viewstr.V3D_win nil nil; _CBwinDClick viewstr.V3D_win nil nil; _CBwinDropFile viewstr.V3D_win nil nil; ) else ( _CBwinClick viewstr.V3D_win @cbV3DviewClick viewstr; _CBwinUnclick viewstr.V3D_win @cbV3DviewUnclick viewstr; _CBwinWheel viewstr.V3D_win @cbV3DviewWheel viewstr; _CBcursorMove viewstr.V3D_win @cbV3DcursorMove viewstr; _CBwinDClick viewstr.V3D_win @cbV3DviewDbClick viewstr; _CBwinDropFile viewstr.V3D_win @cbV3DviewDropFile viewstr; ); 0;; fun V3DenableNavigate(sessionstr, mode)= set sessionstr.V3D_bNavigate = mode; 0;; fun V3DgetNavigateState(sessionstr)= sessionstr.V3D_bNavigate;; fun V3DenableNavigateControl(sessionstr, mode)= if (sessionstr.V3D_bNavigateControl == mode) then nil else ( set sessionstr.V3D_bNavigateControl = mode; exec sessionstr.V3D_cbNavigateControlState with [sessionstr mode]; ); 0;; fun V3DgetNavigateControlState(sessionstr)= sessionstr.V3D_bNavigateControl;; /*! @ingroup v3DApi * \brief Change a 3d view mouse cursor * * Prototype: fun [V3Dview ObjCursor] I * * \param V3Dview : the 3d view structure * \param ObjCursor : the cursor * * \return 0 **/ fun V3DsetCursor(viewstr, cursor)= let (V3DWidgetCtrlHasFocus viewstr) -> widgetctrl in //if ((widgetctrl != nil) && (SO3WidgetGetMouseEnable widgetctrl) && (SO3WidgetIsMouseOver widgetctrl)) then nil else _SETwinCursor viewstr.V3D_win cursor; 0;; fun cbV3Dsize(win, viewstr, w, h)= if w == 0 || h == 0 then nil else ( set viewstr.V3D_iWinW = w; set viewstr.V3D_iWinH = h; if ((SO3BufferGetStereoRotateView viewstr.V3D_buffer) && ((SO3BufferGetStereoMode viewstr.V3D_buffer) != SO3_SM_NONE)) then ( exec viewstr.V3D_cbResizeView with [viewstr h w]; exec viewstr.V3D_cbResizeHUDView with [viewstr h w]; ) else ( exec viewstr.V3D_cbResizeView with [viewstr w h]; exec viewstr.V3D_cbResizeHUDView with [viewstr w h]; ); ); 0;; /*! @ingroup v3DApi * \brief Destroy a 3d view * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return 0 **/ fun V3DdsView(viewstr)= V3DsetWindowedMode viewstr; set lV3DViews = remove_from_list lV3DViews viewstr; if viewstr.V3D_win == nil then nil else ( let sizelist viewstr.V3D_lViewport -> size in let 0 -> i in while i < size do ( let nth_list viewstr.V3D_lViewport i -> [_ viewportstr] in V3DdelViewport viewstr viewportstr; set i = i + 1; ); let sizelist viewstr.V3D_lSessions -> size in let 0 -> i in while i < size do ( let nth_list viewstr.V3D_lSessions i -> [_ sessionstr] in ( SO3GroupDelete (V3DgetSession sessionstr) sV3DResourcesGroup; SO3SceneDelete (V3DgetSession sessionstr); ); set i = i + 1; ); SO3DestroyBuffer viewstr.V3D_buffer; //remove the ds callback to avoid cb looooooop _CBwinDestroy viewstr.V3D_win nil nil; _DSwindow viewstr.V3D_win; set viewstr.V3D_win = nil; exec viewstr.V3D_cbDestroy with [viewstr]; ); 0;; fun V3DsetViewTouchPointAddCb(viewstr, cb)= set viewstr.V3D_cbAddTouchPoint = cb; 0;; fun V3DsetViewTouchPointRemoveCb(viewstr, cb)= set viewstr.V3D_cbRemoveTouchPoint = cb; 0;; fun V3DsetViewTouchPointUpdateCb(viewstr, cb)= set viewstr.V3D_cbUpdateTouchPoint = cb; 0;; fun cbV3DwinAddTouchPoint(win, viewstr, id, x, y)= if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectTouchAdd viewstr.V3D_buffer id x y; let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof x)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof y)) -> y in ( exec viewstr.V3D_cbAddTouchPoint with [viewstr id x y]; let V3DgetLastMouseData viewstr id -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputClick with [viewstr id x y 1 [obj mat ent p3d puv dist]]; ); 0;; fun cbV3DwinRemoveTouchPoint(win, viewstr, id)= if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectTouchRemove viewstr.V3D_buffer id; exec viewstr.V3D_cbRemoveTouchPoint with [viewstr id]; let V3DgetLastMouseData viewstr id -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputUnClick with [viewstr id nil nil 1 [obj mat ent p3d puv dist]]; 0;; fun cbV3DwinUpdateTouchPoint(win, viewstr, id, x, y, vx, vy)= if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectTouchUpdate viewstr.V3D_buffer id x y vx vy; let V3DgetDefaultViewport viewstr -> viewportstr in let SO3ViewportGetPixelPositionSize viewportstr.V3D_viewport -> [_ _ vw vh] in let ftoi (((itof vw) /. (itof viewstr.V3D_iWinW)) *. (itof x)) -> x in let ftoi (((itof vh) /. (itof viewstr.V3D_iWinH)) *. (itof y)) -> y in ( exec viewstr.V3D_cbUpdateTouchPoint with [viewstr id x y vx vy]; let V3DgetLastMouseData viewstr id -> [_ _ obj mat ent _ p3d puv dist] in exec viewstr.V3D_cbInputUpdate with [viewstr id x y 1 [obj mat ent p3d puv dist]]; ); 0;; fun cbV3DwinDestroy(win, viewstr)= V3DdsView viewstr; 0;; fun cbV3DbufferFocus(buffer, viewstr)= exec viewstr.V3D_cbFocusView with [viewstr]; 0;; fun cbV3DbufferKillFocus(buffer, viewstr)= exec viewstr.V3D_cbKillFocusView with [viewstr]; 0;; fun V3DresizeView(viewstr, x, y, w, h)= set viewstr.V3D_iWinX = x; set viewstr.V3D_iWinY = y; set viewstr.V3D_iWinW = w; set viewstr.V3D_iWinH = h; _SIZEwindow viewstr.V3D_win viewstr.V3D_iWinW viewstr.V3D_iWinH viewstr.V3D_iWinX viewstr.V3D_iWinY; 0;; /*! @ingroup v3DApi * \brief Get a 3d view position and size * * Prototype: fun [V3Dview] [I I I I] * * \param V3Dview : the 3d view structure * * \return [I I I I] : the 3d view x, y, width and height **/ fun V3DgetViewPosSize(viewstr)= [viewstr.V3D_iWinX viewstr.V3D_iWinY viewstr.V3D_iWinW viewstr.V3D_iWinH];; /*! @ingroup v3DApi * \brief Get a 3d view position * * Prototype: fun [V3Dview] [I I] * * \param V3Dview : the 3d view structure * * \return [I I] : the 3d view x, y **/ fun V3DgetViewPos(viewstr)= [viewstr.V3D_iWinX viewstr.V3D_iWinY];; /*! @ingroup v3DApi * \brief Get a 3d view size * * Prototype: fun [V3Dview] [I I] * * \param V3Dview : the 3d view structure * * \return [I I] : the 3d view width and height **/ fun V3DgetViewSize(viewstr)= if ((SO3BufferGetStereoRotateView viewstr.V3D_buffer) && ((SO3BufferGetStereoMode viewstr.V3D_buffer) != SO3_SM_NONE)) then [viewstr.V3D_iWinH viewstr.V3D_iWinW] else [viewstr.V3D_iWinW viewstr.V3D_iWinH];; /*! @ingroup v3DApi * \brief Get a 3d view fullscreen state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return I : 1 if fullscreen, 0 otherwise **/ fun V3DgetFullScreenState(viewstr)= viewstr.V3D_bFullScreen;; /*! @ingroup v3DApi * \brief Center the mouse cursor on a 3d view * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return 0 **/ fun V3DcenterMouseCursor(viewstr)= _SETcursorPos viewstr.V3D_win (viewstr.V3D_iWinW / 2) (viewstr.V3D_iWinH / 2); if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseMove viewstr.V3D_buffer (viewstr.V3D_iWinW / 2) (viewstr.V3D_iWinH / 2) 0; 0;; /*! @ingroup v3DApi * \brief Set the mouse cursor position on a 3d view * * Prototype: fun [V3Dview I I] I * * \param V3Dview : the 3d view structure * \param I : X position * \param I : Y position * * \return 0 **/ fun V3DsetMousePosition(viewstr, x, y)= _SETcursorPos viewstr.V3D_win x y; if (viewstr.V3D_bVRpointer) then nil else SO3BufferInjectMouseMove viewstr.V3D_buffer x y 0; 0;; fun V3DsetVrPointerState(viewstr, state)= set viewstr.V3D_bVRpointer = state;; fun V3DgetVrPointerState(viewstr)= viewstr.V3D_bVRpointer;; fun V3DsetScreenInfos(viewstr, x, y, width, height, fsize, fcolor)= let fcolor & 255 -> r in let (fcolor>>8) & 255 -> g in let (fcolor>>16) & 255 -> b in let make_rgba r g b 127 -> crgba in let V3DgetDefaultSession viewstr -> sessionstr in let V3DgetDefaultViewport viewstr -> viewportstr in SO3DebugDisplayProperties (V3DgetSession sessionstr) viewportstr.V3D_viewport nil crgba [x y] [width height] fsize; 0;; /*! @ingroup v3DApi * \brief Show or Hide the 3d view infos * * Prototype: fun [V3Dview I] I * * \param V3Dview : the 3d view structure * \param I : 1 to show, 0 to hide * * \return 0 **/ fun V3DenableScreenInfos(viewstr, state)= let V3DgetDefaultSession viewstr -> sessionstr in let V3DgetDefaultViewport viewstr -> viewportstr in ( SO3DebugSetEnable viewportstr.V3D_viewport state; SO3WorldShowLines (V3DgetSession sessionstr) state; ); 0;; /*! @ingroup v3DApi * \brief Set a 3D view to window mode * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return 0 **/ fun V3DsetWindowedMode(viewstr)= if !viewstr.V3D_bFullScreen then nil else ( if !(SO3BufferSetProperties viewstr.V3D_buffer 0 viewstr.V3D_iOldWinW viewstr.V3D_iOldWinH) then nil else ( set viewstr.V3D_iWinW = viewstr.V3D_iOldWinW; set viewstr.V3D_iWinH = viewstr.V3D_iOldWinH; //_SHOWwindow viewstr.V3D_win WINDOW_UNHIDDEN; V3DviewSetFocus viewstr; set viewstr.V3D_bFullScreen = 0; ); ); 0;; fun V3DEnableRender(viewstr, state)= set viewstr.V3D_bState = state; 0;; fun V3DenableView(viewstr, mode)= if mode then ( _SHOWwindow viewstr.V3D_win WINDOW_UNHIDDEN; V3DEnableRender viewstr 1; ) else if !mode then ( _SHOWwindow viewstr.V3D_win WINDOW_HIDDEN; V3DEnableRender viewstr 0; ) else nil; 0;; /*! @ingroup v3DApi * \brief Set a 3D view to fullscreen * * Prototype: fun [V3Dview I I] I * * \param V3Dview : the 3d view structure * \param I : width * \param I : height * * \return 0 **/ fun V3DsetFullScreenMode(viewstr, w, h)= if viewstr.V3D_bFullScreen then nil else ( //_SHOWwindow viewstr.V3D_win WINDOW_HIDDEN; if !(SO3BufferSetProperties viewstr.V3D_buffer 1 w h) then nil else ( set viewstr.V3D_iOldWinW = viewstr.V3D_iWinW; set viewstr.V3D_iOldWinH = viewstr.V3D_iWinH; //check for platforms that do not manage fullscreen let _GETwindowPositionSize viewstr.V3D_win -> [_ _ nw nh] in ( set viewstr.V3D_iWinW = nw; set viewstr.V3D_iWinH = nh; ); V3DviewSetFocus viewstr; set viewstr.V3D_bFullScreen = 1; ); ); 0;; /*! @ingroup v3DApi * \brief Switch a 3D view fullscreen state * * Prototype: fun [V3Dview I I] I * * \param V3Dview : the 3d view structure * \param I : width * \param I : height * * \return 0 **/ fun V3DswitchFullScreenMode(viewstr, w, h)= if viewstr.V3D_bFullScreen then V3DsetWindowedMode viewstr else V3DsetFullScreenMode viewstr w h; 0;; fun V3DsetCbVrModeChanged(viewstr, cbfun)= set viewstr.V3D_cbVrModeChanged = cbfun; 0;; /*! @ingroup v3DApi * \brief Switch a 3D view VR mode state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return the Vr mode state **/ fun V3DswitchVrMode(viewstr)= set viewstr.V3D_bVRmode = !viewstr.V3D_bVRmode; exec viewstr.V3D_cbVrModeChanged with [viewstr viewstr.V3D_bVRmode]; viewstr.V3D_bVRmode;; /*! @ingroup v3DApi * \brief Set a 3D view VR mode state * * Prototype: fun [V3Dview I] I * * \param V3Dview : the 3d view structure * \param I : the new state * * \return the Vr mode state **/ fun V3DsetVrMode(viewstr, state)= if (viewstr.V3D_bVRmode == state) then nil else ( set viewstr.V3D_bVRmode = state; exec viewstr.V3D_cbVrModeChanged with [viewstr viewstr.V3D_bVRmode]; ); viewstr.V3D_bVRmode;; /*! @ingroup v3DApi * \brief Get a 3D view VR mode state * * Prototype: fun [V3Dview] I * * \param V3Dview : the 3d view structure * * \return the Vr mode state **/ fun V3DgetVrMode(viewstr)= viewstr.V3D_bVRmode;; fun V3DremoveWidgetControl(viewportstr, widgetctrl)= set viewportstr.V3D_lWidgetControl = remove_from_list viewportstr.V3D_lWidgetControl widgetctrl; 0;; fun V3DaddWidgetControl(viewportstr, widgetctrl)= set viewportstr.V3D_lWidgetControl = widgetctrl::(remove_from_list viewportstr.V3D_lWidgetControl widgetctrl); widgetctrl;; fun V3DcreateDefaultLight(sessionstr)= if sessionstr.V3D_defaultLight == nil then nil else ( SO3ObjectDestroy sessionstr.V3D_defaultLight; ); 0;; fun V3DsetViewDestroyCb(viewstr, cb)= set viewstr.V3D_cbDestroy = cb; 0;; /*! @ingroup v3DApi * \brief Create a 3d view * * Prototype: fun [Chn ObjWin I I I I fun [V3Dview] I fun [V3Dview] I I] V3Dview * * \param Chn : the scol channel * \param ObjWin : the parent scol window * \param I : X position * \param I : Y position * \param I : width * \param I : height * \param fun [V3Dview] I : init callback * \param fun [V3Dview] I : destroy callback * \param I : 1 to create a default scene, 0 otherwise * * \return V3Dview : the new 3d view structure **/ fun V3DcrView(chan, fatherwin, ix, iy, iw, ih, cbinit, cbdestroy, defview)= let mkV3Dview [nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 0 1 1 0 0] -> viewstr in let if (fatherwin == nil) then WN_DRAGDROP|WN_EX_LAYERED else WN_CHILDINSIDE|WN_NOCAPTION|WN_NOBORDER|WN_DRAGDROP|WN_EX_LAYERED -> flags in let _CRwindow chan fatherwin ix iy iw ih flags strcatn (itoa iV3DIndex)::".v3dwin"::nil -> win in ( set viewstr.V3D_channel = chan; if (cHIDECURSOR != nil) then nil else let _LDbitmap chan _checkpack (strcat sV3DDEFAULTRESOURCESPATH sV3DHIDECURSOR) -> bmp in let _GETbitmapSize bmp -> [bw bh] in let _CRcursor chan bmp (bw / 2) (bh / 2) 0x000000 0xffffff -> cursor in set cHIDECURSOR = cursor; // set the buffer window set viewstr.V3D_buffer = SO3BufferCreate chan win 0 0 iw ih; SO3CbBufferPreRender viewstr.V3D_buffer @cbV3DbufferPreRender viewstr; SO3CbBufferPostRender viewstr.V3D_buffer @cbV3DbufferPostRender viewstr; _SHOWwindow win WINDOW_HIDDEN; _CBwinFocus win @cbV3DbufferFocus viewstr; _CBwinKillFocus win @cbV3DkillFocus viewstr; _CBwinSize win @cbV3Dsize viewstr; _CBwinDestroy win @cbV3DwinDestroy viewstr; _CBwinTouchPointAdd win @cbV3DwinAddTouchPoint viewstr; _CBwinTouchPointRemove win @cbV3DwinRemoveTouchPoint viewstr; _CBwinTouchPointUpdate win @cbV3DwinUpdateTouchPoint viewstr; set viewstr.V3D_win = win; set viewstr.V3D_iWinW = iw; set viewstr.V3D_iWinH = ih; set viewstr.V3D_iWinX = ix; set viewstr.V3D_iWinY = iy; set viewstr.V3D_iMoveClickStatus = V3DCLICK_NO; set viewstr.V3D_iClickStatus = V3DCLICK_NO; set viewstr.V3D_bMouseEnabled = 0; set viewstr.V3D_bKeyboardEnabled = 0; set viewstr.V3D_bPaused = 0; set viewstr.V3D_iRenderTick = _tickcount; set viewstr.V3D_cbDestroy = cbdestroy; set viewstr.V3D_cbInit = cbinit; // default session if !defview then nil else V3DcrSession viewstr "main"; set iV3DIndex = iV3DIndex + 1; exec viewstr.V3D_cbInit with [viewstr]; set lV3DViews = viewstr::lV3DViews; viewstr; );;