Giter Site home page Giter Site logo

web-ifc-viewer's Introduction

ifc.js | documentation | demo | discord | usage example | npm package

THIS LIBRARY IS DEPRECATED. USE COMPONENTS INSTEAD

web-ifc-viewer

npm opencollective

This library is an extension of web-ifc-three, which is the official IFCLoader for THREE.js. This doesn't only parse and generate the Three.js geometry of IFC models in JavaScript, but also provides multiple tools to easily build BIM tools, such as 3d dimensions, clipping planes, 2D plan navigation and generation, etc.

Status

web-ifc-viewer offers multiple tools to create awesome BIM tools in no time. While the tools are quite stable, the state of this repository is tightly coupled with the state of web-ifc-three and web-ifc.

Check out their README files to better understand where the project currently is.

Demo

Test IFC.js Web IFCviewer with your IFC models in our online Demo

Documentation

Check out our official docs for API reference, guides and tutorials.

Install

npm install web-ifc-viewer or yarn add web-ifc-viewer

Quick setup

First, create a JavaScript file that imports the library and creates a scene:

import { IfcViewerAPI } from 'web-ifc-viewer';

const container = document.getElementById('viewer-container');
const viewer = new IfcViewerAPI({ container });
viewer.axes.setAxes();
viewer.grid.setGrid();

const input = document.getElementById("file-input");

input.addEventListener("change",

  async (changed) => {
   
    const file = changed.target.files[0];
    const ifcURL = URL.createObjectURL(file);
    viewer.IFC.loadIfcUrl(ifcURL);
  },

  false
);

You can bundle this file using any bundler. This is an example configuration file using rollup:

import resolve from '@rollup/plugin-node-resolve';

export default {
  input: 'index.js',
  output: {
    file: "bundle.js",
    format: 'esm'
  },
  plugins: [ resolve() ]
};

Now you display it in an HTML page like this:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="icon" type="image/png" href="./favicon.ico" />
    <link rel="preconnect" href="https://fonts.gstatic.com" />
    <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet" />
    <link rel="stylesheet" type="text/css" href="./styles.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>IFC.js</title>
  </head>
  <body>
    <input type="file" id="file-input" accept=".ifc, .ifcXML, .ifcZIP">
    <div id="viewer-container"></div>
    <script src="./bundle.js"></script>
  </body>
</html>

Content

This project consists of the following folders:

  • viewer: contains the source code.

  • example: contains one example of how to use the library.

Contributing

Want to help out? Great!

Please checkout our contribution suggestsions or speak to us directly in Discord.

web-ifc-viewer's People

Contributors

agviegas avatar aka-blackboots avatar apemann avatar bragamat avatar brifitz avatar cptpiepmatz avatar craigliesinger avatar d4ve-r avatar eng-luciano-julien avatar gp4ck avatar harrycollin avatar jmcouffin avatar jvdmbgdd avatar lmeow avatar mikhailmtion avatar mudin avatar pablo-mayrgundter avatar quimmoya avatar sanzoghenzo avatar sinsunsan avatar tiberiog avatar tonyk24 avatar vegarringdal avatar zegeri 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

web-ifc-viewer's Issues

Geometry optimization

By "optimization" I am not talking about how fast the scene loads, but to be able to handle scenes with hundreds or thousands of objects with no lag.

Right know, the library is creating all objects in the scene and parenting everything to an Object3D, allowing the users to easily add everything to the scene. Nonetheless, this is not the best approach, as we will be facing really big files. There are some reference about making scenes perform better here. Any ideas regarding this will be helpful.

How to load multiple files

i have multiple files coming out of my Revit file for different treads and all of them share the same coordination point, is it possible to modify the code to load more than one model into the viewer?

Parser doesnt handle empty IFCTEXT marker

