*This repository is part of the outcomes of the Specialist Task Force 620 focusing on the authoring of a World Representation as part of the ETSI ISG Augmented Reality Framework architecture (https://www.etsi.org/deliver/etsi_gs/ARF/001_099/003/01.01.01_60/gs_ARF003v010101p.pdf).*
*The set of the World Representation authoring components includes:*

*•	The C++ and C# source code for servers and clients  generated from OpenAPI available here (https://forge.etsi.org/rep/arf/arf005)*

*•	A Unity plugin and a Unity editor for authoring and accessing a World Representation hosted on a World Storage server.*

*All these components are available under the ETSI Labs group “World Storage API Helpers”: https://labs.etsi.org/rep/arf/world-storage-api-helpers*

*If you wish to contribute to this project or any other projects in the context of the [ETSI ISG Augmented Reality Framework architecture](https://www.etsi.org/committee/1420-arf), please refer to the ["How to get involved in an ISG" section on the ETSI website](https://www.etsi.org/how-to-get-involved-in-an-isg)*

---

# Setting RESTful package

Please set up first the path in the Unity manifest.json for the 'Unity World Storage Package' correctly!

This repo contains submodules corresponding to REST libraries used in the Unity project.

Once the git repo is cloned, you need to init and update the submodules through git commands:

    git submodule init
    git submodule update

or clone the repo updating the submodules directly:

    git clone --recurse-submodules https://labs.etsi.org/rep/arf/world-storage-api-helpers/unity-world-storage-editor.git

Once it's done, you can open your project from the Unity Hub, the project was coded in Unity 2021.3.0 and 

# Test Scenario (Unity Scene)
This repo is used to demonstrate and to show the usage of the World Storage API in relation to GUI functionalities given by the Unity editor. The project uses for this the inspector and graph window techniques.

The Unity project can be found here:

   .\Assets\ETSI.ARF\ARF World Storage API\Scenes\WorldStorageSample.unity

The project uses the 'Museum' scenario wit a statue as described in the GS 005 documentation. In the figure below, a statue would be augmented with some AR contents (e.g. a nose label). For this, some World Trackables, Anchors and Links are created (left picture in the figure) and are placed in the Unity scene onto the correct position (right picture). The statue serves as a digital twin and won't be visible in a final application. 

<img src="Images/ValidationScene.png"  width=80% height=80%>

# Description of UI / editor functions
This Unity Editor module allows the user to author the World Storage through various ways. To interact with a server hosting an implementation of the World Storage, the user first must create an Unity object "World Storage Server" via the contextual menu (Create -> ARF World Storage -> Create Server) and then fill the corresponding informations (name, URL, port...).

<img src="Images/WorldStorageObject.png"  width=30% height=30%>

## World Storage Window

Through the Unity inspector of the World Storage Server, the user can click on the `Open World Storage Window...` button. This opens the authoring tool for the corresponding World Storage. 

<img src="Images/UnityEditor.png"  width=80% height=80%>

The main window (left picture in the figure) manage the server's data and list of World Elements. From this window, the user can access to specific windows to edit the parameters of elements (right picture, e.g. parameters of a trackable).

## World Graph Window
<img src="Images/GraphEditor.png"  width=60% height=60%>

The second tool of this repo is the World Graph Window. From the top toolbar the user has access to the `ARFWolrdStorage` option, from which he can click on the `Edit Graph...` option. This will open the Graph Editor Window. The user can then select the desired World Storage server to interact with. 

After fetching all elements, The user can move them around in the graph, create new ones, modify or delete them. 

All changes are done locally, in order to push the modifications to the server, the user has the option to save all elements in the contextual menu or save specific elements in their custom inspectors. Each element type has its custom inspector from which you can modify their attributes and discard or save local changes.
