Asset - Extension Virtual Visit Maker (for Windows, macOS, and Ubuntu)

Samuel Venable

Time Killer


Required Ubuntu Dependencies:

sudo apt-get install libsdl2-dev libglu1-mesa-dev libgl1-mesa-glx freeglut3-dev mesa-common-dev libpthread-stubs0-dev libx11-dev libprocps-dev

Optional Ubuntu Dependecies:

sudo apt-get install zenity kdialog

Add me on Discord to get faster support than email: Samuel Venable#5465

The macOS dylib file is not code signed; please code sign it before testing and distributing for macOS.

[Made for GameMaker Studio 2.3.1+]

This extension is for Windows, macOS, and Ubuntu.

Create 360 degree interactive (cylindrical) panoramas and virtual visits!
The bulk of this code is done in C++, not GML, (connected by an extention), however, this can technically also be done in pure GML, this is for educational purposes so looking at the C++ source code in the extension and included file zips is recommended for those who are interested in learning more about this. Source code is also linked on this page below and it is hosted on GitHub, (MIT License). Powered by Inter-Process Communication (IPC) with the command line interface (CLI) panoview: via libprocinfo:

Use the Dermandar Panorama Camera App for your phone to create cylindrical panoramas from your photos for use in this extension:

Or you may create cylindrical panoramas pre-rendered from 3D scenes with easy-to-use 3D rendering software like Bryce for use in this extension:

Save the panoramas in PNG format, then load them with:

vvm_frame_create_panoramic(pngframe, pngcursor, initxangle, inityangle) creates a new (or swaps the existing) 3D cylindrical panoramic projection with the specified panoramic image pngframe while displaying the specified cursor overlay pngcursor with the direction initxangle and the zdirection inityangle.
  • pngframe: png file to be viewed in cylindrical panoramic perspective.
  • pngcursor: 32x32 pixel png file to be used as the cursor (e.g. cross-hair).
  • initxangle: initial direction of 3D camera perspective (from 0 to 360); pass vvm_frame_keep_xangle() to this argument to not change existing direction when changing the current panoramic frame to a different panoramic frame.
  • inityangle: initial zdirection of 3D camera perspective (from -90 to 90); pass vvm_frame_keep_yangle() to this argument to not change existing zdirection when changing the current panoramic frame to a different panoramic frame.
If you want to make your cylindrical panoramic png frames interactive (i.e. create clickable hotspots that execute code when triggered, or swap frames) you can check this function for true in an if statement under the step event, with the desired code to execute when clicked within the squiggly braces { }:

vvm_frame_check_hotspot(ind, pngframe, x, y, width, height) this function returns true for one step only when the hotspot of the given unique index ind on the expected frame image pngframe is clicked within the x/y/width/height coordinates, thus it should be checked in an if statement under the step event.
  • ind: the hotspot index, treat this like a unique resource id to identify a specific hotspot; can be any value from zero on-wards that isn't already used with a specific pngframe argmuent.
  • pngframe: the png frame image that checks for this hotspot. The hotspot of the given hotspot index ind argument will only apply to this frame pngframe.
  • x: the x coordinate of the clickable hotspot, based in texels (texture pixels).
  • y: the y coordinate of the clickable hotspot, based in texels (texture pixels).
  • width: the texel (texture pixel) width of the clickable hotspot.
  • height: the texel (texture pixel) height of the clickable hotspot.

Download Free
Last edited: