typeof debug = I;; struct StrTEST3D = [ t_iState : I, // 0 : no occured error t_o3dview : LIB3D_View, t_o3dsession : LIB3D_Session, t_oWinMother : ObjWin, t_iSize : [I I], t_oLogo : ObjBitmap, t_iErrMask : I, t_oErr : STD_ERROR ] mkStrTEST3D;; // check if debug = 1 fun checkDebug ()= debug;; fun printDbg (p)= let p -> [str3d message] in std_errString str3d.t_oErr message str3d.t_iErrMask; 0;; fun printDebug (p)= std_if @checkDebug @printDbg p;; fun end (str3d)= let b3d_viewDestroy str3d.t_o3dview -> res in _fooS if !res then "3d structures destroyed successfully" else strcat "Error during the 3d destruction : " itoa res; _DSbitmap str3d.t_oLogo; std_errClose str3d.t_oErr; _closemachine; 0;; fun cbResize (win, str3d, neww, newh)= b3d_viewSetViewportSizeFromFullViewSize str3d.t_o3dview b3d_viewGetViewportDefault str3d.t_o3dview; 0;; fun cbEnd (win, str3d)= end str3d;; fun createWin (str3d)= if std_objIsNil str3d then ( printDebug [str3d "ERROR : Application unitialized !"]; 1 ) else let str3d.t_iSize -> [w h] in ( set str3d.t_oWinMother = _CRwindow _channel nil 0 0 w h WN_NORMAL "Test 3D"; _CBwinSize str3d.t_oWinMother @cbResize str3d; _CBwinDestroy str3d.t_oWinMother @cbEnd str3d; 0 );; fun createBgLogo (str3d)= let b3d_viewGetSize str3d.t_o3dview -> [viewW viewH] in let SO3BitmapWidgetCreateBackground b3d_sessionGet str3d.t_o3dsession b3d_viewportGet b3d_viewGetViewportDefault str3d.t_o3dview "bgLogo" 6 viewH-70 64 64 -> widget in if SO3BitmapWidgetBlit widget str3d.t_oLogo then 0 else 1;; fun cbPreRender (strView, p)= if !str3d.t_iState then let p -> [str3d logo] in let b3d_bufferGetObj str3d.t_o3dview -> buffer in let sprintf "Worst FPS %f\nBest FPS %f\nAverage FPS %f" [SO3BufferGetWorstFPS buffer SO3BufferGetBestFPS buffer SO3BufferGetAverageFPS buffer] -> s in ( set str3d.t_iState = if (!std_objIsNil b3d_objSetRotate logo 0.1 [0.0 negf 0.1 0.0] 0) then 0 else 1; SO3DebugSetText b3d_viewportGet b3d_viewGetViewportDefault str3d.t_o3dview s; 0 ) else end str3d;; fun createDebug (str3d)= let 0xff0000 -> fcolor in 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 if SO3DebugDisplayProperties b3d_sessionGet str3d.t_o3dsession b3d_viewportGet b3d_viewGetViewportDefault str3d.t_o3dview nil crgba [6 6] [200 45] 20 then if SO3DebugSetEnable b3d_viewportGet b3d_viewGetViewportDefault str3d.t_o3dview 1 then if SO3WorldShowLines b3d_sessionGet str3d.t_o3dsession 1 then 0 else set str3d.t_iState = 1 else set str3d.t_iState = 1 else set str3d.t_iState = 1;; fun cb3dViewInit (view, result, str3d)= if result!= 0 then ( printDebug [str3d "Unable to initialize 3d view"]; set str3d.t_iState = 1 ) else 0;; fun cb3dSessionInit (strSession, res, str3d)= set str3d.t_o3dsession = strSession; if res != 0 then ( printDebug [str3d "Unable to initialize the 3d session"]; set str3d.t_iState = 1 ) else let b3d_cameraGetFromInit str3d.t_o3dsession -> cam in let b3d_lightAdd str3d.t_o3dsession "light" SO3_DIRECTIONAL_LIGHT nil -> light in let SO3SceneLoadEntity b3d_sessionGet str3d.t_o3dsession b3d_resourcesGetGroupNameDefault str3d.t_o3dsession "voyager_test_logo" _checkpack "locked/voyager/3d/logo.mesh" -> logo in ( set str3d.t_iState = if (std_objIsNil cam) || (std_objIsNil light) then 1 else 0; if (std_objIsNil b3d_viewportNew str3d.t_o3dview cam) || (str3d.t_iState) then let _fooS strcat "B " itoa str3d.t_iState -> _ in 2 else set str3d.t_iState = if (!b3d_lightSetColors light [make_rgba 250 250 250 0 make_rgba 255 255 255 0]) && (!b3d_objSetPosition light [-.30.0 30.0 (-.60.0)]) && (!std_objIsNil SO3ObjectRotateYaw light 2.3 0) && (!b3d_objSetRotatePitch light 0.5 SO3_LOCAL_TS) && (!b3d_objSetPosition cam [0.0 0.0 6.0]) && (!b3d_cameraSetParams cam nil 1.0 0.01 100000.0) && (!b3d_viewEnable str3d.t_o3dview 1) && (!b3d_gridShow str3d.t_o3dsession 1) && (!std_objIsNil SO3SceneLoadResource b3d_sessionGet str3d.t_o3dsession b3d_resourcesGetGroupNameDefault str3d.t_o3dsession _checkpack "locked/voyager/3d/logo.material" SO3_RESOURCE_MATERIAL ) && (!std_objIsNil SO3SceneLoadResource b3d_sessionGet str3d.t_o3dsession b3d_resourcesGetGroupNameDefault str3d.t_o3dsession _checkpack "locked/voyager/3d/logo.mesh" SO3_RESOURCE_MESH ) && (!std_objIsNil SO3ObjectSetScale logo [0.01 0.01 0.01]) && (!b3d_viewSetCbPreRender str3d.t_o3dview mkfun2 @cbPreRender [str3d logo]) && (!b3d_viewportSetBgcolor b3d_viewGetViewportDefault str3d.t_o3dview 0xFFFFFF0) && (!createBgLogo str3d) then 0 else 1 );; fun init3d (str3d)= set str3d.t_o3dview = b3d_initView _channel str3d.t_oWinMother mkfun3 @cb3dViewInit str3d nil; if str3d.t_iState != 0 then ( printDebug [str3d "Initialization aborted"]; 1 ) else if std_objIsNil ( b3d_initSession str3d.t_o3dview nil mkfun3 @cb3dSessionInit str3d; ) then set str3d.t_iState = 1 else ( //b3d_viewSetCbPreRender str3d.t_o3dview @cbPreRender; 0 );; fun init ()= mkStrTEST3D [ 0 nil nil nil [640 480] _LDbitmap _channel _checkpack "logo.bmp" b3d_errGetMaskError nil ];; fun showConsole (state)= if state then ( _showconsole; set debug = 1 ) else set debug = 0;; fun main ()= showConsole 1; let init -> str3d in ( b3d_initError "log/test3d.log" str3d.t_iErrMask iLIB3D_LOGHARDFILE; b3d_errSetMaskOgre3D SO3_LL_LOW; set str3d.t_oErr = b3d_errManager; createWin str3d; init3d str3d; b3d_viewEnable str3d.t_o3dview 1; //end of init, the 3d view can be enabled / shown createDebug str3d; if str3d.t_iState != 0 then _fooS "ERROR !" else _fooS "OK !"; 0 );;