Code Monkey home page Code Monkey logo

aardvark's Introduction

What is Aardvark?

Aardvark is a framework for building augmented reality "gadgets" that run on top of virtual reality experiences. Gadgets are constructed using a bunch of custom React components (from the @aardvarkxr/aardvark-react package) and run in the Aardvark application. Gadgets use these components to show interactive models, 2D UI, or other stuff that will draw on top of any VR applications you run. You can attach these gadgets to your hands and bring them with you in your favorite VR apps.

A short introduction to Aardvark

Getting Started

Installing Aardvark

If you just want to make gadgets, your best bet is to use a released build. Just download and run the latest released installer, then run aardvarkxr.exe from the install directory. Once you've installed you can also enable Aardvark to start automatically in the Startup/Shutdown settings in SteamVR.

You can find more documentation on how to build gadgets here.

If you need to do any development work from the source, you can also build from the source.

How to use Aardvark

Aardvark is made up of "gadgets". These are 3D objects that do something useful, something fun, or maybe they just look cool. You can favorite any number of gadgets in the Aardvark browser and then use them in any SteamVR application.

To spawn your first gadget, you first need to open the gadget menu. That's the gear icon attached to your left hand. Just move your right hand close enough to the gear for it to get a little bigger, and then pull the trigger.

The menu that appears has four tabs, but we'll start with the second one. These are the built-in gadgets. Pick up the whiteboard icon and drag it somewhere in the world to spawn the whiteboard gadget.

Grabbing the gadget controls

The left-most icon is the list of recommended gadgets. Right now this just contains a couple of the built-in gadgets again, but it will expand once more gadgets have been created. (If you have a gadget you would like to see in this list, see the gadget registry repository.)

The third tab is your favorites. This list appears empty, but when you find a gadget you like, you can mark it as a favorite to have it show up here.

The fourth tab is a list of your desktop windows. This feature is somewhat limited at the moment, and doesn't allow you to resize or interact with the windows, but you can look at any window on your desktop.

Using Gadgets

Every gadget is different, but most of them provide stuff to grab and interact with. For example, the white board lets you grab the markers, dip them in the colored cylinders, and then draw on the board itself.

Interacting with Gadgets

There are some things you can do with anything you can grab from any gadget. The first is simply to pick it up with the trigger and move it around.

Simple Grabbing

Aardvark also supports grabbing and moving gadgets and their bits at a distance. Pull lightly on the trigger and a ray will shoot out of your hand. Point that at anything to pick it up and move it around.

Distance Grabbing

Once you have grabbed anything, you can move it further away from you or close to use by pushing forward or pulling backward on the thumbstick on your controller. This is moving the entire whiteboard, but the same interaction would work with the markers, or anything else you can grab in a gadget.

Pushing/Pulling Grabbed Objects

Multiuser gadgets

Aardvark provides mechanisms that let a user share their local gadgets with other people they are interacting with in VR. PlutoVR has provided the first example of this with their Aardvark gadget. Open this gadget in your desktop browser, then mark it as a favorite. Now you can spawn the Pluto gadget from the menu, and whenever you enter a Pluto call with another user that's also running Aardvark you can see each other's gadgets.

If you have a multiuser VR application in which you would like users to share gadgets, ask around in the slack for help getting that up and running. It's straightforward to do, but there isn't any documentation on the topic yet.

Project Status and Road Map

Current Status

Aardvark entered alpha testing in September of 2020. In its current alpha state it is still very much a work in progress. If you have any feedback about the UI, the way gadgets are built, or anything else, we'd love to hear it! Join the slack and tell us what you think. Or file an issue or pull request if you find something that could be better. We want to hear from you.

Upcoming Features

Here's a short list of things that we'd like to add or work on in no particular order:

  • Multiple panels in each gadget, probably through popups
  • Panels for desktop applications #38
  • Animation to smooth out transitions and just generally make things nicer
  • Switch to using a more capable rendering engine #11
  • Figure out better ways of not conflicting with the input of the host games
  • Knowledge of where the user is in the VR experiences themselves so gadgets can be responsive to that

If you want to help out with any of these, please reach out.

Who is building this thing?

There are a few of us working on it. Look at the commits to see a list of active participants.

Most of us work at companies that are involved in the VR space. Aardvark is not associated with any of those companies.

How can you help?

