Coder Social home page Coder Social logo

samsung / gearvrf Goto Github PK

View Code? Open in Web Editor NEW
407.0 105.0 217.0 936.01 MB

The GearVR framework(GearVRf) is an Open Source VR rendering library for application development on VR-supported Android devices.

Home Page: http://www.gearvrf.org

License: Apache License 2.0

Java 36.83% Makefile 0.12% C 7.99% C++ 48.25% CMake 0.03% HTML 0.03% JavaScript 5.94% GLSL 0.53% CSS 0.01% Objective-C 0.03% Python 0.20% Shell 0.04%

gearvrf's Introduction

gearvrf's People

Contributors

apjagdale avatar chenchao1407 avatar danke-sra avatar dankex avatar deepak-rawat avatar dknaan avatar dnvasilev avatar ejsamsung avatar gaurav-mcl avatar guodongrong avatar j0nreynolds avatar jason2kim avatar johnspurlock avatar jonshemitz avatar julianafigueira avatar lcbasu avatar liahim avatar liaxim avatar mingsong avatar mwitchwilliams avatar nathanalmeida avatar noladonato avatar parthmehta209s avatar pharscoet avatar pnemonic78 avatar ragner avatar rahul27 avatar roshanch avatar sushantojal avatar tflynnt 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  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

gearvrf's Issues

Initial configuration support.

Right now we hard-code settings for multisample, cpu & gpu levels, and so on. There's are hard-coded in activity_jni.cpp in the oculus/ directory. We should allow setting those before we send them to the oculus sdk.

Decrease the number of samples

Hi,

There are currently 12 samples. Some of them don't demonstrate any special feature and some have duplicated code.
I consider dcreasing the number of samples and adding new samples that demonstrate specific features or abilities of the GVRF library.
In general, I would prefer to have simple samples that are demonstrate well a specific feature and easy to understand.

Having too many samples, make it more difficult to maintain the code, so at the first stage I consider to remove some samples:

  • Cockpit
  • Panorama
  • Gvr-sample
  • Simplegallery or Opacityanigallery (because they are almost identical).

If anyone has any objection or ideas (for samples to add or samples to remove), please share here.

Thanks

sRGB support

Add support for sRGB render targets and textures.

GVRSceneObject::setName(String) - native crash

When setting a null String in GVRSceneObject::setName(String), a native crash occurs.

public void testSceneObjectSetGetNameNull() {
        GVRMesh mesh = TestDefaultGVRViewManager.mGVRContext.loadMesh(UtilResource.androidResource(TestDefaultGVRViewManager.mGVRContext,R.mipmap.cylinder));
        GVRSceneObject sceneObject = new GVRSceneObject(TestDefaultGVRViewManager.mGVRContext, mesh);
        try {
            sceneObject.setName(null);
            fail();
        } catch (NullPointerException e) {
        }
    }

Issue with GVRBitmapTexture.update()

Right now, the GVRBitmapTexture.update() only works on VrThread. It means, if you want to trigger the update() with your input event or any other thread, the update() doesn't work.

We may find a way to fix it or somehow do a workaround like hold the most recent update until next onDrawEyeView get triggered.

Problem on GVRTextViewSceneObject

When we try to create more than 1 GVRTextViewSceneObject, the scene objects start flickering after moving head.

This even happen in the sample gvrtextviewsample, after creating another GVRTextViewSceneObject

Developer Mode Crashes

We have a simple test app that crashes, but only when the headset is on and when Gear VR Service is in Developer Mode. This didn't used to happen but it seems to happen since upgrading the Gear VR Service after installing Lollipop. Since we can only repro it with the headset on, and we're using Note 4's, we haven't been able to locate the source of the crash.

Has anyone else seen this? Any pointers would be appreciated... including pointers to a reliable way to debug via Bluetooth or Wifi while the headset is connected.

GVRAccelerateDecelerateInterpolator::mapRatio(float) - Positive infinity

A map ratio for positive infinity value returns NAN instead of POSITIVE_INFINITY

public void testMapRatioPositiveInfinity() {
        GVRAccelerateDecelerateInterpolator interpolator = GVRAccelerateDecelerateInterpolator.getInstance();
        assertEquals(interpolator.mapRatio(Float.POSITIVE_INFINITY), Float.POSITIVE_INFINITY);
}

Issue with GVRSphereSceneObject.

I just merged the pull request #48 for not stopping our progress on other stuffs. But actually as you may see in the sample app provided by #48 . The texture content is somehow distorted in a wrong way.

GVRContext::loadMesh(GVRAndroidResource androidResource) - non-triangle meshes are not getting visible

