From 2e32e892540d1afbb59ea056cfe80226174a8f6f Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 11 Aug 2015 21:39:36 +0000
Subject: [PATCH] base implementation of player fullscreen and volume callbacks into the game

---
 client/library/library_humble.js |   56 +++++++++++++++++++++++++++
 client/library/humble_api.h      |   24 ++++++++++++
 client/test/main.cpp             |   12 ++++++
 3 files changed, 91 insertions(+), 1 deletions(-)

diff --git a/client/library/humble_api.h b/client/library/humble_api.h
index cfd611b..a6b3e78 100644
--- a/client/library/humble_api.h
+++ b/client/library/humble_api.h
@@ -22,6 +22,30 @@
      */
     void humble_fetch_asset_data(const char* url, void *arg, em_async_wget_onload_func onload, em_arg_callback_func onerror);
 
+    typedef enum {
+        /**
+         * This callback is passed a float volume (between 0.0 and 1.0) as well as the data parameter when registered.
+         *
+         * callback prototype: void (*)(float volume, void* data);
+         */
+        HUMBLE_API_CALLBACK_SET_PLAYER_VOLUME = 1,
+        /**
+         * This callback is passed an int value which is either 1 for fullscreen or 0 for windowed as well as the data parameter when registered.
+         * when going windowed, the application should use and respect the humble_get_player_size values
+         *
+         * callback prototype: void (*)(int fullscreen, void* data);
+         */
+        HUMBLE_API_CALLBACK_SET_PLAYER_FULLSCREEN      = 2,
+    } HUMBLE_API_CALLBACK;
+
+    /**
+     * Register a callback for the specified callback type
+     * If a callback is already registered, it will be replaced with the new callback
+     * passing a NUL for callback will unregister the callback for that type
+     * data will be passed along to the callback function as the last parameter
+     */
+    int humble_set_callback(HUMBLE_API_CALLBACK type, void *callback, void* data);
+
     /**
      * Gets the allowable player size of the humble player.  Use this to restrict the size of the game in windowed mode.
      * returns 1 if the restriction should be enforced.. 0 otherwise
diff --git a/client/library/library_humble.js b/client/library/library_humble.js
index b2e7676..022f3fc 100644
--- a/client/library/library_humble.js
+++ b/client/library/library_humble.js
@@ -24,6 +24,43 @@
              */
             demoEndedCallback: null
         },
+        callbacks: {
+            /**
+             * a callback in the game code to set the expected player volume.
+             * The callback takes a float parameter with a value between 0.0 and 1.0
+             */
+            setPlayerVolume: null,
+            /**
+             * a callback to set the fullscreen
+             */
+            setPlayerFullscreen: null
+        },
+        /**
+         * Attempts to call into the app to inform it that the volume should be adjusted
+         * @param volume  the float volume (between 0.0 and 1.0)
+         * @return bool.. true if the callback was successful.. false if no callback registered
+         */
+        setPlayerVolume: function(volume) {
+            if (HUMBLE_API.callbacks.setPlayerVolume == null) return false;
+            var cb = HUMBLE_API.callbacks.setPlayerVolume[0],
+                data = HUMBLE_API.callbacks.setPlayerVolume[1];
+            if (volume > 1.0) volume = 1.0;
+            if (volume < 0.0) volume = 0.0;
+            Runtime.dynCall('vdi', cb, [volume, data]);
+            return true;
+        },
+        /**
+         * Attempts to call into the app to inform it that it should change to or from fullscreen mode
+         * @param fullscreen  A bool of either true or false
+         * @return bool.. true if the callback was successful.. false if no callback registered
+         */
+        setPlayerFullscreen: function(fullscreen) {
+            if (HUMBLE_API.callbacks.setPlayerFullscreen == null) return false;
+            var cb = HUMBLE_API.callbacks.setPlayerFullscreen[0],
+                data = HUMBLE_API.callbacks.setPlayerFullscreen[1];
+            Runtime.dynCall('vii', cb, [fullscreen ? 1 : 0, data]);
+            return true;
+        },
         /**
          * allows configuring the HUMBLE_API  simply call this method in a preRun to initialize..
          * any option is accepted and will be added to the configuration hash.
@@ -231,7 +268,24 @@
         if (HUMBLE_API.options.demoEndedCallback) {
             return HUMBLE_API.options.demoEndedCallback.call(HUMBLE_API);
         }
-    }
+    },
+    humble_set_callback__deps: ['$HUMBLE_API'],
+    humble_set_callback: function(type, cb, data) {
+        var key = null;
+        switch(type) {
+            case 1: key = 'setPlayerVolume'; break;
+            case 2: key = 'setPlayerFullscreen'; break;
+        }
+        if (key == null) {
+            return 0;
+        }
+        if (cb == 0) {
+            HUMBLE_API.callbacks[key] = null;
+        } else {
+            HUMBLE_API.callbacks[key] = [cb, data];
+        }
+        return 1;
+    },
 };
 
 mergeInto(LibraryManager.library, LibraryHUMBLE);
diff --git a/client/test/main.cpp b/client/test/main.cpp
index 766b569..8810383 100644
--- a/client/test/main.cpp
+++ b/client/test/main.cpp
@@ -74,11 +74,23 @@
     humble_demo_ended();
 }
 
+void setPlayerVolume(float volume, void* data)
+{
+    std::cout << "Adjusting volume to " << volume << "\n";
+}
+
+void setPlayerFullscreen(int fullscreen, void* data)
+{
+    std::cout << "Adjusting display to " << (fullscreen ? "fullscreen" : "windowed") << "\n";
+}
+
 int main(int argc, char * argv[])
 {
     std::cout << "Welcome Main\n";
     // call dummy function to init cloud
     humble_init();
+    humble_set_callback(HUMBLE_API_CALLBACK_SET_PLAYER_VOLUME, (void*)&setPlayerVolume, NULL);
+    humble_set_callback(HUMBLE_API_CALLBACK_SET_PLAYER_FULLSCREEN, (void*)&setPlayerFullscreen, NULL);
 
     int w, h;
     int ret = humble_get_player_size(&w, &h);

--
Gitblit v1.9.3