Code Monkey home page Code Monkey logo

learnopentk's Issues

ImageSharp textures not working

Trying to run a Project using the Texture class results in the following exception:

System.IO.FileLoadException: Could not load file or assembly 'System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at at LearnOpenTK.Common.Texture..ctor(String path)
at at LearnOpenTK.Window.OnLoad(EventArgs e)
at at OpenTK.GameWindow.OnLoadInternal(EventArgs e)
at at OpenTK.GameWindow.Run(Double updates_per_second, Double frames_per_second)
at at OpenTK.GameWindow.Run(Double updateRate)
at at LearnOpenTK.Program.Main(String[] args)

This seems to be a problem with ImageSharp. I'm currently using the old Texture class with System.Drawing instead which is working fine.

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

When i'm try to use code from chapter 1 leasson 2, i got error Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

GameEngine.cs

`
using System;
using System.Drawing;
using GameTry.Common;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace GameTry
{
public sealed class GameEngine : GameWindow
{
private readonly float[] _vertices =
{
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f,
};

    private Shader _shader;
    private int _vertexBufferObject;
    private int _vertexArrayObject;

    public GameEngine(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(
        gameWindowSettings, nativeWindowSettings)
    {
    }

    /// <summary>Run immediately after Run() is called.</summary>
    /// <footer><a href="https://www.google.com/search?q=OpenTK.Windowing.Desktop.GameWindow.OnLoad">`GameWindow.OnLoad` on google.com</a></footer>
    protected override void OnLoad()
    {
        base.OnLoad();
        GL.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        _vertexBufferObject = GL.GenBuffer();
        GL.BufferData(BufferTarget.ArrayBuffer, _vertices.Length * sizeof(float), _vertices,
            BufferUsageHint.StaticDraw);
        CursorVisible = true;
        _vertexArrayObject = GL.GenVertexArray();
        GL.BindVertexArray(_vertexArrayObject);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
        GL.EnableVertexAttribArray(0);
        _shader = new Shader("Shaders/shader.vert", "Shaders/shader.frag");
        _shader.Use();
    }

    protected override void OnRenderFrame(FrameEventArgs e)
    {
        base.OnRenderFrame(e);
        GL.Clear(ClearBufferMask.ColorBufferBit);

        _shader.Use();

        GL.BindVertexArray(_vertexArrayObject);
        GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
        SwapBuffers();
    }

    protected override void OnUpdateFrame(FrameEventArgs e)
    {
        base.OnUpdateFrame(e);
        HandleKeybord();
    }


    private void HandleKeybord()
    {
        var input = KeyboardState;
        if (input.IsKeyDown(Keys.Escape))
        {
            Close();
        }
    }

    protected override void OnResize(ResizeEventArgs e)
    {
        base.OnResize(e);
        GL.Viewport(0, 0, Size.X, Size.Y);
    }

    protected override void OnUnload()
    {
        // Unbind all the resources by binding the targets to 0/null.
        GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
        GL.BindVertexArray(0);
        GL.UseProgram(0);

        // Delete all the resources.
        GL.DeleteBuffer(_vertexBufferObject);
        GL.DeleteVertexArray(_vertexArrayObject);

        GL.DeleteProgram(_shader.Handle);

        base.OnUnload();
    }
}

}`

`
using System;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;

namespace GameTry
{
class Programm
{

    public static void Main(string[] args)
    {
        var nativeWindowSettings = new NativeWindowSettings()
        {
            Size = new Vector2i(1920, 1024),
            Title = "FirstGameEngineTry",
            Flags = ContextFlags.ForwardCompatible
        };
        using (GameEngine gameEngine = new(GameWindowSettings.Default, nativeWindowSettings))
        {
            gameEngine.Run();
        }
    }
}

}`

what i do wrong?

Why OpenTK does not support Matrix4.CreatePerspective( ) method ?. What are the differences between Matrix4.CreatePerspective( ) vs Matrix4.CreatePerspectiveFieldOfView( )

I have seen many libraries matrix4 like Monogame or System.Numerics.Matrix4x4 ... support both Matrix4.CreatePerspective( ) and Matrix4.CreatePerspectiveFieldOfView( ) method.
So, why OpenTK decided to do not support Matrix4.CreatePerspective( ), but only Matrix4.CreatePerspectiveFieldOfView( ) ?

And show for me the differences between Matrix4.CreatePerspective( ) vs Matrix4.CreatePerspectiveFieldOfView( ).

Many thanks for your help.

image

.NET PixelFormat to ES30