When loading file that contains line like :
#73 = IFCPROPERTYSINGLEVALUE('BO_links', 'Links', IFCTEXT(''), $);
parsing fails because IFCTEXT is empty.
Have tried to find a fix but the way chevrotain.js is working is not easy to understand ! ;-)

I would like to contribute

Hi!! Just got to know about the project.
I'm an architect from Brazil, 9 years BIM Manager in construction companies and designers offices.

I am just starting a Master in Adavanced Computation for Architecture and Design, got to learn a few javascrip, and how to use three.js, mostly for grasshopper files (with the appserver). Probably can't help with the coding, but maybe testing.
I have a lot of IFC data, and I am very interested in watch the project development.

Please let me know if I could be of any help.

Tks!
Babi Villanova

cannot load *.ifc file

While file loading, the function: getRepresentationValue(product) gets invoked, whereas the passed product=34 is. This leads to an issue:
Uncaught TypeError: Cannot read property 'value' of undefined at getRepresentationValue (geometry-mapper.js:32) at getRepresentations (geometry-mapper.js:23) at geometry-mapper.js:17 at Array.forEach (<anonymous>) at constructGeometry (geometry-mapper.js:16) at buildGeometry (converter.js:6) at main (index.js:11) at FileReader.reader.onload (ifc-file-reader.js:18)
since the product should not be just a number but:
product[n.geomRepresentations] = product[n.representation][t.value][n.representations][t.value]; }
Thanks for helping.

Support for IFC 4

Hi, I would like to use your lib but we need to work with IFC 4 files. What would it take to support IFC 4?

Split model to layers

Hi,
can I split ifc model by his layers?
My meaning is to see for example a house model without his top layer (his roof)

Scene clearing and disposal

I'd like to be able to reuse the web-ifc-viewer to view multiple IFCs over time.

There's currently no API to clear the scene to ready it for a new load. So the simple ask is to just support that.

Additionally to avoid memory leaks over time, there's some work to be done to release all resources associated with the scene:

The memory leaks are less important for me than having the basic functionality.

More discussion:
https://discord.com/channels/799990228336115742/841028162808971264/901585279121498172

Make extrusions faster

Following the Brep algorithm optimization using buffer geometries, I now want to generate all extrusions using buffer geometries. As said, this will make the geometry generation way easier (all the three logic will be contained in one single, short and mantainable file) and faster. First try with rectangle extrussions:

image

This wall looks similar to the previous rectangular extrussions, but is generated approx. 4 times faster:

image

This might not look like much in milliseconds, but once we generate all geometries with buffer geometries, the speed improvement will be certainly noticeable (around 5 times faster at least). Also, keep in mind that this is the simplest type of extrussion; more complex extrusions will have more drastic time reductions.

BoundingBox: TypeError: geometryMap[type] is not a function

Btw, awesome project! The OSArch community has written a news article about your project! https://osarch.org/2020/12/21/a-new-browser-ifc-viewer-is-released-in-ifc-js/

I see this error in the console when I try to load a small file (the file doesn't load):

geometry-map.js:23 Error with item IfcWallStandardCase of type BoundingBox: TypeError: geometryMap[type] is not a function

I can email you the file for private debugging?

2020-12-22-134711_783x298_scrot

There's a bunch of other errors which may or may not be related:

2020-12-22-134853_458x546_scrot
2020-12-22-134843_638x543_scrot

Improve the docs

The docs are a very important part of this project. They help spread the interest about the project, getting more users and contributors. Any help developint the HTML / CSS / JS / other code to make them responsive, informative and attractive will be welcomed.

Camera "zoom to all" target center of pysical model upon IFC import

Hi

I am looking for a way that would move the camera to "zoom to all" (target the volumetric center of imported elements) and use that as a Orbitcontrol center upon import of IFC. This would make life a lot easier when it comes to viewing our IFC models that have a coordinate system that starts on a particular elevation. It should be noted that our exported model units are by default in millimeters. I've tried to follow a couple of examples I found online, but I am definitively doing this wrong.

I tried to modify example "00" by simply adding the following snippet of code to the "pick()" method in the "scene-picker.js" file in order to find a way to move the camera to the object I am clicking on. Note that I have little experience with threejs, so I might be violating some basic rules :)

