Giter Club home page Giter Club logo

dmnsgn / primitive-geometry Goto Github PK

View Code? Open in Web Editor NEW
96.0 3.0 7.0 48.03 MB

Geometries for 3D rendering, including normals, UVs and cell indices (faces). Perfect if you want to supercharge your dependency folder... with 30KB of geometries.

Home Page: https://dmnsgn.github.io/primitive-geometry/

License: MIT License

HTML 0.13% JavaScript 99.87%
simplicial-complex geometry primitive mesh glsl stackgl webgl gl quad plane cube cylinder cone capsule sphere icosphere ellipsoid torus box circle

primitive-geometry's Introduction

primitive-geometry

npm version stability-stable npm minzipped size dependencies types Conventional Commits styled with prettier linted with eslint license

Geometries for 3D rendering, including normals, UVs and cell indices (faces). Perfect if you want to supercharge your dependency folder... with 30KB of geometries.

paypal coinbase twitter

Installation

npm install primitive-geometry

Features

  • Common API: options object in, simplicial complex out
  • Outputs TypedArray (Float32Array for geometry data and Uint8Array|Uint16Array|Uint32Array for cells)
  • Zero dependency
  • Same parameters naming: radius (or rx/ry/rz), scale (or height/sx/sy/sz), segments (or nx/ny/nz) and a few specific parameters for icosphere/cylinder/cone/torus.
  • Different Elliptical mappings: see the comparison images and the demo.

See difference with v1 here.

Usage

See the example and its source.

import Primitives from "primitive-geometry";

const quadGeometry = Primitives.quad({
  scale: 0.5,
});
console.log(quadGeometry);
// {
//   positions: Float32Array [x, y, z, x, y, z,  ...],
//   normals: Float32Array [x, y, z, x, y, z, ...]
//   uvs: Float32Array [u, v, u, v, ...],
//   cells: Uint8/16/32/Array [a, b, c, a, b, c, ...],
// }
const planeGeometry = Primitives.plane({
  sx: 1,
  sy: 1,
  nx: 1,
  ny: 1,
  direction: "z",
  quads: false,
});
const roundedRectangleGeometry = Primitives.roundedRectangle({
  sx: 1,
  sy: 1,
  nx: 1,
  ny: 1,
  radius: 0.25,
  roundSegments: 8,
  edgeSegments: 1,
});
const stadiumGeometry = Primitives.stadium({
  sx: 1,
  sy: 0.5,
  nx: 1,
  ny: 1,
  roundSegments: 8,
  edgeSegments: 1,
});

const ellipseGeometry = Primitives.ellipse({
  sx: 1,
  sy: 0.5,
  radius: 0.5,
  segments: 32,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  mapping: mappings.elliptical,
});
const disc = Primitives.disc({
  radius: 0.5,
  segments: 32,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  mapping: mappings.concentric,
});
const superellipse = Primitives.superellipse({
  sx: 1,
  sy: 0.5,
  radius: 0.5,
  segments: 32,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  mapping: mappings.lamé,
  m: 2,
  n: 2,
});
const squircle = Primitives.squircle({
  sx: 1,
  sy: 1,
  radius: 0.5,
  segments: 128,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  mapping: mappings.fgSquircular,
  squareness: 0.95,
});
const annulus = Primitives.annulus({
  radius: 0.5,
  segments: 32,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  innerRadius: 0.25,
  mapping: mappings.concentric,
});
const reuleux = Primitives.reuleux({
  radius: 0.5,
  segments: 32,
  innerSegments: 16,
  theta: Math.PI * 2,
  thetaOffset: 0,
  mapping: mappings.concentric,
  n: 3,
});

const cubeGeometry = Primitives.cube({
  sx: 1,
  sy: 1,
  sz: 1,
  nx: 1,
  ny: 1,
  nz: 1,
});
const roundedCubeGeometry = Primitives.roundedCube({
  sx: 1,
  sy: 1,
  sz: 1,
  nx: 1,
  ny: 1,
  nz: 1,
  radius: 0.25,
  roundSegments: 8,
  edgeSegments: 1,
});