How do I map System.Drawing.Imaging.PixelFormat to opentk.graphics.es30.pixelFormat? I can't find an example that uses ES30 when going from a call to Bitmap.LockBits to a call to GL.TexImage2D. I want my OpenTK code to work on mobile devices. I have a png that is a color gradient that I'm using to texture triangles using a shader with a texture. PixelFormat.Brga is not available, and the ES30 PixelFormat.Rgba doesn't seem to work.

TextureId = GL.GenTexture();
CheckError();
GL.BindTexture(TextureTarget.Texture2D, TextureId);
CheckError();

System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromFile(TextureFilename);
System.Drawing.Imaging.BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
    System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
CheckError();
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
CheckError();

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
CheckError();
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
CheckError();
GL.PixelStore(PixelStoreParameter.PackAlignment, 1);
CheckError();

GL.TexImage2D(TextureTarget2d.Texture2D, 0, TextureComponentCount.Rgba, data.Width, data.Height, 0, 
    PixelFormat.Rgba, PixelType.UnsignedByte, data.Scan0);
CheckError();

GL.GenerateMipmap(TextureTarget.Texture2D);
CheckError();

GL.BindTexture(TextureTarget.Texture2D, 0);
CheckError();
bmp.UnlockBits(data);

Edge artifacts

In Lightning Sample, you will get strange edge artifacts, if you move a litte arround the cube. This is because you dont have face culling enabled. If you enable this, the cube is drawn only half. So, the clockwiese/counter-clockwise points have to be corrected.

image

This may out of scope of that tutorial, but even if you don't want enable face culling, you should at least correct the vertices to:

        private readonly float[] _vertices =
        {
             // Position          Normal
             0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f, // Front face
            -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
             0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
            -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
             0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
            -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,

            -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f, // Back face
             0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
            -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,

            -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f, // Left face
            -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,

             0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f, // Right face
             0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
             0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,

            -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f, // Bottom face
             0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
            -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,

            0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f, // Top face
           -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
            0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
           -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
            0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
           -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f
        };

Tutorial: Questionable Shader class disposal advice/code

I had copied the Shader class without initially thinking about it much. Today I was basically rewriting it and noticed the disposal logic, much of which originated with the tutorial code. This is a bit nitpicky, but the discussion of unmanaged resource cleanup in the 1.2 Hello Triangle chapter at the end of the Compiling the Shaders section may warrant reconsideration.

.NET finalizers aren't remotely equivalent to C++ destructors, so it doesn't make sense to state, "We can't do it in the finalizer due to the Object-Oriented Language Problem." Nobody should be contemplating resource cleanup in the finalizer as correct behavior in the first place, completely irrespective of whether or not it's problematic for OpenGL specifically.

The code, of course, is meant to output a warning if disposal wasn't correctly called but (a) that's detrimental to performance because declaring a finalizer adds it to .NET's finalizer tracking queue, (b) there's no guarantee about when a finalizer might be invoked, or whether it will be invoked at all, ever, and (c) in practice they are never invoked when the application is exiting, which is the most likely scenario here. So in short, while a warning message looks like a good idea, in reality it'll never actually be seen. It's wasted effort.