When trying to load non-triangle meshes as parameter to GVRContext.loadMesh(GVRAndroidResource androidResource), application runs normally without crashing but the Mesh is not visible.

We are using this code (that works, the cube is visible):

      GVRAndroidResource androidResourceCube = new GVRAndroidResource(mGVRContext, R.mipmap.smallcubet);
      GVRAndroidResource androidResourceTexture = new GVRAndroidResource(mGVRContext, R.drawable.texture3);
      GVRMesh cubeTMesh = mGVRContext.loadMesh(androidResourceCube);
      GVRSceneObject objectCube = new GVRSceneObject(mGVRContext, cubeTMesh, mGVRContext.loadTexture(androidResourceTexture));
      objectCube.getTransform().setPosition(0.0f, 0.0f, -2.0f);
      mGVRContext.getMainScene().addSceneObject(objectCube);

And that code (that does not works, the cube is invisible):

      GVRAndroidResource androidResourceCube = new GVRAndroidResource(mGVRContext, R.mipmap.smallcubeq);
      GVRAndroidResource androidResourceTexture = new GVRAndroidResource(mGVRContext, R.drawable.texture3);
      GVRMesh cubeMesh = mGVRContext.loadMesh(androidResourceCube);
      GVRSceneObject objectCube = new GVRSceneObject(mGVRContext, cubeMesh, mGVRContext.loadTexture(androidResourceTexture));
      objectCube.getTransform().setPosition(0.0f, 0.0f, -2.0f);
      mGVRContext.getMainScene().addSceneObject(objectCube);

About Triangulation Ricardo Maginador explained:

The only difference between the ".obj" files is their mesh format, cubeT's mesh is divided using triangles while cubeQ's mesh by quads. The one using quads can not be rendered while the mesh based in triangles is fully rendered. Just to complement, in Open GL quad mesh rendering is deprecated, that would explain what is happening, but the default structure used in 3D modeling is quad mesh, this generally is solved by converting quads to triangles during import.

.fbx file support