const sphereGeometry = Primitives.sphere({
  radius: 0.5,
  nx: 32,
  ny: 16,
  theta: Math.PI,
  thetaOffset: 0,
  phi: Math.PI * 2,
  phiOffset: 0,
});
const icosphereGeometry = Primitives.icosphere({
  radius: 0.5,
  subdivisions: 2,
});
const ellipsoidGeometry = Primitives.ellipsoid({
  radius: 1,
  nx: 32,
  ny: 16,
  rx: 0.5,
  ry: 0.25,
  rz: 0.25,
  theta: Math.PI,
  thetaOffset: 0,
  phi: Math.PI * 2,
  phiOffset: 0,
});

const cylinderGeometry = Primitives.cylinder({
  height: 1,
  radius: 0.25,
  nx: 16,
  ny: 1,
  radiusApex: 0.25,
  capSegments: 1,
  capApex: true,
  capBase: true,
  capBaseSegments: 1,
  phi: Math.PI * 2,
});
const coneGeometry = Primitives.cone({
  height: 1,
  radius: 0.25,
  nx: 16,
  ny: 1,
  capSegments: 1,
  capBase: true,
  theta: Math.PI * 2,
});
const capsuleGeometry = Primitives.capsule({
  height: 0.5,
  radius: 0.25,
  nx: 16,
  ny: 1,
  roundSegments: 16,
  theta: Math.PI * 2,
});
const torusGeometry = Primitives.torus({
  radius: 0.4,
  segments: 64,
  minorRadius: 0.1,
  minorSegments: 32,
  theta: Math.PI * 2,
  thetaOffset: 0,
  phi: Math.PI * 2,
  phiOffset: 0,
});

const tetrahedron = Primitives.tetrahedron({
  radius: 0.5,
});
const icosahedron = Primitives.icosahedron({
  radius: 0.5,
});

// without normals/uvs
const boxGeometry = Primitives.box({
  sx: 1,
  sy: 1,
  sz: 1,
});
const circleGeometry = Primitives.circle({
  radius: 0.5,
  segments: 32,
  closed: false,
  theta: Math.PI * 2,
  thetaOffset: 0,
});

API

Modules

index

Re-export all geometries, UV mappings functions and utils.

annulus
box
capsule
circle
cone
cube
cylinder
disc
ellipse
ellipsoid
icosahedron
icosphere
mappings
plane
quad
reuleux
roundedCube
roundedRectangle
sphere
squircle
stadium
superellipse
tetrahedron
torus
utils

Typedefs

BasicSimplicialComplex : object

Geometry definition without normals and UVs.

SimplicialComplex : object

Geometry definition.

index

Re-export all geometries, UV mappings functions and utils.

annulus