There are a bunch of ways you can pitch in and help with Aardvark:

  • You can build gadgets and post them for other people to use. If you're looking for ideas, there is an entire channel on the Slack that's full of them.
  • You can use Aardvark and tell us what you think, and how it could do more for you. Bug reports are a great way to do that. So is jumping on Slack and just talking to people.
  • You can write a tutorial for how to use Aardvark or how to build gadgets. You're welcome to post these on your own site or submit them as pull requests so we can include them in the core Aardvark docs.
  • You can create art assets (models, icons, and the like) for folks who are building gadgets or writing tutorials. The Slack would be a great place to find people to collaborate with.
  • You can submit pull requests to Aardvark itself. Pick an issue from the existing list of open issues, or suggest something new.
  • You can tell your friends!

Building the Aardvark Browser

All of this has been tested on Windows 10 with VS2019. Other platforms (including other versions of Windows) and other compilers are left as an exercise to the reader.)

Follow these steps:

  1. Open a command prompt to your cloned repro directory. I'll call that d:\aardvark below, but it can be wherever you like.
  2. Build web code
    1. cd d:\aardvark\websrc
    2. npm install
    3. npm run build
  3. Unzip the following CEF libs into the same directories the gz files are located in (These are over the 100MB Github file size limit when unzipped)
    1. unzip d:\aardvark\src\thirdparty\cef_binary_78\Debug\libcef.dll.gz
    2. unzip d:\aardvark\src\thirdparty\cef_binary_78\Debug\cef_sandbox.dll.gz
    3. unzip d:\aardvark\src\thirdparty\cef_binary_78\Release\libcef.dll.gz
  4. Build aardvark C++ code
    1. cd d:\aardvark\src
    2. mkdir build
    3. cd build
    4. cmake -G "Visual Studio 16 2019" -A x64 ..
      • VS 2017 will probably still work too: cmake -G "Visual Studio 15 2017 Win64" ..
    5. Open Aardvark.sln
    6. Build in debug
  5. Run it!
    1. Open a command prompt in d:\aardvark\data and run "node server\server_bundle.js"
    2. Right-click on "aardvarkxr" in the Solution Explorer and select "Set as StartUp Project" in Visual Studio
    3. Start Debugging from the Debug menu

aardvark's People

Contributors

cementhead avatar danwillm avatar dependabot[bot] avatar fuag15 avatar jaredmonkey avatar jlesamiz avatar joeludwig avatar lionleaf avatar michaelybecker avatar zite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aardvark's Issues

Gadgets need to support reloading

Their scene graphs should be discarded when they disconnect. They should come back with the same persistent ID, default hook, etc.

It's ok if the state isn't exactly the same, and that will vary from gadget to gadget. They should appear as though they were just created from a fresh load.

Aardvark server needs to start and stop automatically

Right now the user needs to run "node server/server_bundle.js", and then the server keeps running forever (or until it crashes).

Before announcement, that needs to change to include:

  1. Run the server automatically
  2. Stop the server when "the app" exits. That probably means avrenderer.exe.
  3. Restart the server when it crashes.

Master should support reloading

Probably everything should close when master disconnects to make room for whatever master is going to bring back up. Right now we end up with two renderers, which isn't so good.

Server needs to reload the state.json file

avcmd install/uninstall/reset modify this file, but the server never reloads it. When that happens everything should restart, but especially the server should restart. And doubly-especially it should restart when you're running it in nodemon to allow easy debugging.

Version numbers

The NPM packages all have version numbers, but I've been hand-numbering the release builds. Maybe the build script should set up the appropriate resource files to stamp the version number on those builds, zip them up, etc. automatically?

Axios is missing when installing the CLI

Error: Cannot find module 'axios' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15) at Function.Module._load (internal/modules/cjs/loader.js:507:25) at Module.require (internal/modules/cjs/loader.js:637:17) at require (internal/modules/cjs/helpers.js:22:18) at Object.<anonymous> (C:\Users\Jared\AppData\Roaming\npm\node_modules\@aardvarkxr\aardvark-cli\lib\avcmd.js:6:41) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3)

