Git Product home page Git Product logo

aether.physics2d's Introduction

Aether.Physics2D

Aether.Physics2D is a 2D collision detection system.

Discord

Documentation: https://tainicom.github.io/Aether.Physics2D/

3DCameraDemo

Features

  • Continuous collision detection (with time of impact solver)
  • Contact callbacks: begin, end, pre-solve, post-solve
  • Convex and concave polyons and circles.
  • Multiple shapes per body
  • Dynamic tree and quad tree broadphase
  • Fast broadphase AABB queries and raycasts
  • Collision groups and categories
  • Sleep management
  • Friction and restitution
  • Stable stacking with a linear-time solver
  • Revolute, prismatic, distance, pulley, gear, mouse joint, and other joint types
  • Joint limits and joint motors
  • Controllers (gravity, force generators)
  • Tools to decompose concave polygons, find convex hulls and boolean operations
  • Factories to simplify the creation of bodies

Downloads

https://www.nuget.org/packages/Aether.Physics2D

NOTE From v1.5 the nuget package Aether.Physics2D contain the standalone library with no dependencies to 3rd party math libraries. For the monogame library (Vector2, Vector3 etc) and the monogame based diagnostics use Aether.Physics2D.MG and Aether.Physics2D.Diagnostics.MG.

https://www.nuget.org/packages/Aether.Physics2D.MG

https://www.nuget.org/packages/Aether.Physics2D.Diagnostics.MG

https://www.nuget.org/packages/Aether.Physics2D.Diagnostics

https://github.com/tainicom/Aether.Physics2D/releases/tag/v1.7

LightAndShadowsDemo

aether.physics2d's People

Contributors

bj-rn avatar jaimeadf avatar nkast avatar novialriptide 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

aether.physics2d's Issues

Replace Portable packages.

The main problem is using "portable packages". They are not being used any more and will make your lovely and awesome physics framework pretty obsolete. I had real carnage when I bought in any Aether packages from monogame 3.8 (not a prerelease, but the current version of monogame)

Past few years now since .net 5, Microsoft is been moving towards dotnet core and standard is their "ecosystems".

  • I couldn't use any of my content pipeline since monogame 3.8, uses that uses current .net, dotnet core, or dotnet standards.
  • It pretty much put my whole project in lockdown because after I removed it, it messed a bunch with my content pipeline stuff. So I had to do a clean wipe using "dotnet clean" which was another problem since I had to rebuild my content pipeline library to be used in the Monogame MGCB builder.
  • The portable will not work on the new standards of cross platform ecosystems because they are severely out of date. Current cross platform is used with dotnet core / dotnet standard using this new standard. Anyone using your Aether packages which uses "monogame portable" will not work on a Linux or Mac.

@nkast @tainicom Please review this, it is important: https://docs.monogame.net/articles/whats_new.html#removed-portable-assemblies

Monogame reference

Hi,
I have a question - why do you have monogame reference from your main physics engine?
In my view physics is just a math that is not view engine related.
What this reference is used for? I can see Point (but it is very simple class that can be reimplemented and mapped when needed).

Documentation completely absent?

Hey there I couldn't help but notice that I can find absolutely zero documentation on this framework. It seems to be very nicely designed, but it's hard to actually use since I can't really find any information about the API at all beyond the sparsely commented sample projects.

QuadTree.RayCast nullpointer error

While using this library for a personal project I noticed that in Physics2D/Collision/QuadTree.cs line 240 sometimes returns a null-pointer exception, I believe the reason is that line 239 is supposed to be if (qt.IsPartitioned) instead of if (IsPartitioned) or at least that's how I fixed it.

MultiInstance / Multithreading Possibilities.