annulus([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] AnnulusOptions {}

annulus~AnnulusOptions : object

Kind: inner typedef of annulus Properties

Name Type Default
[radius] number 0.5
[segments] number 32
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[innerRadius] number radius * 0.5
[mapping] function mappings.concentric

box

box([options]) ⇒ BasicSimplicialComplex

Kind: Exported function

Param Type Default
[options] BoxOptions {}

box~BoxOptions : object

Kind: inner typedef of box Properties

Name Type Default
[sx] number 1
[sy] number sx
[sz] number sx

capsule

capsule([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] CapsuleOptions {}

capsule~CapsuleOptions : object

Kind: inner typedef of capsule Properties

Name Type Default
[height] number 0.5
[radius] number 0.25
[nx] number 16
[ny] number 1
[roundSegments] number 32
[phi] number TAU

circle

circle([options]) ⇒ BasicSimplicialComplex

Kind: Exported function

Param Type Default
[options] CircleOptions {}

circle~CircleOptions : object

Kind: inner typedef of circle Properties

Name Type Default
[radius] number 0.5
[segments] number 32
[theta] number TAU
[thetaOffset] number 0
[closed] boolean false

cone

cone([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] ConeOptions {}

cone~ConeOptions : object

Kind: inner typedef of cone Properties

Name Type Default
[height] number 1
[radius] number 0.25
[nx] number 16
[ny] number 1
[capSegments] number 1
[capBase] boolean true
[phi] number TAU

cube

cube([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] CubeOptions {}

cube~CubeOptions : object

Kind: inner typedef of cube Properties

Name Type Default
[sx] number 1
[sy] number sx
[sz] number sx
[nx] number 1
[ny] number nx
[nz] number nx

cylinder

cylinder([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] CylinderOptions {}

cylinder~CylinderOptions : object

Kind: inner typedef of cylinder Properties

Name Type Default
[height] number 1
[radius] number 0.25
[nx] number 16
[ny] number 1
[radiusApex] number radius
[capSegments] number 1
[capApex] boolean true
[capBase] boolean true
[phi] number TAU

disc

disc([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] DiscOptions {}

disc~DiscOptions : object

Kind: inner typedef of disc Properties

Name Type Default
[radius] number 0.5
[segments] number 32
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[mapping] function mappings.concentric

ellipse

ellipse([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] EllipseOptions {}

ellipse~EllipseOptions : object

Kind: inner typedef of ellipse Properties

Name Type Default
[sx] number 1
[sy] number 0.5
[radius] number 0.5
[segments] number 32
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[mapping] function mappings.elliptical

ellipsoid

ellipsoid([options]) ⇒ SimplicialComplex

Default to an oblate spheroid.

Kind: Exported function

Param Type Default
[options] EllipsoidOptions {}

ellipsoid~EllipsoidOptions : object

Kind: inner typedef of ellipsoid Properties

Name Type Default
[radius] number 0.5
[nx] number 32
[ny] number 16
[rx] number 1
[ry] number 0.5
[rz] number ry
[theta] number Math.PI
[thetaOffset] number 0
[phi] number TAU
[phiOffset] number 0

icosahedron

icosahedron([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] IcosahedronOptions {}

icosahedron~IcosahedronOptions : object

Kind: inner typedef of icosahedron Properties

Name Type Default
[radius] number 0.5

icosphere

icosphere([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] IcosphereOptions {}

icosphere~IcosphereOptions : object

Kind: inner typedef of icosphere Properties

Name Type Default
[radius] number 0.5
[subdivisions] number 2

mappings

plane

plane([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] PlaneOptions {}

plane~PlaneOptions : object

Kind: inner typedef of plane Properties

Name Type Default
[sx] number 1
[sy] number sx
[nx] number 1
[ny] number nx
[direction] PlaneDirection "z"
[quads] boolean false

plane~PlaneDirection : "x" | "-x" | "y" | "-y" | "z" | "-z"

Kind: inner typedef of plane

quad

quad([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] QuadOptions {}

quad~QuadOptions : object

Kind: inner typedef of quad Properties

Name Type Default
[scale] number 0.5

reuleux

reuleux([options]) ⇒ SimplicialComplex

Kind: Exported function See: Parametric equations for regular and Reuleaux polygons

Param Type Default
[options] ReuleuxOptions {}

reuleux~ReuleuxOptions : object

Kind: inner typedef of reuleux Properties

Name Type Default
[radius] number 0.5
[segments] number 32
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[mapping] function mappings.concentric
[n] number 3

roundedCube

roundedCube([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] RoundedCubeOptions {}

roundedCube~RoundedCubeOptions : object

Kind: inner typedef of roundedCube Properties

Name Type Default
[sx] number 1
[sy] number sx
[sz] number sx
[nx] number 1
[ny] number nx
[nz] number nx
[radius] number sx * 0.25
[roundSegments] number 8
[edgeSegments] number 1

roundedRectangle

roundedRectangle([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] RoundedCubeOptions {}

roundedRectangle~RoundedCubeOptions : object

Kind: inner typedef of roundedRectangle Properties

Name Type Default
[sx] number 1
[sy] number sx
[nx] number 1
[ny] number nx
[radius] number sx * 0.25
[roundSegments] number 8
[edgeSegments] number 1

sphere

sphere([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] SphereOptions {}

sphere~SphereOptions : object

Kind: inner typedef of sphere Properties

Name Type Default
[radius] number 0.5
[nx] number 32
[ny] number 16
[theta] number Math.PI
[thetaOffset] number 0
[phi] number TAU
[phiOffset] number 0

squircle

squircle([options]) ⇒ SimplicialComplex

Fernández-Guasti squircle

Kind: Exported function See: Squircular Calculations – Chamberlain Fong

Param Type Default
[options] SquircleOptions {}

squircle~SquircleOptions : object

Kind: inner typedef of squircle Properties

Name Type Default Description
[sx] number 1
[sy] number 1
[radius] number 0.5
[segments] number 128
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[mapping] function mappings.fgSquircular
[squareness] number 0.95 Squareness (0 < s <= 1)

stadium

stadium([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] StadiumOptions {}

stadium~StadiumOptions : object

Kind: inner typedef of stadium Properties

Name Type Default
[sx] number 1
[sy] number sx
[nx] number 1
[ny] number nx
[roundSegments] number 8
[edgeSegments] number 1

superellipse

superellipse([options]) ⇒ SimplicialComplex

Lamé curve See elliptical-mapping example for a few special cases

Kind: Exported function See

Param Type Default
[options] SuperellipseOptions {}

superellipse~SuperellipseOptions : object

Kind: inner typedef of superellipse Properties

Name Type Default
[sx] number 1
[sy] number 0.5
[radius] number 0.5
[segments] number 32
[innerSegments] number 16
[theta] number TAU
[thetaOffset] number 0
[mapping] function mappings.lamé
[m] number 2
[n] number m

tetrahedron

tetrahedron([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] TetrahedronOptions {}

tetrahedron~TetrahedronOptions : object

Kind: inner typedef of tetrahedron Properties

Name Type Default
[radius] number 0.5

torus

torus([options]) ⇒ SimplicialComplex

Kind: Exported function

Param Type Default
[options] TorusOptions {}

torus~TorusOptions : object

Kind: inner typedef of torus Properties

Name Type Default
[radius] number 0.4
[segments] number 64
[minorRadius] number 0.1
[minorSegments] number 32
[theta] number TAU
[thetaOffset] number 0
[phi] number TAU
[phiOffset] number 0

utils

utils.TAU : number

Two times PI.

Kind: static constant of utils

utils.HALF_PI : number

Two times PI.

Kind: static constant of utils

utils.SQRT2 : number

Square root of 2.

Kind: static constant of utils

utils.getCellsTypedArray ⇒ Uint8Array | Uint16Array | Uint32Array

Select cells typed array from a size determined by amount of vertices.

Kind: static constant of utils See: MDN TypedArray objects

Param Type Description
size number The max value expected

utils.normalize(v) ⇒ Array.<number>

Normalize a vector 3.

Kind: static method of utils Returns: Array.<number> - Normalized vector

Param Type Description
v Array.<number> Vector 3 array

utils.checkArguments(...args)

Ensure first argument passed to the primitive functions is an object

Kind: static method of utils

Param Type
...args *

utils.setTypedArrayType(type)

Enforce a typed array constructor for cells

Kind: static method of utils

Param Type
type Class.<Uint8Array> | Class.<Uint16Array> | Class.<Uint32Array>

BasicSimplicialComplex : object

Geometry definition without normals and UVs.

Kind: global typedef Properties

Name Type
positions Float32Array
cells Uint8Array | Uint16Array | Uint32Array

SimplicialComplex : object

Geometry definition.

Kind: global typedef Properties

Name Type
positions Float32Array
normals Float32Array
uvs Float32Array
cells Uint8Array | Uint16Array | Uint32Array

License

See original packages used in v1:

Differences with v1:

  • use 3D positions for circle
  • base disc on ellispse and add inner segments
  • fix cylinder orientation and uvs
  • fix icosphere uvs (based on: https://github.com/mourner/icomesh)
  • fix quad normal to +z
  • fix subdivision for rounded geometries (rounded-cube and capsule)
  • uniformise api and internal names
  • use options object
  • remove gl-matrix/pex-math and icosphere dependencies
  • use only trigonometric operation, no matrix transformation
  • base sphere on ellispsoid
  • add cone based on cylinder
  • use flat typed arrays
  • defaults produce geometries contained in a unit bbox
  • add jsdoc, prettier, eslint via snowdev

MIT. See license file.

primitive-geometry's People

Contributors

dmnsgn avatar greenkeeper[bot] 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

Watchers

 avatar  avatar  avatar

primitive-geometry's Issues

Add default params to README.md and example

It would be nice to have compact list of all the functions and their params

I'll work on proper PR as autogenerated dump is missing some values

quad({ scale = 0.5 )
plane({ sx = 1, sy = sx, nx = 1, ny = nx )q
cube({ sx = 1, sy = sx, sz = sx, nx = 1, ny = nx, nz = nx )
roundedCube({  sx = 1,  sy = sx,  sz = sx,  nx = 16,  ny = nx,  nz = nx,  radius = sx * 0.25,)
cylinder({  height = 1,  radius = 0.25,  nx = 16,  ny = 1,  radiusApex = radius,  capSegments = 1,  capApex = true,  capBase = true,)
cone({ height, radius, nx, ny, capSegments, capBase )
capsule({ height = 0.5, radius = 0.25, nx = 16, ny = 32 )
sphere({ radius = 0.5, nx = 32, ny = 16 )
icosphere({ radius = 0.5, subdivisions = 2 )
ellipsoid({  radius = 1,  nx = 32,  ny = 16,  rx = 0.5,  ry = 0.25,  rz = ry,)
torus({  radius = 0.3,  segments = 64,  minorRadius = 0.1,  minorSegments = 32,  arc = _utils_js__WEBPACK_IMPORTED_MODULE_0__.TAU,)
box({ sx = 1, sy = sx, sz = sx )
circle({ radius = 0.5, segments = 32 )

An in-range update of browserify is breaking the build 🚨

The devDependency browserify was updated from 16.3.0 to 16.4.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

browserify is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build could not complete due to an error (Details).

Commits

The new version differs by 5 commits.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

export tangent vector

Would be a nice help to have this in the generated data so that it can be used more directly with normal maps etc.

Probably unrelated, but when I try to use the gltf-spec implementation to compute it in the fragment shader, using the supplied vertices, normals, and uvs, I end up with a bump at the sphere poles:

Happened with other libs too though, probably not a bug here, just another motivation why it would be cool to have it baked in, maybe passing the tangent down will magically make my problem disappear ;)

image

Proposal: log a warning if first provided option is not an object

When using with old code that uses parameters instead of options object all functions fail silently as all parameters deconstruct to undefined. This is very hard to debug as all returned data is valid just always contains default mesh.

As those functions are used sparingly (i.e. not every frame usually) consider issuing console.warn('Using parameters is deprecated, please use options object instead') on invalid use to ease transition.

An in-range update of dat.gui is breaking the build 🚨

The devDependency dat.gui was updated from 0.7.5 to 0.7.6.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

dat.gui is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build could not complete due to an error (Details).

Commits

The new version differs by 3 commits.

  • c2edd82 0.7.6
  • 39facfd Bump docs.
  • d979883 Added hide/show functions to GUI instances to complement open/close

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on Greenkeeper branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because it uses your CI build statuses to figure out when to notify you about breaking changes.

Since we didn’t receive a CI status on the greenkeeper/initial branch, it’s possible that you don’t have CI set up yet. We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

If you have already set up a CI for this repository, you might need to check how it’s configured. Make sure it is set to run on all new branches. If you don’t want it to run on absolutely every branch, you can whitelist branches starting with greenkeeper/.

Once you have installed and configured CI on this repository correctly, you’ll need to re-trigger Greenkeeper’s initial pull request. To do this, please click the 'fix repo' button on account.greenkeeper.io.

Clarify that sx is actually rx

When specifying cube or plane with sx:1 we are creating 2x2x2 cube not 1x1x1 cube. Therefore sx is closer to rx. I know that is consistent with primitive-* modules but would be good to clarify that. Especially that default values are 1 not 0.5.

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.