Gadget toolbox UI is terrible

  • Gadgets collide with each other
  • The "I'm in range" indicator of increasing the scale is hard to see on many gadgets
  • Gadget "icons" are all different sizes
  • Gadget names don't appear anywhere
  • There's no way to remove a gadget from the list once it appears there
  • The scroll thumb (if that's even the right metaphor) is too small

Support reloading the server

The gadgets, monitor, master, and renderer are going to lose their connection to the server when this happens.

  • Monitor needs to reconnect and refresh when that happens. (Pretty sure this already works.)
  • Master needs to reconnect, and go through the normal startup sequence.
  • Renderer should probably close itself. Master should restart it. (Or maybe that should actually be the server's job?)
  • Gadgets should probably close themselves. Master or persistence should restart them when the server comes back up.

Turn on the Chromium sandbox

This will be important once gadgets are more widely developed. Right now we're depending on there not being bugs in the version of CEF/Chromium without the second layer of OS-enforced reduced privileges.

Make the debug window optional

The desktop window in avrenderer is useful for debugging, but useless for users. And annoying if the app is set to auto-launch in SteamVR. Make it optional?

Rendering is too dark for most materials

Most PBR materials look pretty great, but ones that absorb a lot of light don't show up well because the IBL and environment map isn't very bright. Here is a video for reference:
https://youtu.be/b48Acc_0R2Q

Having a brighter environment map would be nice.

It could also be nice to have a dynamic environment map or light intensity based on scene app or headset mirror.

Descriptors are leaking

To repro: press and release the B button a bunch of times. The renderer will hit an assert and then stop working.

Each scene graph change seems to be using a descriptor and not returning them to the pool.

unmodified gadget does not load

Downloaded a fresh aardvark repo, installed everything per README, built new gadget via README instructions, installed gadget with "avcmd install ", ran avrenderer, I can see the gadget listed (sphere shows up), click on sphere, a panel blinks on then off. Default gadgets work; freshly built gadgets do not

Binary signing?

The binaries are from "unknown publisher" at the moment. It would be good to have them registered to Aardvark Team or something.

Renderer needs to support reloading

It should come back up and get its state back from the server. Any rendering resources on the C++ side need to be freed up so they're available for the new renderer.

Probably grabs in progress will be lost, but that's ok. The main thing is that reloading the render not require restarting the whole system.

Need a mechanism for adding gadgets

There's a gadget picking UI on the gear icon on each hand, but it uses a fixed list of gadgets, all of which are included in the main repo.

There needs to be some way to configure additional gadgets to add to that list. Maybe a list of URLs in the persistence file that contain one of:

  1. The gadget URL (i.e. everything up to, but not including gadget_manifest.json
  2. A JSON file full of gadget URLs (so the main list can be more stable? And so somebody can maintain an online list of interesting gadgets if they want to.)

Getting odd transform values out of the AvGrabbable "onTransformUpdated" callback

when a sphere is placed at something like 1/1/1 and you move the ball slightly, onTransformUpdated gives out a position like x:-1.7472448348999023,"y":1.4837164878845215,"z":1.706096529960632 -- where is it getting these numbers?

<AvGrabbable
    preserveDropTransform={true}
    onTransformUpdated={this.onTransformUpdated}
>
    <AvTransform
        translateX={this.state.transformValue.position!.x ? this.state.transformValue.position!.x : 2.1}
        translateY={this.state.transformValue.position!.y ? this.state.transformValue.position!.y : 2.1}
        translateZ={this.state.transformValue.position!.z ? this.state.transformValue.position!.z : 2.1}
        uniformScale={.1}
    >
        <AvModel color={this.state.color} uri="https://aardvark.install/models/sphere/sphere.glb"/>
        <AvSphereHandle radius={0.1} />
    </AvTransform>
</AvGrabbable>

Need a repo with a sample gadget

This could start as a private repo with a copy of aardvark-react in it. It should get that package from NPM before it's published.

Need a build script that makes... builds

There are many steps to getting things working in a dev environment. They should all be automated so a script can turn a fresh clone of the repo into a standalone build that would work on a user's machine.

And maybe CI should be set up to run that script on each commit.

Aardvark needs to be able to autorun when SteamVR starts

That means it needs:

  1. A .vrmanifest file that identifies it as an overlay app, and points at the action manifest
  2. A way to register that manifest file. Maybe just do this on first run if it's not already registered?
  3. Do we want to point users at the "autorun" setting in SteamVR or provide a way to set that automatically?
  4. Should Aardvark register a dashboard overlay so it can have a few settings of its own? Seems like it could do that in its own UI, and that could include setting the autorun setting.

Crash handling?

Is there some service that can manage collecting crashdumps for projects like this? Is Microsoft's crash upload thing reasonably easy to use these days?

As normal users show up we'll need a way to collect crash dumps (and log files?) from them.

initial setup of websrc fails

given a fresh clone and removing package.lock in websrc this is the debug output of the install comand

14833 warn [email protected] requires a peer of jss@^9.7.0 but none is installed. You must install peer dependencies yourself.
14834 warn [email protected] requires a peer of jss@^9.0.0 but none is installed. You must install peer dependencies yourself.
14835 warn [email protected] requires a peer of jss@^9.4.0 but none is installed. You must install peer dependencies yourself.
14836 warn [email protected] requires a peer of jss@^9.0.0 but none is installed. You must install peer dependencies yourself.
14837 warn [email protected] requires a peer of jss@^9.0.0 but none is installed. You must install peer dependencies yourself.
14838 warn [email protected] requires a peer of jss@^9.0.0 but none is installed. You must install peer dependencies yourself.
14839 verbose stack Error: ENOENT: no such file or directory, rename 'C:\Users\moose\src\aardvark-master\websrc\node_modules\.staging\node-bin-setup-da3abe88' -> 'C:\Users\moose\src\aardvark-master\packages\aardvark-shared\node_modules\node-bin-setup'
14840 verbose cwd C:\Users\moose\src\aardvark-master\websrc
14841 verbose Windows_NT 10.0.18362
14842 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "i"
14843 verbose node v12.13.0
14844 verbose npm  v6.12.0
14845 error code ENOENT
14846 error syscall rename
14847 error path C:\Users\moose\src\aardvark-master\websrc\node_modules\.staging\node-bin-setup-da3abe88
14848 error dest C:\Users\moose\src\aardvark-master\packages\aardvark-shared\node_modules\node-bin-setup
14849 error errno -4058
14850 error enoent ENOENT: no such file or directory, rename 'C:\Users\moose\src\aardvark-master\websrc\node_modules\.staging\node-bin-setup-da3abe88' -> 'C:\Users\moose\src\aardvark-master\packages\aardvark-shared\node_modules\node-bin-setup'
14851 error enoent This is related to npm not being able to find a file.
14852 verbose exit [ -4058, true ]

avrenderer crashing when tab closes

This went away for a while, but apparently it's back. To repro, run avrenderer and then close the window to exit it. Seems to be a browser instance teardown ordering issue with Aardvark's interaction with CEF.

Need to be able to manage installed gadgets

We have some level of UI to instantiate them (which needs work #24 ) but there are other operations to perform:

  • Uninstall
  • Toggle autorun

Others? That UI needs to live somewhere. Maybe a tab in the gadget toolbox itself?

Spawning a grabbable-less gadget causes master to exit

  1. put a gadget in the toolbox that doesn't have a root grabbable
  2. drag that gadget out of the toolbox to spawn it
  3. master gadget exits

3 shouldn't happen. I think what's going on is that the grabbable on the gadget seed is retained as the grabbable, and then when that's dropped in the world its parent gadget is destroyed.

Need a way to install a gadget from a desktop web browser

aardvark://install URL handler? Websocket request from the browser to the server while Aardvark is running? little file you download and run with a known extension?

Whatever the solution is, users shouldn't be forced to run "avcmd install " to install a gadget.

fresh install had problems building aardvark

Moving forward with troubleshooting, but this was the output

Severity	Code	Description	Project	File	Line	Suppression State
Error	MSB3073	The command "setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/openvr/bin/win64/openvr_api.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug/
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
mt.exe -nologo -manifest "C:/Users/Staff01/Desktop/aardvark/src/avrenderer/avrenderer.exe.manifest" "C:/Users/Staff01/Desktop/aardvark/src/avrenderer/compatibility.manifest" -outputresource:"C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//avrenderer.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/chrome_elf.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//chrome_elf.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/d3dcompiler_47.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//d3dcompiler_47.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/libcef.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//libcef.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/libEGL.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//libEGL.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/libGLESv2.dll C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//libGLESv2.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/natives_blob.bin C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//natives_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/snapshot_blob.bin C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//snapshot_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/v8_context_snapshot.bin C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//v8_context_snapshot.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_directory C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Debug/swiftshader C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//swiftshader
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/cef.pak C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//cef.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/cef_100_percent.pak C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//cef_100_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/cef_200_percent.pak C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//cef_200_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/cef_extensions.pak C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//cef_extensions.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/devtools_resources.pak C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//devtools_resources.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/icudtl.dat C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//icudtl.dat
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"C:\Program Files\CMake\bin\cmake.exe" -E copy_directory C:/Users/Staff01/Desktop/aardvark/src/thirdparty/cefbinary_72/Resources/locales C:/Users/Staff01/Desktop/aardvark/src/build/avrenderer/Debug//locales
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
:VCEnd" exited with code 1.	avrenderer	C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets	138	

Need a way to throw away gadgets

Dropping them somewhere other than a hook currently just sends them to the origin. They need to be removed from persistence, have their browser tab closed, and be removed from the renderer.

For gadgets that are only meant to be held on hooks, dropping them into empty space should probably be a "throw away" gesture. If gadgets that aren't on any hook is a thing, they'll need to have a specific gesture. Or maybe they're responsible for having a "close" button of some kind?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.