sirikata / sirikata Goto Github PK
View Code? Open in Web Editor NEWSirikata is a BSD-licensed platform for networked 3d environments
Home Page: http://www.sirikata.com/
License: Other
Sirikata is a BSD-licensed platform for networked 3d environments
Home Page: http://www.sirikata.com/
License: Other
What is Sirikata? ----------------- Sirikata is a BSD licensed open source platform for games and virtual worlds. We aim to provide a set of libraries and protocols which can be used to deploy a virtual world, as well as fully featured sample implementations of services for hosting and deploying these worlds. Where can I find out more? -------------------------- The most up to date information can always be found at http://www.sirikata.com. The source code is available from GitHub at http://github.com/sirikata/sirikata/.
Calling Network::IOServiceFactory::pollService(ioServ) between ObjectHost init and creating the first network connection causes IOService to fail permanently.
The boost documentation mentions needing to call a "reset" function if there is nothing in the queue to be sent, possibly due to quirks with the select function having nothing to select on, but is there a better way, such as always having at least one event there?
Right now users have to track down each and every required dll (and get the zlib.dll from installed-curl not mono) to get a runnable program.
We should have a script copy the dll's to the appropriate build directory in cmake itself
In my case, I don't have mono compiled on 64-bit. MONO_FOUND is false, but monoscript is listed in the INSTALL(TARGETS ...) command.
I suspect the same would be true if I chose to build without ogre support.
Right now the prox service needs to be rewritten to understand ports
Currently, only assets are always saved on disk. Names are only saved in names.txt when you upload files.
One solution would be to have CachedNameLookupManager dump its cached names into a text file when it is destructed
Another solution is a script that grabs all the online names and saves them into names.txt.
Some implementation of an offline name store is a requirement for Bornholm and CCRMA so that we have no issues with a flaky Internet connection.
Someone should turn on shadows in ogre and see how the objects look with better lighting
The proximity system right now does not sync up with the space to produce the same time. That means if proximity runs on a different computer as space or the space becomes distributed, the proximity system will need to sync up time with the Space
Spaces could run ntpd and clients could connect and request time deltas every minute or so (it's surprising how quickly things fall out of sync)
As a fallback a standard ping message could be sent where the protobuf included source time and dest time--then the client could read that back and decide how far off they were.
Google recently disabled RTTI in Chromium. This causes linker errors on some platforms if it is not also disabled in Awesomium.
See here for the Chromium Issue for disabling RTTI on Mac:
http://code.google.com/p/chromium/issues/detail?id=19094
not clear if this is a user error -- I've looked as deeply as I can, even parsed the mesh in bullet, the vertices appear to be sane.
If you convert the attached scene and run it, you will see the avatar (not attached to camera), but bornholm_material_test_01.mesh is nowhere to be found.
The ordering/dependencies of the Makefile for Linux causes protobufs to be installed before mono (because mono is under optional-dependencies). However, because of this, C# protocol buffers cannot be generated, making the mono plugin useless unless you manually delete and reinstall some dependencies.
Ultimately this might mean that a Makefile isn't sufficient to express what we need to do: we have two things that can satisfy a dependency and need to dynamically decide which to use. We might be better off figuring out how to "collect" all the dependencies and issue a single install command.
{{{
==28487== Thread 1:
==28487== Conditional jump or move depends on uninitialised value(s)
==28487== at 0x4B15DEC: Sirikata::ProxyObject::UpdateNeeded::operator()(Sirikata::Location const&, Sirikata::Location const&) const (ProxyObject.cpp:77)
==28487== by 0x4AE8799: Sirikata::TimedWeightedExtrapolatorBase<Sirikata::Location, Sirikata::ProxyObject::UpdateNeeded, Sirikata::Time, Sirikata::Task::DeltaTime>::needsUpdate(Sirikata::Time const&, Sirikata::Location const&) const (Extrapolation.hpp:77)
==28487== by 0x4AE896E: Sirikata::HostedObject::PerSpaceData::updateLocation(Sirikata::HostedObject_) (HostedObject.cpp:88)
==28487== by 0x4AC7784: Sirikata::HostedObject::tick() (HostedObject.cpp:907)
==28487== by 0x4AAD62D: Sirikata::ObjectHost::tick() (ObjectHost.cpp:290)
==28487== by 0x808D90A: main (main.cpp:287)
==28487==
==28487== Conditional jump or move depends on uninitialised value(s)
==28487== at 0x4B15E0B: Sirikata::ProxyObject::UpdateNeeded::operator()(Sirikata::Location const&, Sirikata::Location const&) const (ProxyObject.cpp:77)
==28487== by 0x4AE8799: Sirikata::TimedWeightedExtrapolatorBase<Sirikata::Location, Sirikata::ProxyObject::UpdateNeeded, Sirikata::Time, Sirikata::Task::DeltaTime>::needsUpdate(Sirikata::Time const&, Sirikata::Location const&) const (Extrapolation.hpp:77)
==28487== by 0x4AE896E: Sirikata::HostedObject::PerSpaceData::updateLocation(Sirikata::HostedObject_) (HostedObject.cpp:88)
==28487== by 0x4AC7784: Sirikata::HostedObject::tick() (HostedObject.cpp:907)
==28487== by 0x4AAD62D: Sirikata::ObjectHost::tick() (ObjectHost.cpp:290)
==28487== by 0x808D90A: main (main.cpp:287)
==28487==
==28487== Conditional jump or move depends on uninitialised value(s)
==28487== at 0x4B15E2A: Sirikata::ProxyObject::UpdateNeeded::operator()(Sirikata::Location const&, Sirikata::Location const&) const (ProxyObject.cpp:77)
==28487== by 0x4AE8799: Sirikata::TimedWeightedExtrapolatorBase<Sirikata::Location, Sirikata::ProxyObject::UpdateNeeded, Sirikata::Time, Sirikata::Task::DeltaTime>::needsUpdate(Sirikata::Time const&, Sirikata::Location const&) const (Extrapolation.hpp:77)
==28487== by 0x4AE896E: Sirikata::HostedObject::PerSpaceData::updateLocation(Sirikata::HostedObject*) (HostedObject.cpp:88)
==28487== by 0x4AC7784: Sirikata::HostedObject::tick() (HostedObject.cpp:907)
==28487== by 0x4AAD62D: Sirikata::ObjectHost::tick() (ObjectHost.cpp:290)
==28487== by 0x808D90A: main (main.cpp:287)
}}}
The main loop needs a sleep to maintain a max framerate
it may also wish to run 2 or 3 physics frame per graphics frame depending on the framerate (or idle instead of running 1 gfx per phy)
6>C:/Documents and Settings/Owner/My Documents/Workspaces/sirikata/liboh/scripts/csharp/protocol/Sirikata.pbj.cs(1649,33): error CS1501: No overload for method CastBool' takes
0' arguments
code :
public bool Stateless{ get {
if (HasStateless) {
return PBJ._PBJ.CastBool(super.Stateless);
} else {
return PBJ._PBJ.CastBool();
}
}
FindMono.cmake gives inconsistent results with multiple calls to cmake, even if nothing has changed. Specifically, it correctly determines that mono is not available the first time because it cannot find the dev files (include files, specifically), but then claims it is found when cmake is run again.
This causes the monoscript plugin to be built even though not all the required files are available.
I do not want this to go away
The x.pbj.hpp files generated by PBJ don't have include guards, so they currently have to be handled carefully to avoid double includes. Should be pretty easy to add the include guards in the generator code, looks like initNameSpace() and closeNamespace() in PBJParseUtil.cpp would need some minor additions.
The shader should forcefully cutoff the light if it is outside of the max_cutoff while avoiding the NVIDIA bug triggered by this.
Seems to happen more often with name lookups on sirikata.com. The download code needs to be more resilient with flakey connections, perhaps have Transfer::ServiceIterator run through all available services 3 times, in case it failed during one of the passes.
When getting an element from the database, that element appeared to be printing out as a string.
This could be problematic if you stumble upon a strange unicode sequence
version: artist branch ac1355
platform: Ubuntu 8.04, 32-bit
attempting to load a scene with a light, a camera, and this asset:
meru:///terrain_main_video_01.mesh
which is presently mapped to:
mhash:///915fe17b803c76e949bb235c34df69d06df09a61a11518b600baa64a3d5b3a02
(CDN: sirikata.com/content/)
causes a crash that ends with this:
terminate called after throwing an instance of 'Ogre::InternalErrorException'
what(): OGRE EXCEPTION(7:InternalErrorException): Missing geometry data in mesh file in MeshSerializerImpl::readSubMesh at OgreMeshSerializerImpl.cpp (line 1000)
(0) : fatal error C9999: *** exception during compilation ***
Cg compiler terminated due to fatal error
full log is attached
CMake does not appreciate copy commands to directories that contain spaces ' '
This is mostly a test of the bug system
It is difficult to install the required 32 bit packages and they are often inconveniently shipped with strange symbolic links required.
Ideally a 64 bit build will be ready by release so that average linux users can download the native packages for the individual components and build them in a straightforward manner
When writing a new abstracted TimerHandler class also Fix #25 .
This may require a shared_ptr to the class
Awesomium deadlocks on mac and does not have refresh capability
since the other mac libs are now up to speed it may make sense to rebuild things for the mac--on the other hand it may also be sensible to wait until our next refresh to head (when the current font issue is fixed--either on our end or theirs)
Crashes with a "pure virtual function called" for ProxyObjectListener::destroyed(), for the destruction notification of the children of a given parent object.
gdb crashes when trying to print out the proxy object. This is probably a use-after-free.
One possible solution is to make the list of children separate, and use shared_ptr's for them, because it would be nice to permit walking down through the tree, which is currently not possible.
From this report on the dev-list: http://groups.google.com/group/platformtalk/browse_thread/thread/a0cf32bd813ba3b5/148e119067c1e626#148e119067c1e626
Crashes with this using OpenGL:
16:01:19: OGRE EXCEPTION(3:RenderingAPIException): Zero sized texture
surface on texture ExteriorCubeMap face 0 mipmap 0. Probably, the GL
driver refused to create the texture. in GLTexture::_createSurfaceList
at ..\src\OgreGLTexture.cpp (line 394)
and this using DirectX
16:14:10: OGRE EXCEPTION(3:RenderingAPIException): Error creating
texture: Not available in D3D9Texture::_createCubeTex at
..\src\OgreD3D9Texture.cpp (line 871)
The user thinks he has a VIA/S3G UniChrome IGP.
On Ubuntu 9.04 64bit, rev 8fdebf8 I'm getting the following crash (from a GC thread, not the main thread) when I try to connect a second object host:
{{{
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xf290db90 (LWP 17858)]
0xe823cf01 in ?? ()
(gdb) bt
#0 0xe823cf01 in ?? ()
#1 0xf2ce4390 in ?? ()
#2 0xf2f8f307 in mono_jit_runtime_invoke (method=0x3c6f40, obj=0xe4e820, params=0x0, exc=0xf290d1a8) at mini.c:4162
#3 0xf304e353 in mono_runtime_invoke (method=0x9c0783c, obj=0xe4e820, params=0x0, exc=0xf290d1a8) at object.c:2401
#4 0xf306ea89 in run_finalize (obj=0xe4e820, data=0x0) at gc.c:166
#5 0xf313d099 in GC_invoke_finalizers () at finalize.c:787
#6 0xf306ddc2 in mono_gc_invoke_finalizers () at boehm-gc.c:375
#7 0xf306ecbc in finalizer_thread (unused=0x0) at gc.c:961
#8 0xf309677e in start_wrapper (data=0x9902438) at threads.c:623
#9 0xf31219b6 in thread_start_routine (args=0x9905984) at threads.c:286
#10 0xf314a34e in GC_start_routine (arg=0x26f20) at pthread_support.c:1382
#11 0xf6ee64ff in start_thread () from /lib32/libpthread.so.0
#12 0xf4b1eb9e in clone () from /lib32/libc.so.6
(gdb) mono_backtrace
Missing argument 0 in user function.
(gdb) mono_backtrace 10
#0 0xe823cf01 in IronPython.Modules.PythonWeakRef/weakproxy:Finalize () + 0xc9 (0xe823ce38 0xe823cf61) [0x25ee0 - Root Domain]
#1 0xf2ce4390 in (wrapper runtime-invoke) object:runtime_invoke_void__this__ (object,intptr,intptr,intptr) + 0x40 (0xf2ce4350 0xf2ce4407) [0x25ee0 - Root Domain]
sendprox4
#2 0xf2f8f307 in mono_jit_runtime_invoke (method=0x3c6f40, obj=0xe4e820, params=0x0, exc=0xf290d1a8) at mini.c:4162
4162 return runtime_invoke (obj, params, exc, compiled_method);
#3 0xf304e353 in mono_runtime_invoke (method=0x9c0783c, obj=0xe4e820, params=0x0, exc=0xf290d1a8) at object.c:2401
2401 return default_mono_runtime_invoke (method, obj, params, exc);
#4 0xf306ea89 in run_finalize (obj=0xe4e820, data=0x0) at gc.c:166
166 mono_runtime_invoke (finalizer, o, NULL, &exc);
#5 0xf313d099 in GC_invoke_finalizers () at finalize.c:787
787 (*(curr_fo -> fo_fn))((ptr_t)(curr_fo -> fo_hidden_base),
#6 0xf306ddc2 in mono_gc_invoke_finalizers () at boehm-gc.c:375
375 return GC_invoke_finalizers ();
#7 0xf306ecbc in finalizer_thread (unused=0x0) at gc.c:961
961 mono_gc_invoke_finalizers ();
#8 0xf309677e in start_wrapper (data=0x9902438) at threads.c:623
623 start_func (start_arg);
#9 0xf31219b6 in thread_start_routine (args=0x9905984) at threads.c:286
286 thread_exit (thread->start_routine (thread->start_arg),
}}}
The second stack trace is using mono_backtrace to give info about the Mono calls. This occurs in the object host, and only on the one that is connecting.
My first guess would be that something is not being pinned properly, but I'm not sure about that.
Happened soon after typing "cont" from gdb--I was in the debugger long enough to cause a timeout. The timedOut function calls the callback function of the parent SentMessage, which has been deleted by that time.
modified test.py to send LocRequest to itself (the camera object)
My understanding is this should result in a message -- perhaps ObjLoc? -- specifying the location of the object receiving the LocRequest. I've tried it with other objects as well, and so far I haven't seen any likely candidate as a response message. All I get are the prox messages for each object in the system, regardless of whether I send the LocRequest or not.
the hash for the version I am testing is cecbbbd
Sometimes transparency shows up as opaque, one sided, or invisibly
Right now ObjectHosts track their positions locally without informing space
This causes prox to get out of date and disallows any sort of authority to be placed upon the space re: physics.
HostedObjects should update Loc about position so that can forward these updates to prox
the test fails...we should not have failing tests.
Right now each space node has its own Time.
Since there's only one that's ok.
If we want multiple space nodes then those space nodes should sync up with a central server so that objects can logically migrate without being told.
this should happen by fixing Space.cpp's now() function and having sync logic between space nodes
branch: master
Database references object by private UUID, the space may not have assigned the pub UUID. In practice, cannot attach camera to a physical object
cppoh_d hangs when closing the window on the Macintosh, necessitating a Force Quit.
Additionally, selecting "Quit cppoh_d" from the "cppoh_d" menu seems to do nothing.
branch: master
Querying 'Name' from Python returns with no data field (as called from PersistenceRead in liboh/scripting/ironpython/util.py)
fdf2164 committed a fix to avoid using the weakref class, thereby avoiding SIGSEGV's in mono's GC's call to weakref::finalize
However the fact that Microsoft.Scripting.dll actually implements WeakHandle as a primitive type indicates that there may be a reason for its existence and that I may have inadvertently caused a memory leak.
I would appreciate a pair of eyes to take a look at this in more detail.
==28621== Invalid read of size 4
==28621== at 0x7CD8540: pthread_mutex_lock (in /lib32/libpthread-2.7.so)
==28621== by 0x80BA0FC: boost::mutex::lock() (mutex.hpp:50)
==28621== by 0x80BA1B8: boost::unique_lockboost::mutex::lock() (locks.hpp:338)
==28621== by 0x80BA1E7: boost::unique_lockboost::mutex::unique_lock(boost::mutex&) (locks.hpp:224)
==28621== by 0x80D885E: Sirikata::Transfer::EventTransferManager::downloadFinished(Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const_) (EventTransferManager.hpp:77)
==28621== by 0x80AB9E0: boost::mfi::mf3<void, Sirikata::Transfer::EventTransferManager, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const>::operator()(Sirikata::Transfer::EventTransferManager_, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const_) const (mem_fn_template.hpp:384)
==28621== by 0x80ACA15: void boost::_bi::list4boost::_bi::value<Sirikata::Transfer::EventTransferManager*, boost::_bi::valueSirikata::Transfer::RemoteFileId, boost::_bi::valueSirikata::Transfer::Range, boost::arg<1> >::operator()<boost::_mfi::mf3<void, Sirikata::Transfer::EventTransferManager, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const*>, boost::_bi::list1<Sirikata::Transfer::SparseData const*&> >(boost::_bi::type, boost::_mfi::mf3<void, Sirikata::Transfer::EventTransferManager, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const*>&, boost::_bi::list1<Sirikata::Transfer::SparseData const*&>&, int) (bind.hpp:436)
==28621== by 0x80ACA61: void boost::_bi::bind_t<void, boost::_mfi::mf3<void, Sirikata::Transfer::EventTransferManager, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const*>, boost::_bi::list4boost::_bi::value<Sirikata::Transfer::EventTransferManager*, boost::_bi::valueSirikata::Transfer::RemoteFileId, boost::bi::valueSirikata::Transfer::Range, boost::arg<1> > >::operator()<Sirikata::Transfer::SparseData const*>(Sirikata::Transfer::SparseData const&) (bind_template.hpp:32)
==28621== by 0x80ACA83: boost::detail::function::void_function_obj_invoker1<boost::_bi::bind_t<void, boost::mfi::mf3<void, Sirikata::Transfer::EventTransferManager, Sirikata::Transfer::RemoteFileId const&, Sirikata::Transfer::Range const&, Sirikata::Transfer::SparseData const>, boost::_bi::list4boost::bi::value<Sirikata::Transfer::EventTransferManager*, boost::bi::valueSirikata::Transfer::RemoteFileId, boost::bi::valueSirikata::Transfer::Range, boost::arg<1> > >, void, Sirikata::Transfer::SparseData const>::invoke(boost::detail::function::function_buffer&, Sirikata::Transfer::SparseData const) (function_template.hpp:152)
==28621== by 0x4886D7D: boost::function1<void, Sirikata::Transfer::SparseData const*>::operator()(Sirikata::Transfer::SparseData const) const (function_template.hpp:989)
==28621== by 0x48827DC: Sirikata::Transfer::DiskCacheLayer::workerThread() (DiskCacheLayer.cpp:304)
==28621== by 0x80AE679: boost::mfi::mf0<void, Sirikata::Transfer::DiskCacheLayer>::operator()(Sirikata::Transfer::DiskCacheLayer) const (mem_fn_template.hpp:49)
==28621== Address 0x1b4966b4 is not stack'd, malloc'd or (recently) free'd
cppoh_d: /home/daniel/sirikata/dependencies/installed-boost/include/boost-1_37/boost/thread/pthread/mutex.hpp:50: void boost::mutex::lock(): Assertion `!pthread_mutex_lock(&m)' failed.
We will need to clone objects as they are dragged+dropped onto the scene.
The option is to either use LocalTime at all points except during Serialization/Deserialization or whether to use the Space's time through simulation and computation and then just writing those times out to the wire.
The advantage of the latter is that the Delta offset is stored in the TopLevelSpaceConnection meaning it can easily be probed right before send
when you're on the mac and right click-drag and accidentally scroll a few pixels you end up near zero rather than near the scene: this may be because the scroll wheel uses the camera's world coords rather than local coords.
It can be very disorienting to a user since there's no way to undo a small scrollish action
6b9c9
it's still very useful to write a .csv file, since there is no other efficient way to modify the database. If it's not going to be supported, it should be disabled.
saving new scene as scene_new.csv:
(0) : fatal error C9999: *** exception during compilation ***
Cg compiler terminated due to fatal errorcppoh_d: /home/dbm/bench/museum/dependencies/installed-boost/include/boost-1_37/boost/thread/pthread/mutex.hpp:45: boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
Causes errors only on clean builds, and some files simply never get generated when this happens, no matter how many times you rerun make.
One way to force them to build in the right order is by adding all the *_protobuf.cc files to dependencies of libcore (i.e. an earlier dependency in the build process)
This bug has been reproduced on two out of four mac systems in the past week. Does not occur as often on Linux builds, and has not been tested on Windows afaik.
{{{
#6 0xf7dc6bfa in Sirikata::ObjectHostProxyManager::destroyViewedObject (
this=0x81c8c68, newObj=@0xed483c24, viewer=0x0)
at /home/daniel/sirikata/liboh/src/ObjectHostProxyManager.cpp:66
66 iter->second.viewers.erase(viewiter);
(gdb) print *viewiter
$3 = (class Sirikata::QueryTracker * const&) @0xed4a8fec: 0x25
(gdb)
}}}
{{{
#4 0xf7dcb568 in boost::unordered_detail::hash_table_data_equivalent_keysstd::allocator<Sirikata::QueryTracker* >::erase (this=0xed49c71c, r=
{bucket_ = 0xed4a8fe4, node_ = 0xed4a8fe4})
at /home/daniel/sirikata/dependencies/installed-boost/include/boost-1_37/boost/unordered/detail/hash_table_impl.hpp:965
#5 0xf7dcb611 in boost::unordered_multiset<Sirikata::QueryTracker*, boost::hashSirikata::QueryTracker*, std::equal_toSirikata::QueryTracker*, std::allocatorSirikata::QueryTracker* >::erase (this=0xed49c70c, position=
{<boost::iterator<std::forward_iterator_tag,Sirikata::QueryTracker*,int,Sirikata::QueryTracker* const*,Sirikata::QueryTracker* const&>> = {<boost::detail::iterator_base<std::forward_iterator_tag,Sirikata::QueryTracker*,int,Sirikata::QueryTracker* const*,Sirikata::QueryTracker* const&>> = {<std::iterator<std::forward_iterator_tag,Sirikata::QueryTracker*,int,Sirikata::QueryTracker* const*,Sirikata::QueryTracker* const&>> = {<No data fields>}, <No data fields>}, <No data fields>}, base_ = {bucket_ = 0xed4a8fe4, node_ = 0xed4a8fe4}})
at /home/daniel/sirikata/dependencies/installed-boost/include/boost-1_37/boost/unordered/unordered_set.hpp:585
#6 0xf7dc6bfa in Sirikata::ObjectHostProxyManager::destroyViewedObject (
this=0x81c8c68, newObj=@0xed483c24, viewer=0x0)
at /home/daniel/sirikata/liboh/src/ObjectHostProxyManager.cpp:66
#7 0xf7dc6d82 in Sirikata::ObjectHostProxyManager::destroyObject (
this=0x81c8c68, newObj=@0xed4a339c)
at /home/daniel/sirikata/liboh/src/ObjectHostProxyManager.cpp:79
#8 0xf7bbb3c7 in Sirikata::Graphics::OgreSystem::MouseHandler::deleteObjectsAction (this=0x8494a80)
}}}
{{{
#2 0xf62a9ec5 in (anonymous namespace)::WorkerThread::ThreadMain ()
from /home/daniel/sirikata/dependencies/installed-awesomium/lib/libawesomium.so
#1 0xf5a0e778 in net::CertVerifier::Request::DoVerify ()
from /home/daniel/sirikata/dependencies/installed-awesomium/lib/libawesomium.so
(gdb)
#0 0xf5a2057e in net::X509Certificate::Verify ()
from /home/daniel/sirikata/dependencies/installed-awesomium/lib/libawesomium.so
}}}
For eventuality of portals between worlds, object hosts with graphics plugins should be able to connect to multiple spaces and render at least 1 to texture
hitting delete on an object only removes it from the scenegraph, not from the actual ObjectHost and hence it is still visible
Certain displays need videos using the video tags and others need presence in the 3d world.
Need mechanism to have off-axis browser and click to pull them parallel to the camera plane for interaction.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.