Assimp 3.1 (which we use) has support for the .fbx format. However, that code requires rtti support. The oculus sdk requires compiling with -fno-rtti. We cannot link them in the same application :(. Need to find a work-around.

state sorting

Add support for state sorting. At least add grouping by shader if not other bits of state.

GVRVideoSceneObject::new GVRVideoSceneObject(GVRContext, float, float, MediaPlayer, int) - Error message

The message when passing an invalid videoType in GVRVideoSceneObject creation could be more user friendly.

public void testSetVideoTypeInvalid() {
        MediaPlayer mediaPlayer = new MediaPlayer();

        try {
            new GVRVideoSceneObject(TestDefaultGVRViewManager.mGVRContext, 100f, 100f, mediaPlayer, 320);

        } catch (IllegalArgumentException e) {
            assertEquals(e.getMessage(), "IllegalArgumentException for videoType. Types supported: " +
                    "GVRVideoSceneObject.GVRVideoType.MONO, " +
                    "GVRVideoSceneObject.GVRVideoType.HORIZONTAL_STEREO, " +
                    "GVRVideoSceneObject.GVRVideoType.VERTICAL_STEREO");
        }
}

GVRAccelerateDecelerateInterpolator::mapRatio(float) - Error message

The message when passing an invalid mapRatio to GVRAccelerateDecelerateInterpolator::mapRatio() could be more user friendly.

public void testMapRatioGreaterThanOne() {
        try {
            GVRAccelerateDecelerateInterpolator interpolator = GVRAccelerateDecelerateInterpolator.getInstance();
            interpolator.mapRatio(2f);
            fail();
        } catch (InvalidParameterException e) {
            assertNotNull(e.getMessage(), "ratio - the current time ratio, >= 0 and <= 1");
        }
    }

Stats

Add support to see the number of triangles, number of draw calls, amount of time spent on the CPU and spent on the GPU.

Do culling per-scene, not per-eye.

Currently, frustum culling is done in renderCamera() in renderer.cpp. renderCamera() is called per-eye. It would be more ideal to do that culling once per frame, rather than twice. That culling should be perhaps done against a combined left/right eye frustum.

GVRBitmapTexture::new GVRBitmapTexture(GVRContext, String) - native crash

When passing an empty or null String to GVRBitmapTexture's constructor, a native crash occurs.

public void testConstructorEmptyString() {
        try {
            bitmapTexture = new GVRBitmapTexture(TestDefaultGVRViewManager.mGVRContext, "");
            fail("Constructor allows empty asset file name.");
        } catch (Exception e) {
            e.printStackTrace();
        }
}
public void testConstructorNullBitmap() {
        try {
            new GVRBitmapTexture(TestDefaultGVRViewManager.mGVRContext, (Bitmap) null);
            fail("Constructor allows null bitmap object.");
        } catch (Exception e) {
            fail(e.getMessage());
        }
}

GVRTransform::getRotationPitch - Result is NaN

We think that pitch value must be between 0 and 360, but the method is returning NaN.

    mSceneObject.getTransform().setRotation(1.0f,
    BoundsValues.getFloatList().get(0),
    BoundsValues.getFloatList().get(0),
    BoundsValues.getFloatList().get(0));

    float pitch = mSceneObject.getTransform().getRotationPitch();
    boolean result = (pitch >= 0) && (pitch <= 360);
    assertTrue("Pitch 1: " + pitch, result);

The first time, pitch gets a "valid" value (1.63E-43, I don't know if this is a valid value, but is in the range).

    mSceneObject.getTransform().setRotation(1.0f,
    BoundsValues.getFloatList().get(1),
    BoundsValues.getFloatList().get(1),
    BoundsValues.getFloatList().get(1));

    pitch = mSceneObject.getTransform().getRotationPitch();
    result = (pitch >= 0) && (pitch <= 360);
    assertTrue("Pitch 2: " + pitch, result);

The second time, with these values, pitch gets a NaN as value.

GVRFloatTexture::Constructor - It is not throwing the exception

The exception below is not been thrown.

IllegalArgumentException - If width or height is <= 0, or if data is null, or if data.length < height * width * 2
GVRFloatTexture Documentation

private float pixels[] = {
            0.0f, 0.0f, 0.0f,   1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, 1.0f,   0.0f, 0.0f, 0.0f
    };
SomeGVRViewManager mGVRContext = new SomeGVRViewManager();
GVRFloatTexture gvrFloatTexture = new GVRFloatTexture(,0,1,pixels);

GVRAccelerateDecelerateInterpolator::mapRatio(float) - Negative infinity

A map ratio for positive infinity value returns NAN instead of NEGATIVE_INFINITY

public void testMapRatioNegativeInfinity() {
        GVRAccelerateDecelerateInterpolator interpolator = GVRAccelerateDecelerateInterpolator.getInstance();
        assertEquals(interpolator.mapRatio(Float.NEGATIVE_INFINITY), Float.NEGATIVE_INFINITY);
}

multipass support

Allow multipass support for a SceneObject to allow for interesting effects.

GVRAnimation::new GVRAnimation - nested animation crashes api

When trying to nest animations the api crashes.

@Override
public void onStep() {
(...)
     new GVROpacityAnimation(spaceSceneObject, 1f, 0f).setOnFinish(new GVROnFinish() {
            @Override
            public void finished(GVRAnimation animation) {
                new GVROpacityAnimation(shipSceneObject, 2.45f, 1f).setOnFinish(new GVROnFinish() {
                    @Override
                    public void finished(GVRAnimation animation) {

                    }
                }).start(mGVRContext.getAnimationEngine());
            }
        }).start(mGVRContext.getAnimationEngine());
    }
(...)
}

GVRCameraRig::getFloat(String) - native crash

When passing a not inatialized key to GVRCameraRig::getFloat(String), a native crash occurs.

public void testGetFloatWithoutSettingItBefore() {
        mGVRContext.getMainScene().getMainCameraRig().getFloat("ratio_r");
}

If we add the line

mGVRContext.getMainScene().getMainCameraRig().setFloat("ratio_r", 1.0f);

before calling the get method, the error doesn`t happen anymore.

Need proper transparency sorting

Currently in GearVRf, objects can be assigned a 'Rendering Order' (background, geometry, transparent, and overlay. see GVRRenderingOrder in GVRRenderData.java) and objects are sorted according to that. That's a good start. Though, within the list of objects marked as transparent, those should be sorted by distance from the camera. That's currently not being done. We should fix that.

Monoscopic mode

Currently there is no way to force monoscopic rendering iff isVrSupported but monoscopic should be able to be used on GearVR supported phones.

    // GVRActivity.java
    public void setScript(GVRScript gvrScript, String distortionDataFileName, boolean monoscopic) {
        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            if (isVrSupported() && !monoscopic) {
                mGVRViewManager = new GVRViewManager(this, gvrScript,
                        distortionDataFileName);
            } else {
                mGVRViewManager = new GVRMonoscopicViewManager(this, gvrScript,
                        distortionDataFileName);
            }
        } else {
            throw new IllegalArgumentException(
                    "You can not set orientation to portrait for GVRF apps.");
        }
    }

    public void setScript(GVRScript gvrScript, String distortionDataFileName) {
        setScript(gvrScript, distortionDataFileName, false);
    }

Crash with AssimpImporter.

The scenario is that I tried to create a bunny in performancetest sample about 2 or 3 times per second using the following codes(actually I just wanted to put stress on GC and see how our GC thread reacts):
mMainScene = mGVRContext.getMainScene();
GVRCameraRig mainCameraRig = mMainScene.getMainCameraRig();
int i = (int)(counter / 15);

    GVRSceneObject bunny = null;
    try {
        // we assume that the mesh and the textures are valid
        bunny = new GVRSceneObject(mGVRContext,
                mGVRContext.loadFutureMesh(new GVRAndroidResource(mGVRContext,
                        "bunny.obj")),
                        mGVRContext.loadFutureTexture(new GVRAndroidResource(
                                mGVRContext, textureNames[i
                                % textureNames.length])));
    } catch (IOException e) {
        e.printStackTrace();
        mActivity.finish();
        Log.e(TAG,
                "Mesh or texture were not loaded. Stopping application!");
    }

    Random random = new Random();

    bunny.getTransform().setPosition(0.0f, 0.0f,
            random.nextFloat() * 3.0f + 2.0f);
    bunny.getTransform().rotateByAxisWithPivot(
            random.nextFloat() * 360.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
            0.0f);
    bunny.getTransform().rotateByAxisWithPivot(
            random.nextFloat() * 360.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
            0.0f);
    bunny.getTransform().rotateByAxisWithPivot(
            random.nextFloat() * 360.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            0.0f);
    bunny.getTransform().translate(0.0f, 0.0f, -10.0f);
    //mainCameraRig.getOwnerObject().addChildObject(bunny);

    float x = random.nextFloat() - 0.5f;
    float y = random.nextFloat() - 0.5f;
    float z = random.nextFloat() - 0.5f;
    float length = (float) Math.sqrt(x * x + y * y + z * z);
    x /= length;
    y /= length;
    z /= length;

    new GVRRotationByAxisWithPivotAnimation(bunny, //
            5.0f + random.nextFloat() * 25.0f, //
            360.0f, //
            x, y, z, //
            0.0f, 0.0f, -10.0f) //
            .setRepeatMode(GVRRepeatMode.REPEATED).setRepeatCount(-1) //
            .start(mAnimationEngine);

After some random time, it will go native crash with following native stack trace:
05-29 20:52:34.368 10764 10764 I DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-29 20:52:34.368 10764 10764 I DEBUG : Build fingerprint: 'samsung/trltexx/trlte:5.0.1/LRX22C/N910FXXE1BOAD:eng/test-keys'
05-29 20:52:34.368 10764 10764 I DEBUG : Revision: '12'
05-29 20:52:34.368 10764 10764 I DEBUG : ABI: 'arm'
05-29 20:52:34.368 10764 10764 I DEBUG : pid: 12245, tid: 12290, name: pool-1-thread-5 >>> org.gearvrf.performancetest <<<
05-29 20:52:34.368 10764 10764 I DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
05-29 20:52:34.418 10764 10764 I DEBUG : r0 00000000 r1 aec85288 r2 aec85318 r3 aecca300
05-29 20:52:34.418 10764 10764 I DEBUG : r4 aec852d0 r5 00000000 r6 aec851c0 r7 aec852b8
05-29 20:52:34.418 10764 10764 I DEBUG : r8 aec852a0 r9 aec33428 sl 00000000 fp aec85258
05-29 20:52:34.418 10764 10764 I DEBUG : ip b3b9bb80 sp 9669b7d8 lr b3a13540 pc b3a13540 cpsr 00000010
05-29 20:52:34.418 10764 10764 I DEBUG :
05-29 20:52:34.418 10764 10764 I DEBUG : backtrace:
05-29 20:52:34.428 10764 10764 I DEBUG : #00 pc 00132540 /data/app/org.gearvrf.performancetest-2/lib/arm/libgvrf.so (gvr::AssimpImporter::getMesh(int)+436)
05-29 20:52:34.428 10764 10764 I DEBUG : #1 pc 00132944 /data/app/org.gearvrf.performancetest-2/lib/arm/libgvrf.so (Java_org_gearvrf_NativeAssimpImporter_getMesh+12)
05-29 20:52:34.428 10764 10764 I DEBUG : #2 pc 000bc10f /data/dalvik-cache/arm/data@[email protected]@[email protected]
05-29 20:52:39.858 10764 10764 I DEBUG :
05-29 20:52:39.858 10764 10764 I DEBUG : Tombstone written to: /data/tombstones/tombstone_07

I used arm-eabi-addr2line to check which line goes wrong and finally it points to 29th line of the codes inside assimp_importer.cpp :
aiMesh* ai_mesh = assimp_importer_->GetScene()->mMeshes[index];

I may go to check what is going wrong in this case.

GVRF reference counting

GVRF uses a (native code) std::shared_ptr based reference counting scheme. It works well enough in 'normal' cases, but does break down in the not-so-special case where you have an object (we see this commonly with scene objects and textures, but it could happen with other objects, too) that goes in and out of the scene graph: When GVRF sees that an object has no native references (just the reference from the Java wrapper) it will 'forget' about the native wrapper and/or recycle() the GL resource. This can lead to consequences like eye picking returning a GVRSceneObject instead of the subclassed instance (holding app values) that you put into the scene graphs, or even to GVRF crashing when it dereferences null in native code.

We have what amounts to work-arounds for this: we can manually add references (as per the JavaDoc for GVRShaders.setMainTexture()) and we can set the GVRHybridObject.setKeepWrapper() flag. Perhaps it would be better to add explicit

long GVRHYbridObject.touch(); // addReference()?
void GVRHYbridObject.release(long); // removeReference()?

methods?

Occlusion culling improvements

first verify the implementation that exists.
next, perhaps allow certain objects to be marked as occluders (i.e. a wall) and only render those occluders. it looks like the current code treats all objects as possible occluders.

Simplify picking

picking currently requires setting up a bounding Mesh for a object, creating an EyePointee, add the EyePointee to an EyePointeeHolder and then adding the EyePointeeHolder to the SceneObject. While flexible, it is a lot for a developer to go through to have the ability to pick. We saw this sort of trouble during the recent hackathon. We can provide a simple enablePicking() api that will construct a default bounding box for the mesh, and add the appropriate EyePointee and EyePointeeHolders.

Input samples

It would be useful to have some samples that demonstrate usage of external input like a gamepad and keyboard. A lot of applications beyond gaming could use good text entry support.

GVRCameraRig::setCameraRigType(int) - Invalid parameter

There could be an IllegalArgumentException message for passing an invalid cameraRigType to GVRCameraRig::setCameraRigType().

public void testExpectedAnIllegalArgumentException() {
        try {
            GVRCameraRig gvrCameraRig = TestDefaultGVRViewManager.mGVRContext.getMainScene().getMainCameraRig();
            gvrCameraRig.setCameraRigType(404);
            fail();
        } catch (IllegalArgumentException e) {
            assertEquals(e.getMessage(), "IllegalArgumentException for cameraRigType. Types supported: " +
                    "GVRCameraRig.GVRCameraRigType.Free, " +
                    "GVRCameraRig.GVRCameraRigType.Freeze, " +
                    "GVRCameraRig.GVRCameraRigType.OrbitPivot" +
                    "GVRCameraRig.GVRCameraRigType.RollFreeze" +
                    "GVRCameraRig.GVRCameraRigType.YawOnly");
        }
}

Exposing the ProximityReceiver

Receiving notifications from the proximity sensor would make it convenient for developers to detect device mount and unmount states allowing them to render objects in the current field of view rather than having the user look around to find the objects that were drawn when onInit() was last called.

Currently we can implement our own BroadcastReceiver for the proximity sensor intent just like the ProximityReceiver in VRLib. Would it be beneficial to add it to GVRf?

GVRMaterial::getVec2(String) - native crash

When passing a not inatialized key to GVRMaterial::getVec2(String), a native crash occurs.

public void testGetVec2WithAbsentKey() {
        mColorShader = new ColorShader(TestDefaultGVRViewManager.mGVRContext);
        GVRMaterial material = new GVRMaterial(TestDefaultGVRViewManager.mGVRContext, mColorShader.getShaderId());
        assertNull(material.getVec2("radio_r"));
    }

If we add the line

material.setVec2("radio_r", 0, 0);

before calling the get method, the error doesn`t happen anymore.

This also happens for getVec3 and getVec4

How to get picking listener direct from Scene Object

There is a way to get direct from the GVRSceneObject if he is picked? like:

   GVRSceneObject object;
   // ...
      object.setPickingListener(new PickingListener(){
       public void onPick(GVREyePointeeHolder e) {
       }
    });

or

public class Mic extends GVRSceneObject{
//...
    @Override
    public void onPick(GVREyePointeeHolder e) {
    }

}

GVRSceneObject.lookAt()

There could be a method where we can make a sceneObject look at another one, or look at a position.

It is too hard to calculate an euler angle between two sceneObjects and use it to turn one object to another.

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.