...
pickedObject.material = pickedObjectMaterial;
console.log(pickedObject._Data);

// Code for setting camera target to picked object
var target = pickedObject.geometry.boundingSphere.center;

console.log(target);

//camera.position.set(target);
camera.position.set(target+new THREE.Vector3(10,10,10));
camera.lookAt(new THREE.Vector3(target));
//camera.updateProjectionMatrix();

When I click on a beam (floating in the middle of nowhere as shown below) I end up apparently lost in space :)

image

All I see is the grey background and I am unable to see my beam and I've lost sight of the grid making it difficult to figure out where I am :(

image

The updated camera does however seem to be corrupt or broken in some (as shown in the console logging of the "camera"displaying NA values in the x,y,z coordinates)

image

I might be way off here, so it is much appreciated if anyone have any suggestions on where I ought to be looking or guidance on how I should debug or any related tips :) And any tips for where I should look to implement the same functionality as a final event after IFC import would also be much appreciated.

Great project btw :)

Best Regards
Kristoffer

Model shakes and geometries clipped

Hi,

When I open a specific file I have some problems with geometries (clipped). Also the model shakes and returns to normal when I stop moving the camera.

To illustrate my problem I opened this file with BIM Vision.

Result on BIM Vision :
BIM Vision

Result on web-ifc-viewer :
Web IFC Viewer

I sent my file to @agviegas in private.

I tested on Firefox and Chrome and the problem is the same

Loading large IFC file crashes browser

Hey,

super cool project! I was looking around for a BIM/IFC viewer and found you through google.

I, maybe ambitiously, loaded the famous 7 story hospital file:
Famous hospital IFC file

It showed up somewhere high "in the sky" of the model, but panning and zooming quickly crashed the browser and was really slow.

Can the project already handle these kind of files? Will it be able to handle them in a later stage?

Connect to PowerBI

Dear IFC.js maintainers,

One of the purposes for checking a model in a browser is for someone who is Non-BIM user to check the status.

Is it possible to link PowerBI and the browser model so that they can be used together?

I am not familiar with JS, so could you please show me a sample on how to do this and the procedure?

Thank you very much for your time.

doesn't show buttons

Schermafbeelding 2021-04-15 132235

When I open the index file I get just a blank output and I don't see the buttons on the left side. What should I do to fix this?
Thanks for helping :)

Loading optimization

This issue refers to how fast the scenes load. In other words, how fast can we parse an IFC file. Check out #33 for the related geometry optimization issue.

I have implemented web workers to allow for "multithreading". Here's a link to my fork. I have documented my thoughts here and here.

TL;DR:

210129_SpeedTest.mp4

The next step is to figure out how to implement my (or a similar) solution into this project. There are many ways to do this.

I suggest we/you release the first version of IFC.js and THEN implement web worker support.
Yes - performance is an important factor. But, I think it's more important to support the most useful IFC2x3 classes.

Anyways, that's just my thoughts. I'm open to suggestion and I encourage others to experiment with this as well.

[enhancement] SurfaceModel implementation

I'm taking a look at SurfaceModel as the next representation type to implement. Specifically I'm working on IfcFaceBasedSurfaceModel. There is also the IfcShellBasedSurfaceModel variant, but that can be the subject of a subsequent PR.
I'll open a PR once some progress has been made.

"SurfaceModel โ€“ allows the use of face based surface model and shell based surface
model, which includes facetted face sets and shells (both open and closed shells) for
the shape representation, surface models are always 3D representations"

Unfortunately IfcFaceBasedSurfaceModel was deprecated in IFC4 (instead using IfcFacetedBrep, as Breps are preferred), but still needs to be implemented for IFC2x3 support.

