Browse Source

* Timer and mouse wheel

Michaël Van Canneyt 1 year ago
parent
commit
e3ae6e4cd4
2 changed files with 73 additions and 21 deletions
  1. 49 0
      src/wasm/fresnel.wasm.api.pp
  2. 24 21
      src/wasm/fresnel.wasm.shared.pp

+ 49 - 0
src/wasm/fresnel.wasm.api.pp

@@ -16,6 +16,11 @@ function __fresnel_canvas_allocate(
   aID: PCanvasID
   aID: PCanvasID
 ): TCanvasError; external 'fresnel_api' name 'canvas_allocate';
 ): TCanvasError; external 'fresnel_api' name 'canvas_allocate';
 
 
+function __fresnel_canvas_deallocate(
+  aID: TCanvasID
+): TCanvasError; external 'fresnel_api' name 'canvas_deallocate';
+
+
 function __fresnel_canvas_getbyid(
 function __fresnel_canvas_getbyid(
   PElementID : PByte;
   PElementID : PByte;
   Len : Longint;
   Len : Longint;
@@ -163,6 +168,13 @@ function __fresnel_canvas_draw_image(
   aImageData : PByte
   aImageData : PByte
 ):  TCanvasError; external 'fresnel_api' name 'canvas_draw_image';
 ):  TCanvasError; external 'fresnel_api' name 'canvas_draw_image';
 
 
+{ ---------------------------------------------------------------------
+  Timer API
+  ---------------------------------------------------------------------}
+
+function __fresnel_timer_allocate(ainterval : longint; userdata: pointer) : TTimerID; external 'fresnel_api' name 'timer_allocate';
+
+procedure __fresnel_timer_deallocate(timerid: TTimerID); external 'fresnel_api' name 'timer_deallocate';
 
 
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
   Event API
   Event API
@@ -183,13 +195,23 @@ function __fresnel_event_count(
 Type
 Type
   TFresnelTickEvent = Procedure(aCurrent,aPrevious : Double) of Object;
   TFresnelTickEvent = Procedure(aCurrent,aPrevious : Double) of Object;
   TFresnelProcessMessageEvent = TFresnelTickEvent;
   TFresnelProcessMessageEvent = TFresnelTickEvent;
+  TFresnelTimerTickEvent = Procedure (aTimerID : TTimerID; userdata : pointer; var aContinue : Boolean);
+  TFresnelLogHook = procedure (const Msg : string) of object;
 
 
 var
 var
   OnFresnelWasmTick : TFresnelTickEvent;
   OnFresnelWasmTick : TFresnelTickEvent;
   OnFresnelProcessMessage : TFresnelProcessMessageEvent;
   OnFresnelProcessMessage : TFresnelProcessMessageEvent;
+  OnFresnelTimerTick : TFresnelTimerTickEvent;
+  OnFresnelLog : TFresnelLogHook;
+
+{ Exported functions }
 
 
 procedure __fresnel_tick (aCurrent,aPrevious : double);
 procedure __fresnel_tick (aCurrent,aPrevious : double);
 procedure __fresnel_process_message (aCurrent,aPrevious : double);
 procedure __fresnel_process_message (aCurrent,aPrevious : double);
+function __fresnel_timer_tick(timerid: TTimerID; userdata : pointer) : boolean;
+
+procedure __fresnel_log(Const Msg : string);
+procedure __fresnel_log(Const Fmt : string; args : Array of const);
 
 
 implementation
 implementation
 
 
@@ -207,8 +229,35 @@ begin
     OnFresnelProcessMessage(aCurrent,aPrevious);
     OnFresnelProcessMessage(aCurrent,aPrevious);
 end;
 end;
 
 
+procedure __fresnel_log(Const Msg : string);
+
+begin
+  {$IFDEF FASMXLOG}
+  Writeln(Msg);
+  if Assigned(OnFresnelLog) then
+    OnFresnelLog(Msg);
+  {$ENDIF}
+end;
+
+procedure __fresnel_log(Const Fmt : string; args : Array of const);
+begin
+  {$IFDEF FASMXLOG}
+  Writeln(SafeFormat(Fmt,Args));
+  {$ENDIF}
+end;
+
+function __fresnel_timer_tick(timerid: TTimerID; userdata : pointer) : boolean;
+
+begin
+  if assigned(OnFresnelTimerTick) then
+    OnFresnelTimerTick(timerid,userdata,Result)
+  else
+    Result:=False;
+end;
+
 exports
 exports
   __fresnel_process_message,
   __fresnel_process_message,
+  __fresnel_timer_tick,
   __fresnel_tick;
   __fresnel_tick;
 
 
 end.
 end.

+ 24 - 21
src/wasm/fresnel.wasm.shared.pp

@@ -31,6 +31,8 @@ Type
   UTF8String = String;
   UTF8String = String;
   {$ENDIF}
   {$ENDIF}
 
 
+  TTimerID = longint;
+
   { TCanvasMessageDataHelper }
   { TCanvasMessageDataHelper }
 
 
   TCanvasMessageDataHelper = type helper for TCanvasMessageData
   TCanvasMessageDataHelper = type helper for TCanvasMessageData
@@ -58,26 +60,26 @@ Const
   CANVAS_LINEJOIN_MITER = 2;
   CANVAS_LINEJOIN_MITER = 2;
 
 
   EWASMEVENT_SUCCESS  = 0;
   EWASMEVENT_SUCCESS  = 0;
-  EWASMEVENT_NOEEVENT = 1;
+  EWASMEVENT_NOEVENT = 1;
   EWASMEVENT_NOCANVAS = 2;
   EWASMEVENT_NOCANVAS = 2;
   EWASMEVENT_ERROR    = 3;
   EWASMEVENT_ERROR    = 3;
 
 
   // Key state, Based on TShiftStateEnum
   // Key state, Based on TShiftStateEnum
-   WASM_KEYSTATE_SHIFT   = 1 shl Ord(ssShift);
-   WASM_KEYSTATE_CTRL    = 1 shl Ord(ssAlt);
-   WASM_KEYSTATE_ALT     = 1 shl Ord(ssCtrl);
-   WASM_KEYSTATE_LEFT    = 1 shl Ord(ssLeft);
-   WASM_KEYSTATE_RIGHT   = 1 shl Ord(ssRight);
-   WASM_KEYSTATE_MIDDLE  = 1 shl Ord(ssMiddle);
-   WASM_KEYSTATE_META    = 1 shl Ord(ssMeta);
-   WASM_KEYSTATE_SUPER   = 1 shl Ord(ssSuper);
-   WASM_KEYSTATE_HYPER   = 1 shl Ord(ssHyper);
-   WASM_KEYSTATE_ALTGR   = 1 shl Ord(ssAltGr);
-
-   WASMSG_MOUSESTATE_X      = 0;
-   WASMSG_MOUSESTATE_Y      = 1;
-   WASMSG_MOUSESTATE_STATE  = 2;
-   WASMSG_MOUSESTATE_BUTTON = 3;
+  WASM_KEYSTATE_SHIFT   = 1 shl Ord(ssShift);
+  WASM_KEYSTATE_CTRL    = 1 shl Ord(ssAlt);
+  WASM_KEYSTATE_ALT     = 1 shl Ord(ssCtrl);
+  WASM_KEYSTATE_LEFT    = 1 shl Ord(ssLeft);
+  WASM_KEYSTATE_RIGHT   = 1 shl Ord(ssRight);
+  WASM_KEYSTATE_MIDDLE  = 1 shl Ord(ssMiddle);
+  WASM_KEYSTATE_META    = 1 shl Ord(ssMeta);
+  WASM_KEYSTATE_SUPER   = 1 shl Ord(ssSuper);
+  WASM_KEYSTATE_HYPER   = 1 shl Ord(ssHyper);
+  WASM_KEYSTATE_ALTGR   = 1 shl Ord(ssAltGr);
+
+  WASMSG_MOUSESTATE_X      = 0;
+  WASMSG_MOUSESTATE_Y      = 1;
+  WASMSG_MOUSESTATE_STATE  = 2;
+  WASMSG_MOUSESTATE_BUTTON = 3;
 
 
  Const
  Const
    WASMSG_NONE        = 0;
    WASMSG_NONE        = 0;
@@ -85,11 +87,12 @@ Const
    WASMSG_MOUSEDOWN   = 2; // Params[0]= X, [1]=Y, [2]=State
    WASMSG_MOUSEDOWN   = 2; // Params[0]= X, [1]=Y, [2]=State
    WASMSG_MOUSEUP     = 3; // Params[0]= X, [1]=Y, [2]=State
    WASMSG_MOUSEUP     = 3; // Params[0]= X, [1]=Y, [2]=State
    WASMSG_MOUSESCROLL = 4; // Params[0]= X, [1]=Y, [2]=State
    WASMSG_MOUSESCROLL = 4; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_CLICK       = 5;
-   WASMSG_DBLCLICK = 6;
-   WASMSG_ENTER    = 7;
-   WASMSG_LEAVE    = 8;
-   WASMSG_KEY      = 9;
+   WASMSG_CLICK       = 5; // Params[0]= X, [1]=Y, [2]=State
+   WASMSG_WHEELY      = 6; // Params[0]= X, [1]=Y, [2]=State [3]=Distance
+   WASMSG_DBLCLICK    = 7;
+   WASMSG_ENTER       = 8;
+   WASMSG_LEAVE       = 9;
+   WASMSG_KEY      = 10;
 
 
 implementation
 implementation