Dear Sir,
I for some physics calculations, I have implemented this library in Windows Class Library using .NetFramework 4.6.1. I don't need any UI so I have not inherited my class from the Game Class, instead I implemented necessary functions and I found its working fine perfectly in Single instance.
Now problem is I have lots of combinations for which calculations needs to be done, so I wrapped my code in parallel.foreach.
Here I have observed that most of the times it doesn't work as expected and doesn't solve some constraints. And for initial testing I am only executing 20 instances in parallel, which I may increase according to system CPU and ram Usage.
If I execute all 20 instances, one by one in a loop then they works perfectly.
So , What I am doing is Possible with this Library ?
here is a sample piece of code:
=> Few functions from DLL

	private void Constructor()
        {
            graphics = new GraphicsDeviceManager(game);
            game.Content.RootDirectory = "Content";
            game.IsMouseVisible = true;
            graphics.PreferredBackBufferWidth = commonClass.GAME_WIDTH;
            graphics.PreferredBackBufferHeight = commonClass.GAME_HEIGHT;
            graphics.ApplyChanges();
        }
 public void Initialize()
        {
            Camera = new Camera2D(game.GraphicsDevice, 25.0f);
            BatchEffect = new BasicEffect(game.GraphicsDevice);
            BatchEffect.VertexColorEnabled = true;
            BatchEffect.TextureEnabled = true;
            wld = new World();
            LoadContent();
            initComplete = true;
        }