I'd say it makes the most sense just to show a Dispose method. Also, I suppose the sample code was cut-and-pasted from somewhere else since arguments like bool disposing aren't even used (that's an arguably-bad design when you want to know whether or not Dispose is being called from the finalizer.) Even though the class shouldn't have a finalizer, it should still call SuppressFinalize in case a derived class does declare a finalizer.

Just keep it simple:

private bool IsDisposed = false;

public virtual void Dispose()
{
    if (IsDisposed) return;

    GL.DeleteProgram(Handle);
    IsDisposed = true;
    GC.SuppressFinalize(this);
}

Like I said, nitpicky.

Parameter of the OnFramebufferResize method in Chapter 1/2 is wrong

OpenTK4
https://opentk.net/learn/chapter1/2-hello-triangle.html?tabs=onload-opentk4%2Conrender-opentk4%2Cresize-opentk4#some-new-functions
What in sample is

protected override void OnFramebufferResize(ResizeEventArgs e)
{
    base.OnFramebufferResize(e);

    GL.Viewport(0, 0, e.Width, e.Height);
}

but the parameter in source is

protected virtual void OnFramebufferResize(FramebufferResizeEventArgs e)
{
  Action<FramebufferResizeEventArgs> framebufferResize = this.FramebufferResize;
  if (framebufferResize == null)
      return;
  framebufferResize(e);
}

In Forms Designer, using a custom control that inherits GLControl crashes visual studio

encountered in visual studio 2019.

Forms designer actually calls the subscribed events when you do stuff like clicking, resizing the control that inherits/has a glcontrol.

To stop it from crashing:
make a private bool isInDesignMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

and then do a if(isInDesignMode) {return} check before any other logic, in the affected methods (examples are onResize, onPaint).

Texture.cs class loads Textures upside down

OpenGL loads textures upside down by default, and the Texture.cs texture is not flipped before it is loaded. When you run the application this causes the textures to be rendered upside down.

Putting this on line 27 should fix this problem:

image.RotateFlip(RotateFlipType.RotateNoneFlipY);

Where can I find examples for ES20?

Hi! I'm limited in the GL version due the old platform that I want to run the program, I have zero experience with OpenGL so I'm already stuck in the example 2 that use Shaders that can't be compiled in the ES20 and functions that aren't avaiable too, is there any example, maybe a working project, using OpenTK for ES2.0?

Console and Winform

Here is examples of the console. Where should I find examples of Winform?

wrong accessibility level for Shader.Use()

in 1.2 Hello Triangle's documentation, section Compiling the Shaders, a Use() method is defined in the Shader class, but there was no explicit accessibility level defined for the method so it defaulted to private meaning that the program would compile with error CS0122. the method should've been defined as: public void Use() { GL.UseProgram(Handle); } so that it is accessible to members outside of its class. it has the correct accessibility level in this repository here though.

Chapter 1 / 6 error in comments

Chapter 1 / 6 says ..

            // shader.frag has been modified yet again, take a look at it as well.
            _shader = new Shader("Shaders/shader.vert", "Shaders/shader.frag");
            _shader.Use();

when it should say...

            // shader.vert has been modified, take a look at it as well.
            _shader = new Shader("Shaders/shader.vert", "Shaders/shader.frag");
            _shader.Use();

OSX: Chapter 1/1 not working on OSX

I've copied the code from the repo commit d71bd15.

I've tried both versions 4.6.4 and 5.0.0-pre.6.

I've modified Program.cs like this:

--- a/Program.cs
+++ b/Program.cs
@@ -12,6 +12,7 @@ namespace LearnOpenTK
          {
             Size = new Vector2i(800, 600),
             Title = "LearnOpenTK - Creating a Window",
+            APIVersion = new Version(3, 2)
          };
 
          // To create a new window, create a class that extends GameWindow, then call Run() on it.

I've tried versions 3.2, 3.3 and 4.1. The comments in the NativeWindowSettings.cs indicate these should all work on MacOS.

I'm consistently getting this exception:

Unhandled exception. OpenTK.Windowing.GraphicsLibraryFramework.GLFWException: NSGL: The targeted version of macOS only supports forward-compatible core profile contexts for OpenGL 3.2 and above
at OpenTK.Windowing.Desktop.GLFWProvider.<>c.<.cctor>b__5_0(ErrorCode errorCode, String description)
Abort trap: 6

Here is the output of my "dotnet --info"

.NET SDK (reflecting any global.json):
Version: 5.0.102
Commit: 71365b4d42

Runtime Environment:
OS Name: Mac OS X
OS Version: 10.15
OS Platform: Darwin
RID: osx.10.15-x64
Base Path: /usr/local/share/dotnet/sdk/5.0.102/

Host (useful for support):
Version: 5.0.2
Commit: cb5f173b96

.NET SDKs installed:
3.1.201 [/usr/local/share/dotnet/sdk]
3.1.403 [/usr/local/share/dotnet/sdk]
3.1.404 [/usr/local/share/dotnet/sdk]
5.0.100 [/usr/local/share/dotnet/sdk]
5.0.101 [/usr/local/share/dotnet/sdk]
5.0.102 [/usr/local/share/dotnet/sdk]

.NET runtimes installed:
Microsoft.AspNetCore.App 3.1.9 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.10 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.1 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.23 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.8 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.9 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.10 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.1 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download

using LearnOpenTK.Common; is not valid

using LearnOpenTK.Common; is not a valid using statement in Chapter 1 Lesson 2 and the lesson uses the Shader class from it

EDIT:
I realized it was in this repo in Common possibly a note of that on the tutorials or readme

GLSL typically uses column-major,but the demo shader of "7-Transformations" use pre-multiplication

GL.UniformMatrix4 is a fairly standard function, similar to the other Uniform functions we've seen so far. The parameters are as follows:

The location of the uniform on the shader.
A boolean, determining whether or not the matrices should be transposed. Since OpenTK uses row-major, whereas GLSL typically uses column-major, you'll almost always want to use true here.
A reference to the matrix we want to pass.]