The implementation should be able to use some existing code in ifc-brep to process IfcFace reps.

Originally posted by @apemann in https://github.com/agviegas/IFC.js/discussions/18

Incorrect handling of aspect ratio change during onResize

The handling of onResize in web-ifc-viewer is flaky:

  • when I manually drag the window to change sizes, the aspect ratio changes mostly work, though it looks a little jittery.
  • but when I just toggle the jsconsole, I reliably get a squashing effect. This is undone and correst ratio restored when I then close it.

It looks like this problem is only in web-ifc-viewer, as the same steps don't reproduce it in web-ifc-three.

A brief code inspection (and added console loggings as shown in screens below) shows that the resize methods are being called in Viewer, but they're handled separately, in camera.ts and renderer.ts. So maybe this a race condition during event propagation? Consolidating the handling in a single method might fix this.

Actual:
image
image

Expected (from web-ifc-three):
image
image

Error opening a file

Hi, when trying to open some files, I was unable to open the file 202107010001_berlin_schoeneweide_2001.ifc, avaible in here. The following error appeared in the console.

image

I tried in Firefox and Edge(Chromium based) and both presented the same errors.

Could you add ifc sample?

Hi @agviegas,
You have started the really awesome work!

uploading all the samples I have is currently failing.
Could you add the sample you successfully parser?
So that we can see the result.
It would be nice it loads directly from resources folder without user upload.

Thanks

Implementation of Clipping Representation

IFC can generate geometries in various forms. One of them is Clipping Operations, ergo, boolean operations. Generally, the only boolean operation included in IFC is difference. A common case for this are the walls that are cut by slabs. In this case, the wall is represented as a whole wall, and then the subtraction is applied. The tasks for this issue are:

  • Understanding how clipping is expressed in IFC.

  • Understanding how clipping could be applied in Three.js. This is already implemented for extracting the OpeningElements from the walls geometry by difference boolean operations. See file boolean-operator.js.

  • Adding the logic to ifc-clipping.js to extract the necessary information.

  • Adding the logic to three-clipping.js file that takes this information and generates the geometry.

  • Testing different use cases.

The testing files provided for this issue can be found here.

Uncaught ReferenceError: loadBcf is not defined

Hi all,

As the tile says, when running the example I'm getting:

Uncaught ReferenceError: loadBcf is not defined
    at main.js:58285
    at main.js:58313

I'm running on Opera but I don't think this the problem because it works fine when I'm running the online one. Any ideas ?

gl postprocessing is too CPU intensive by default

Updating from 1.0.85 to 1.0.95 increased CPU usage enough to get my laptop fan to go on. I investigated by running the web-ifc-viewer demo app from source. Indeed, there are some additions for postprocessing that move my GPU usage from ~30% to ~50%, even for an empty scene, no IFC file loaded. This seems too expensive by default, so I suggest defaulting to more conservative render settings. Full discussion here:

https://discord.com/channels/799990228336115742/800000126998675457/900228947021791252

Error parsing empty IFCLABEL

While trying this .ifc, I've found that it breaks while parsing the line:

#72= IFCPROPERTYSINGLEVALUE('Finish',$,IFCLABEL(''),$);

The javascript console outputs:

Uncaught TypeError: Cannot read property '0' of undefined
    at getIfcValueValue (semantic-primitives.js:190)
    at Object.getIfcValue [as IfcValue] (semantic-primitives.js:97)
    at getProperty (semantic-primitives.js:27)
    at newSemanticUnit (semantic-factory.js:26)
    at semantic-factory.js:19
    at Array.forEach (<anonymous>)
    at retrieveIfcObjectProperties (semantic-factory.js:17)
    at newSemantic (semantic-factory.js:9)
    at getSemantic (semantic.js:36)
    at IfcVisitor.<computed> [as IfcPropertySingleValue] (semantic.js:30)

