May 30, 2023 - Possible Projects

I’m at a decision point – there are so many possible software projects and I can’t decide which one to choose. Here is a possible list:

  • Basil viewer: this is advancing the features of the viewer. It includes implementing avatars, adding scene rendering features (water, …), and updating the UI to be the WASM modules that run in the client to provide world and UI operation.
    • Avatar movement
    • Avatar implementation
    • Shaders for water, lighting, scene
    • Child/adjacent regions
    • WASM UI implementation
    • Reactor into peoperty updates and optional sync back to server
  • Loden: work on creating the assets for the browser viewer. These things are also useful in other projects (like Convoar and Unity viewer). There are some refactoring (textures) but mostly is creating the 3d tiles version of the region. Also use the real asset database.
    • Integration with grid asset server (solve the access key (capabilities?))
    • Move texture resizing out of the GLTF generator
    • S3 asset storage
    • Create individual GLTF assets on demand
    • Create region 3dTiles down to the individual assets
    • Create avatar to GLTF
      • Close to VRM format and can be used with and Unity
  • OpenSimulator 3d voice service: OpenSimulator needs a spacial voice replacement. On candidate is the voice mixer from HiFi/Overte. The work is figuring out how the scalable service is invoked and then adding a Vivox API to the mixer (that already has a WebRTC-data and Overte interface). Probably should have a plain WebRTC interface also. That could make it generally useful for other VWs.
    • Research the Overte voice service
    • Research the Vivox protocol (viewer to server)
    • Research the avatar position protocol (simuilator to audio server)
    • Understand OS capabilities: how generated and passed around
  • GLTF Avatar for OpenSimulator: Related to the Loden work, making a GLTF version of the OS avatar would be useful in many places. The avatars could be used in other VWs as well as the CrystalFrost viewer (see (UniVRM)[] ).
    • Research VRM format
    • Research OS avatar format
      • Seems to be Bento bones but a lot of work on mesh modes with sliders
      • (Viewer-Character)[]
  • Convoar: Based on the changes to Loden, add GLTF extensions that contain all of the OpenSimulator asset information (creator, transferable, …).
    • Add GLTF extensions that includes the raw OS prim information
    • Add GLTF extension to hold ownership, etc
    • Add Identity to creator
      • This might include DIDs or some other identity info

There could be more.


Dec 24, 2022 - TIL (Today I Learned) About c++filt

I’ve been working on this project1 where I’m compiling different C++ libraries and statically linking them together. I had problems with undefined symbols. And the undefined symbols were mangled C++ symbols. If you didn’t know, C++ creates “mangled” symbols for all your human readable symbols to solve the global namespace problems that C++ inherited from C. The article How To Mangle And Demangle A C++ Method Name explains it well.

The problem I had was that one library had the symbol _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rd and another library referenced _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf . What was different?

Well, the above referenced article references the “well known” tool of c++filt.

Of course!!

user@ubuntu ~> c++filt _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rd
btCollisionShape::getBoundingSphere(btVector3&, double&) const
user@ubuntu ~> c++filt _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf
btCollisionShape::getBoundingSphere(btVector3&, float&) const
user@ubuntu ~>

Looks like I am building one library with double precision turned on and the other was referencing it with double precision turned off. Now I know what to fix.

There are just so many tools in Linux.

  1. BulletSim in OpenSimulator 


Feb 4, 2022 - OpenSim Docker V2 to V3

Since I’ve started playing with Herbal3d again (more on that later), I need to have an easy way of running my modified OpenSimulator instances. Thus, I’ve gone back and updated my old opensim-docker project.

I first updated from V1 to V2 by updating OpenSimulator configuration files to the latest versions and then reworking the code so it is easier to understand.

That last problem was that it was a muddle of which image was being created and which runtime configuration was to be used. So now there are clearly two images (found in the directories image-opensim and image-herbal3d) and there are multiple configurations for those images in the image directories.

I also debugged the SQL version so it properly creates a standalone region and connects to the separately spun up database container.

After working on V2, I have come to feel that the idea of putting the configuration and the secrets for the configuration into the Docker image is wrong.

Thus version 3 is born.

The plan is to fix docker-config to mount the config directory in the user’s space. The process then becomes to clone the repository, build your image, edit the configuration information in the config directory, and finally start the container.


Feb 4, 2022 - Notes on v-web Metaverse

There has been some discussion on adding metaverse selection to Vircadia-Web (here after “v-web”) and this note talks about how the existing code could be modified.

Currently (as of Feb 4, 2022), v-web has a default metaverse URL that is used to fetch the metaverse information and is used as the metaverse to log the user into. This default metaverse is specified in @Base/config.ts and is connected when the main view is mounted (in App.vue).

The real work connecting to a metaverse is in @Modules/Utility.metaverseConnectionSetup() which calls MetaverseMgr.metaverseFactory() to create a new metaverse connection class instance. This operation also has the side effect of making the network connection to the metaverse, setting the “active” metaverse, and updating the metaverse information in the Vue variable $store. So the overall effect of calling metaverseConnectionSetup() is to change the active metaverse and update all the display variables. The only work needed here is that the previous metaverse class instance is not saved or freed.

Looking at the user interface, there is a “Click to log in to metaverse” text at the top of the page. Clicking this opens the “Metaverse Login” dialog (@Components/dialogs/Login.vue). This dialog has fields for username and password. If this dialog has a “metaverse” field added that had the default metaverse URL preloaded then the user could enter a new metaverse URL if logging into a different metaverse. The action would be, when the user pressed “Login”, the code would check if the metaverse URL had changed and, if so, call metaverseConnectionSetup() with the new URL before logging in the user. This would change the active metaverse and set up the application to use the new metaverse (Explore and other operations use the active metaverse).

As a side note, @Base/config.ts has code to save some variables in the browser’s local storage. If the user is specifying a different default metaverse, there should be some place that does a Config.setItem(DEFAULT_METAVERSE_URL, newURL).