Broken links from the book to the repository

It appears that at some point, the folder names in this repo wre changed to remove spaces, but some of the links in the book weren't updated for this, leading to broken links.

One other thought I had, it would be nice if there was a link from every page to the repo folder for that page, only a few pages have links.

Chapter2/6-MultipleLights sample is broken

Chapter2/6-MultipleLights sample are crash for me (I'm run it on Intel HD 4600 video, if it matters at all, doesn't sure, i'm completely newbie in OpenGL).

The issue is what Shader.cs fills _uniformLocations by using call GL.GetProgram(Handle, GetProgramParameterName.ActiveUniforms, out var numberOfUniforms);. However this call doesn't report all locations.

I'm checked LearnOpenGL example, and it uses bit different way, so i'm put few changes:

diff --git a/Common/Shader.cs b/Common/Shader.cs
index 1ff74d2..3ec0c16 100644
--- a/Common/Shader.cs
+++ b/Common/Shader.cs
@@ -155,8 +155,9 @@ namespace LearnOpenTK.Common
         /// <param name="data">The data to set</param>
         public void SetFloat(string name, float data)
         {
+            var uniformLocation = GL.GetUniformLocation(Handle, name);
             GL.UseProgram(Handle);
-            GL.Uniform1(_uniformLocations[name], data);
+            GL.Uniform1(uniformLocation, data);
         }
 
         /// <summary>
@@ -182,8 +183,9 @@ namespace LearnOpenTK.Common
         /// <param name="data">The data to set</param>
         public void SetVector3(string name, Vector3 data)
         {
+            var uniformLocation = GL.GetUniformLocation(Handle, name);
             GL.UseProgram(Handle);
-            GL.Uniform3(_uniformLocations[name], data);
+            GL.Uniform3(uniformLocation, data);
         }
     }
 }

And that's makes example to run. Surely, this requires more accurate fix.

Change of namespace

The current namespace (LearnOpenGL_TK) does not match the github repository and does not make a lot of sense (LearnOpenGL_ToolKit?).

I think the namespace should be changed to LearnOpenTK

OnResize() is not using FramebufferSize property

The current samples are not handling correctly the resizing of the window :

Capture d’écran 2024-02-26 à 18 45 15

Current code :
GL.Viewport(0, 0, Size.X, Size.Y);

Proposal for fix :
Vector2i fb = this.FramebufferSize;
GL.Viewport(0, 0, fb.X, fb.Y);

Confusing openTK implement openGL version 2,3,4

Hi.

I'm quite confusing about openTK name space "OpenTK.Graphics.OpenGL", and "OpenTK.Graphics.OpenGL4".

Does OpenTk only implement OpenGL2 and OpenGL4, where is openGL3
I read on Lean openTK site. It used openTK 3 but I can not see any code implement openGL 3 in opentk project.
Only 2 folder/ namespce for openGL2 and openGL4 (image bellow).

Help me resolve. Thanks
image

Filename typo

The project file in tutorial 2.5 has a typo (Ligh instead of Light)

Path: Chapter 2/5 - Light casters - directional lights/5 - Ligh casters - directional lights.csproj

A few tutorials I would like to see..

  • Centered Orthographics camera
  • Topleft Projection camera
  • TopLeft Orthographics camera
  • Scaling up vertices and uvs to pixel coordinates
  • Custom 2D Drawing functions
  • Custom 3D Drawing functions

GL.GenBuffer() gets 0

Hi there. If I define buffers inside the OpenTkInit() method like in tutorials, it work OK. But if I do same in some other method after the OpenTK is already initialized, GL.GenBuffer() gets zero. How to solve it? I need to add buffered data during the runtime. For example, add some surface from the file or remove it.

Resizing window on MacOS doesn't take care of the scale factor*2

When resizing on MacOS, the rendered objects are divided by 2.

macos

The solution consists to use scale factor :

    // Initialise the Scale Factor
    float scaleFactorX = 1.0f;
    float scaleFactorY = 1.0f;

And to identify it correctly on MacOS (2.0f on my Mac) during the OnLoad():

        // Get the Scale Factor of the Monitor
        this.TryGetCurrentMonitorScale(out scaleFactorX, out scaleFactorY);

Then the OnResize() needs to use it :

        GL.Viewport(0, 0, (int)(Size.X * scaleFactorX), (int)(Size.Y * scaleFactorY));

With this method, the window once resized is displaying correctly the object :

macos-fix

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.