Make Breps faster

I have benchmarked the speed of all the lading steps (breaking down the buildGeometry function):

image

There are many places where the code can be improved, but one of the places I am most aware of is the generation of Breps. As you may know, breps are geometries defined by planes in space. The problem is that Three.js is only capable of constructing triangles in space, and the planes of Breps can have more than three points. So the current implementation runs a rather expensive algorithm using quaternions. This algorithm is something I borrowed from here.

Nonetheless, there is a much more efficient way to create geometry without the need to use this algorithm: triangulating all the faces and generating the geometry directly. For this, we need to triangulate the points, which is a challenging task that, fortunately, has already been addressed by others.

I will play around these days with this idea.

BTW: I am not sure if we should generate the edges or bring this outside to the example. It slows things down an this is something the user can implement if they want.

Using WASM

Dear IFC.js maintainers,

For the past few weeks I've been following the progress surrounding IFC in the browser, having an interest in IFC parsing myself I am happy to see the progress being made :-) However, I am posting this issue to voice my concern.

I am concerned that the performance of a javascript-based implementation cannot come close to the native IFC importers. Furthermore, the nature of a web-app demands this performance more than its native counterparts: short sessions, mobile devices, and low memory browser sandboxes are normal environments for a webapp.

As an example, IFC Schependomlaan is a file that can be loaded in a few seconds on popular IFC viewers, but takes a significant amount of time in IFC.js (unclear how long, since there is a parsing exception thrown).

Is there a clear way forward to match this performance? Or is it not the goal of the project to be primarily fast? Of course IFC.js is still in development, however I think the limits of the chosen technology cannot be overcome by clever engineering.

My suggestion would be to pivot the efforts towards WASM, which is very promising technology right now. My own small-scale experiments indicate it could match native performance for IFC loading, but it obviously adds complexity to the project.

I would be happy to discuss what such an implementation would look like, and share my findings, if you are interested.

What do you think?

Thank you for your time

I want to be clear that this is not an attempt to subtract from your efforts: you are obviously doing very valuable work here!

Functions not yet implemented in IFCLoader Class

When trying to implement the example "ifcjs-hello-world", some functions from the IFCLoader class were yet not implemented, like the "setWasmPath()" or the full implementation of the "parse()" function.

Is there another way to implement the setWasmPath() inside the IFCLoader class?

Different wasm file path in Chrome and Firefox

The integration of web-ifc-viewer in my project works fine in Firefox but not completely in Chrome.

Firefox loads the .wasm file from root: my-project.com/web-ifc.wasm
Chrome loads it prepending "js/": my-project.com/js/web-ifc.wasm

Even if I use setWasmPath('my-dir') chrome still prepends "js/":
my-project.com/js/my-dir/web-ifc.wasm (chrome)
my-project.com/my-dir/web-ifc.wasm (firefox)

Finally I could resolve it setting setWasmPath('../'), so all browsers loads wasm file from root

IFC file error - EDIT: moved to Web-IFC repo

Hi Antonio,

Thanks for sharing this tool, it looks great.

I tried to open the attached file but I receive the error below:

blob:https://agviegas.github.io/88067c87-8143-4128-a7e3-04a967e0a15c
bundle.js:34740 Wrote file
bundle.js:30848 Loading: example.ifc
bundle.js:30848 Read
bundle.js:30848 Loading
bundle.js:30848 Tape 153277
bundle.js:30848 Lines normal 2470
bundle.js:30848 Max express ID 2469
bundle.js:30848 Loaded 2470 lines in 7 ms!
bundle.js:30848 Unexpected profile type: 1484403080 at 1551
2bundle.js:30848 Unexpected profile type: 2937912522 at 2141
bundle.js:30848 Unexpected mesh type: 2736907675 at 2232
bundle.js:30848 Self intersecting composite curve!Unexpected mesh type: 2736907675 at 1371
bundle.js:30848 Self intersecting composite curve!Self intersecting composite curve!Self intersecting composite curve!Unexpected mesh type: 2736907675 at 1844
bundle.js:30848 Unexpected mesh type: 2736907675 at 1925
bundle.js:30848 Unexpected mesh type: 2736907675 at 1988
59bundle.js:30848 Unsupported 3D curve IFCLINE