public Tuple<bool, String> Update()
        {
            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
            st.Start();
            double lastMilis = 0;
            double milis = 0;
            while (true)
            {
                wld.Step((float)1.0f / 60.00f);
                milis = st.Elapsed.TotalMilliseconds;
                if (milis - lastMilis > 500)
                {                    
                    commonClass.checkAndProcessResults();
                    if (commonClass.simulationResults == NewSamples.Demos.CommonClass.SimulationResults.Success)
                    {
                        return new Tuple<bool, string>(true, "");
                    }
                    else if (commonClass.simulationResults == NewSamples.Demos.CommonClass.SimulationResults.Failed)
                    {
                        return new Tuple<bool, string>(false, "");
                    }
                    if (st.Elapsed.TotalSeconds > 15)
                    {
                        return new Tuple<bool, string>(true, "Timeout");
                    }
                    lastMilis = milis;
                }

            }

==> Code From the Windows Forms

System.Threading.Tasks.Parallel.ForEach(list, Sub(item)
                                                              Dim a As New AetherC.Class1(item.Item3.ToArray())
                                                              a.Initialize()
                                                              a.BlockInfo = $"{item.Item1}_{item.Item2}"
                                                              Dim res As Tuple(Of Boolean, String) = a.Update()
                                                              a.SaveImage($"C:\3dmodels\temp\{item.Item1}_{item.Item2}_{res.Item1}.jpg", item.Item1.ToString)
                                                          End Sub)

Update nuget

The current nuget version is from Thursday, December 27, 2018

Fix your default nuget package!

Don't set your DEFAULT nuget package as your alpha, you will break peoples projects. Almost broke my whole game trying to fix my monogame content pipeline errors. I had to completely disable Aether Physics.

how to get the contact point from TOI?

Hi,
I'm using TimeOfImpact.CalculateTimeOfImpact() to perform a shape-cast, which gives me back the TOI from which I can compute the position of my casting shape at the TOI.
But I'm also interested in the contact point/normal itself, and noticed the CalculateTimeOfImpact inline doc says to use Distance() to compute the contact point and normal at the time of impact... however I'm not sure what Distance() this is referring to, and I didn't find a particularly easy way to do this.

Best I managed was to use Distance.ComputeDistance(), but that seems super inefficient and redundant as it's already done by TimeOfImpact.CalculateTimeOfImpact(). Also, I'm not sure I'm handling all the cases in the same way as CalculateTimeOfImpact.

Is there a better way to do this?
And is there a reason CalculateTimeOfImpact doesn't output more info out of the box?

Thanks!

Hangs occasionally

Sometimes (non deterministic) the program hangs. I could trace the cause back to Dynamic Tree.cs method InsertLeaf line 644: index = _nodes[index].ParentOrNext; ParentOrNext had the same value as index and the while loop was never ending.

Objects not bouncing after collision.

In my Monogame project I can't get objects to bounce/separate after collision.
It's like restitution is not working. I use Aether.Physics2D.Diagnostics.MG vers. 1.6.1 and
Aether.Physics2D.Diagnostics.MG vers. 1.6.1 on Windows 11, Visual Studio 2019.

This is what I use to create my game objects:

       public  Body cueBall;
        World world = Game1.world;
   
     public CueBall()
        {
            cueBall = world.CreateCircle(Game1.BallBodyRadius, 1f, new Vector2(1000, 1000), BodyType.Dynamic);           
            cueBall.SleepingAllowed = false;           
            cueBall.Mass = 0.4f;
            cueBall.LinearDamping = 0.001f;
            cueBall.SleepingAllowed = false;
            cueBall.IsBullet = true;
            cueBall.Tag = "White";
            cueBall.FixtureList[0].Restitution = 1f;
            cueBall.FixtureList[0].CollisionCategories = Category.All;
        }

Can it be that Body. SetRestitution(float restitution) is obsolete?
I use cueBall.FixtureList[0].Restitution = 1f; instead.
I like to use this version, because the debugview is incuded and it is working great for scaling and placing objects.

I hope that Aether Phisics2D stays active for a long time, cause I love it!

Large World - Performance Optimizations

Hi Nikos,

I'm using R.U.B.E. to create world and load them into Aether.Physics2D. It's going well until I reach a couple hundred bodies and then it falls down to around 13fps, even with drawing disabled.

It's interesting, as in R.U.B.E.'s simulator it runs very nicely at 60fps. I wonder how R.U.B.E. is so much faster.

My aim is to create a HUGE physics world, with many thousands of bodies. I have multiplayer synchronization working with smaller worlds. I'm thinking I'll unload any bodies which aren't near to a player and represent them just with a single Vector2 placeholder. Every second or so I'll see if there are any placeholders within a player's interest area and load them up, or conversely, unload them if they've left.

That said, since even these couple hundred bodies are running slowly, more optimizations will be required. I plan on using dotTrace to profile and attempt some optimizations. However, before delving in myself, I wanted to reach out to you and see if you had any ideas or guidance. Also, would you be interested in collaborating with me in this effort of creating a HUGE game world? (I also plan on converting from floats to double or decimal to allow for solar-system-scale worlds. (https://stackoverflow.com/questions/50847019/farseer-box2d-increasing-max-world-size-by-using-doubles-or-decimals-rather)

Long post, apologies. Feel free to contact me directly on email, if it's easier: alundgren04 (at) gmail.

How to Draw on breakableBody parts

I found Breakablebody class and try to use it ,the breaken parts are triangle, Is there a way to draw sprites on breakableBody parts ?

Is this production ready?

Hi there,

I have been looking for a more up-to-date fork of the wonderful Farseer engine. Yours seems to be one of the best options, but before I migrate my game to use your engine instead of Farseer, I'd like to confirm that this is production ready to the best of your knowledge and what any possible issues may be, if any. Alternatively, are there any other Forks you would recommend I investigate?

Thank you!
Andrew

Using with System.Numerics vectors?

I'm thinking about using this library, possibly for future projects.

I have standardized all my libraries to target .NET Standard 2.1 and use System.Numerics vectors, allowing me to use the same types across all of them (and also providing a nice perf boost where SIMD instructions are supported ;) ).

I'm guessing (though I'd like confirmation) that the library should work perfectly fine if I fork it and just replace all the VectorX to System.Numerics.VectorX and fill in the missing methods.

Also, is there a place (such as a discord server or discussions page) where I can ask simple questions that aren't big enough as to open an issue?

The library looks really cool, looking forward to trying it out!

Weird collision behavior.

While playing with this library for a home-grown project, i stuck on a weird behavior.

Sometimes (but in consistent manner) one of collided bodies loses momentum on one of axises.

Debugging put me deep within Island.Solve() , but my math skills are far from what was needed for this task.

So i just put a reproducible example below.

        [TestMethod]
        public void TestReflectCollision()
        {
            var position = Vector2.One;
            var speed = Vector2.One * -10.6f;
            var dT = 0.0016666f;

            var world = new World(Vector2.Zero);

            var wall = world.CreateRectangle(2F, 20f, 1f, new Vector2(-1F, 10f));
            wall.SetRestitution(1);
            wall.SetFriction(0);
            wall.FixedRotation = true;
            wall.IsBullet = true;


            var ball = world.CreateCircle(0.51f, 1f, position, BodyType.Dynamic);
            ball.LinearVelocity = speed;
            ball.SetRestitution(1);
            ball.SetFriction(0);
            ball.FixedRotation = true;
            ball.IsBullet = true;

            world.Step(dT*28);
            Assert.IsTrue(ball.LinearVelocity.X < -10 && ball.LinearVelocity.Y < -10, ball.LinearVelocity.ToString());
            world.Step(dT);

            // this one fails; LinearVelocity.X is zero
            Assert.IsTrue(ball.LinearVelocity.X > 10 && ball.LinearVelocity.Y <-10, ball.LinearVelocity.ToString());
        }

Gist: https://gist.github.com/mjr27/a0d4b2d79caf9ed56fce0f929dcefaa4

Infinite loop/hang when bodies in the same position initially

Hey,

I am seeing an infinite loop in Aether. I believe it can be avoided by preventing two bodies from initially sharing the same location, but I am concerned about the presence of such a hang generally.

This is using a .NET standard 2.0 build of Aether. It is optimized. I do not see it happen with a debug build, or I have not yet. This is using two dynamic bodies. They each have one fixture in the shape of a square. They have velocity, angular velocity, and are rotated. When the objects share the same position or overlap significantly (I think), it locks up in the following code on this line:

            s = EdgeSeparation(poly1, ref xf1To2, edge, poly2);

This is the loop:

        // Perform a local search for the best edge normal.
        for (; ; )
        {
            if (increment == -1)
                edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
            else
                edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0;

            s = EdgeSeparation(poly1, ref xf1To2, edge, poly2);

            if (s > bestSeparation)
            {
                bestEdge = edge;
                bestSeparation = s;
            }
            else
            {
                break;
            }
        }

Note that because this is a release build, more detail is not available. The trace for Aether is here ( I removed the prefix for readability):

.Collision.Collision.FindMaxSeparation(out int edgeIndex, .Shapes.PolygonShape poly1, ref Transform xf1, .Shapes.PolygonShape poly2, ref Transform xf2) Unknown
.Collision.Collision.CollidePolygons(ref .Manifold manifold, .Shapes.PolygonShape polyA, ref Transform transformA, .Shapes.PolygonShape polyB, ref Transform transformB) Unknown
.Dynamics.Contacts.Contact.Evaluate(ref .Manifold manifold, ref Transform transformA, ref Transform transformB) Unknown
.Dynamics.Contacts.Contact.Update(tainicom.Aether.Physics2D.Dynamics.ContactManager contactManager) Unknown
.Dynamics.ContactManager.Collide() Unknown
.Dynamics.World.Step(float dt, ref tainicom.Aether.Physics2D.Dynamics.SolverIterations iterations) Unknown
.Dynamics.World.Step(float dt) Unknown

Here is the available state info:

edgeIndex	0	int
	
poly1	{Collision.Shapes.PolygonShape}	Collision.Shapes.PolygonShape
	ChildCount	1	int
	Density	4.5	float
	MassData	{Collision.Shapes.MassData}	Collision.Shapes.MassData
	Normals	Count = 4 Vertices = "{X:0.7071068 Y:0.7071068} {X:-0.7071068 Y:0.7071068} {X:-0.7071068 Y:-0.7071068} {X:0.7071068 Y:-0.7071068}"	Vertices
	Radius	0.01	float
	ShapeType	Polygon	Collision.Shapes.ShapeType
	Vertices	Count = 4 Vertices = "{X:0.09375 Y:0} {X:0 Y:0.09375} {X:-0.09375 Y:0} {X:0 Y:-0.09375}"	Vertices
	_2radius	0	float
	_density	4.5	float
	_normals	Count = 4 Vertices = "{X:0.7071068 Y:0.7071068} {X:-0.7071068 Y:0.7071068} {X:-0.7071068 Y:-0.7071068} {X:0.7071068 Y:-0.7071068}"	Vertices
	_radius	0.01	float
	_vertices	Count = 4 Vertices = "{X:0.09375 Y:0} {X:0 Y:0.09375} {X:-0.09375 Y:0} {X:0 Y:-0.09375}"	Vertices

	
poly2	{Collision.Shapes.PolygonShape}	Collision.Shapes.PolygonShape
	ChildCount	1	int
	Density	4.5	float
	MassData	{Collision.Shapes.MassData}	Collision.Shapes.MassData
	Normals	Count = 4 Vertices = "{X:0.7071068 Y:0.7071068} {X:-0.7071068 Y:0.7071068} {X:-0.7071068 Y:-0.7071068} {X:0.7071068 Y:-0.7071068}"	Vertices
	Radius	0.01	float
	ShapeType	Polygon	Collision.Shapes.ShapeType
	Vertices	Count = 4 Vertices = "{X:0.09375 Y:0} {X:0 Y:0.09375} {X:-0.09375 Y:0} {X:0 Y:-0.09375}"	Vertices
	_2radius	0	float
	_density	4.5	float
	_normals	Count = 4 Vertices = "{X:0.7071068 Y:0.7071068} {X:-0.7071068 Y:0.7071068} {X:-0.7071068 Y:-0.7071068} {X:0.7071068 Y:-0.7071068}"	Vertices
	_radius	0.01	float
	_vertices	Count = 4 Vertices = "{X:0.09375 Y:0} {X:0 Y:0.09375} {X:-0.09375 Y:0} {X:0 Y:-0.09375}"	Vertices


count1	4	int
edge	0	int
bestEdge	3	int
increment	1	int

Any thoughts? The world is conditioned with a ratio of 128 physics units to 1 pixel.

How to use DebugView?

Hey! We are currently using Aether as our physics engine and I'm trying to figure out how to make the DebugView work. Essentially we create a world with a bunch of bodies and pass our world to the Debugview and then we load the content and use RenderDebugData in our draw function:

DebugView DebugView = new DebugView(World); DebugView.LoadContent(gameInstance.GraphicsDevice, gameInstance.Content);

Now DebugView complains that we don't have the DiagnosticsFont in our ContentManager. I added it to our Content but I dont think thats how its supposed to work?

We then try to draw the DebugView in our draw function with:
DebugView.RenderDebugData(projection, view);

It runs but we don't see any difference. Any help is appreciated!

(We use the tainicom.Aether.Physics2D.Diagnostics.MG NuGet package (along with the normal MG package) if that makes a difference.)

How to use Physics2DImporters

Hi there, I am relatively new to monogame so apologies for the noob question. I was wondering how to setup the Physics2DImporters with the monogame content builder. I believe I need to add a reference to my content settings to a dll, but to which dll?

Extensive code duplication in ContactManager.cs -- any plan to reduce it?

I noticed ContactManager.cs has two methods:
Collide() -- inherited from Farseer
CollideMultiCore() -- added in Aether

I understand this change was to facilitate the multi-threaded optimization, but having so much nearly identical code duplicated is a maintainability issue. I imagine there is a way to refactor it to re-use the similar collide logic, which accounts for something like 90% of the internal code of each method.

Using the Monogame (XNA) version as source code

Is it possible to use the Monogame version as source code? My use case is serializing with MessagePack. Tried to copy the source code from the Physics2D folder and add the build constants LEGACY_ASYNCADDREMOVE;XNAAPI;WINDOWS;MG;NET40 but still there are 700+ errors related to the tainicom and XNA vectors.

tainicom.Aether.Physics2D.Common.Vector2

I updated the nuget package to 1.6.1
after that, Vector2 type is type tainicom.Aether.Physics2D.Common.Vector2 instead of Microsoft.Xna.Framework.Vector2
I tried to changed the type, but
spriteBatch.Draw(Animation.Texture, [playerBody.Position], source, Color.White, playerBody.Rotation, Origin, scale, spriteEffects, 0.0f);
playerBody.Position is [Physics2D] Common.Vector2 while here require Xna.Framework.Vector2
what is the best way to resolve this if i want to use higher version of this package, implement a convertor?

Requesting advice for porting from Farseer.3.5.

Hi!

I'm attempting to port this code from Farseer.3.5 physics (https://github.com/bryanedds/Nu/blob/master/Nu/Nu/Physics.fs).

However, Aether seems to be missing a few items compared to the last version of Farseer -

  1. There's no UserData field on the Fixtures any more. I need this to correlate events on fixtures back to my scene graph.

  2. Friction, Restitution, GravityScale, CollisionCategories, CollidesWith, and IsSensor setters are all missing on the Body class. Is there an alternate way to configure these items?

  3. The BodyFactory and FixtureFactories functions are all gone. I used these a lot. Is there a recommended alternative?

I fixed some of the errors in a branch here (https://github.com/bryanedds/Nu/tree/aether), but several remain. Any concrete advice you could give me on porting this stuff would be quite appreciated!

  • Bryan

Change debug color by Collision Category

Many of my bodies are sensors which encompass much of the screen and overlap pretty much everything in the viewport. When drawing in debug mode, it makes it impossible to see any other useful information on the layers below it. It would be very helpful if there was an option to set individual colors (such as transparent) for some of the categories. Would this be possible?

Question - quick overlap detection

Hi,

Firstly, great thanks for the engine. It's saved my poor soul from hours of "figuring stuff out", and performs great in my current projects. Anyway, being terrible at finding documentation, here's my question: what's the most efficient way for checking whether two bodies overlap? I had been copying shapes and translating them, but those seem to demand heavy calculations from the engine. Is there a more straightforward way?

Thank you for your time!

Assertion Failed At samples.WINDOWS.MG AdvancedDemo1,5

version
git clone origin/master
git clone from commit 830cdbd
last pull at commit 8c53539

error
Assertion Failed

info
Samples.WINDOWS.MG / Advanced Samples

  • Texture to vertices / advancedDemo1.cs
  • breakable bodies and expolsions / advancedDemo5.cs

\Aether.Physics2D\Physics2D\Common\Decomposition\BayazitDecomposer.cs
line34: Debug.Assert(vertices.IsCounterClockWise());

Spawning coordinate of Body

Hello Tainicom,

I am using your physics engine to do a project by combining with it a graphics library.

I have a problem:

When I define the position of the body, it doesn't match with the coordinate given.
Let me explain more in details: I gave some coordinates to the position attribute of Body and the same coordinates to my graphics library. Result ? Spawning point of the graphics library is on the top left corner and the spawning point of Aether.Physics2D is in the center. So I have a hitbox shift every time.

I would like to know if it's possible to change the spawning point of Aether.Physics2D to the top left corner, if it changes things in physics engine running and how it's possible.

I really appreciate your physics engine, it's working well associate to my personal project.

I thank you in advance for your help and wish you a good day !

Hardkaise

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.