finaldetail.zip

Thank you
Giovanni

applyWebIfcConfig doesn't work with IFCWorker.js

Hi,

I tried the new version of the example with web worker loading. For most of my test files, the loading is fine, I see my model on the origin without any problems.

However for some geo-referenced models I don't see these models although I applied the following configuration in main.js:

viewer.IFC.setWasmPath('files/');
viewer.IFC.loader.ifcManager.applyWebIfcConfig({
  COORDINATE_TO_ORIGIN: true,
  USE_FAST_BOOLS: false
});
viewer.IFC.loader.ifcManager.useWebWorkers(true, 'files/IFCWorker.js');

I also tried to make apply the configuration after activating the web worker loading, it doesn't change anything:

viewer.IFC.setWasmPath('files/');
viewer.IFC.loader.ifcManager.useWebWorkers(true, 'files/IFCWorker.js');
viewer.IFC.loader.ifcManager.applyWebIfcConfig({
  COORDINATE_TO_ORIGIN: true,
  USE_FAST_BOOLS: false
});

Normally this should overwrite the default configuration present in IFCWorker.js :

  OpenModel(data, settings) {
    this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true);
    let s = __spreadValues({
      COORDINATE_TO_ORIGIN: false,
      USE_FAST_BOOLS: false,
      CIRCLE_SEGMENTS_LOW: 5,
      CIRCLE_SEGMENTS_MEDIUM: 8,
      CIRCLE_SEGMENTS_HIGH: 12,
      BOOL_ABORT_THRESHOLD: 1e4
    }, settings);
    let result = this.wasmModule.OpenModel(s);
    this.wasmModule["FS_unlink"]("/filename");
    return result;
  }
  CreateModel(settings) {
    let s = __spreadValues({
      COORDINATE_TO_ORIGIN: false,
      USE_FAST_BOOLS: false,
      CIRCLE_SEGMENTS_LOW: 5,
      CIRCLE_SEGMENTS_MEDIUM: 8,
      CIRCLE_SEGMENTS_HIGH: 12,
      BOOL_ABORT_THRESHOLD: 1e4
    }, settings);
    let result = this.wasmModule.CreateModel(s);
    return result;
  }

If I disable the web worker loading, the COORDINATE_TO_ORIGIN parameter is taken into consideration

Write IFC

Hello,
I have noticed IFC write in the documentation
Can you elaborate a bit more on this?

Thanks!

Implement curve walls

Right now the code is able to create straight walls, but curve walls have not been implemented yet. To do this, the following tasks have to be done:

  • Find out how the different curved walls are represented in IFC. The provided examples can be used for this.
  • Find out how this kind of geometry can be generated in THREE.
  • Implement a .js file that reads the IFC information for curved walls and passes it to the .js file that generates the THREE geometry.
  • Implement the file with the THREE logic that generates the geometry.

Document IFC export settings to improve import process

Testing with Revit OOB IFC export returns missing classes and parsing errors. Using IFC 2x3 CoordinationView_V2.0

parse-process.js:24 Error while parsing item: ('http://www.csiorg.net/uniformat','1998',$,'Uniformat',$,$,$) of type FCCLASSIFICATION

And one of these per each element in the IFC:

parse-process.js:24 Error while parsing item: ('2UatwVAlX8_vRTau_vmt4$',#42,'OutPort_2547','Flow',$,#293908,$,.SOURCEANDSINK.,$,$) of type IFCDISTRIBUTIONPORT

The process ends with:

image

What type of IFC exportation setting does the viewer support?

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.