Skip to content

Graphic library from scratch, with reference implementation of computer graphics algorithms

License

Notifications You must be signed in to change notification settings

pedroth/tela.js

Repository files navigation

tela.js

Experimental graphic library from scratch(software-only), with reference implementation of computer graphics algorithms.

Purpose

The purpose of this graphic engine is to be able to generate images in a computational way, with minimal dependencies, such that the readable graphical algorithms shine instead of opaque graphical APIs. The engine should also be capable to create videos and interactive demos or games.

Playground usage:

Playground

Table of Contents

Quick start

In the browser

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
</body>
<script type="module">
    import { Canvas, Color, loop } from "https://cdn.jsdelivr.net/npm/tela.js/src/index.js";

    // You can also import from local file, e.g using `npm install tela.js`
    // import { Canvas, Color, loop } from "./node_modules/tela.js/src/index.js";

    const width = 640;
    const height = 480;
    const canvas = Canvas.ofSize(width, height);
    loop(({ time, dt }) => {
        document.title = `FPS: ${(Math.floor(1 / dt))}`;
        canvas.map((x, y) => {
            return Color.ofRGB(
                ((x * time) / width) % 1,
                ((y * time) / height) % 1
            )
        })
    }).play();
    document.body.appendChild(canvas.DOM);

</script>
</html>

On the desktop

Install tela.js it using npm install tela.js.

import { loop, Color, Window } from "tela.js/src/index.node.js";

const width = 640;
const height = 480;
const window = Window.ofSize(width, height);
loop(({ time, dt }) => {
    window.setTitle(`FPS: ${Math.floor(1 / dt)}`);
    window.map((x, y) => {
        return Color.ofRGB(
            ((x * time) / width) % 1,
            ((y * time) / height) % 1
        )
    })
})
.play();

And run it: node index.mjs / bun index.js

Note: Attention to running node with ES6 imports module

Generate images and videos

Install tela.js it using npm install tela.js.

Create a file:

// index.js
import { Color, video } from "tela.js/src/index.node.js";

const width = 640;
const height = 480;
const FPS = 25;
const maxVideoTime = 10; // time in seconds

function animation({ time, image }) {
    return image.map((x, y) => {
        return Color.ofRGB(
            ((x * time) / width) % 1,
            ((y * time) / height) % 1
        )
    })
}

video(
    "hello_world.mp4",
    animation,
    { width, height, FPS }
)
    .while(({ time }) => time < maxVideoTime);

And run it: node index.mjs / bun index.js

Note on generating videos

To generate videos and images tela.js needs ffmpeg in your system, in a way that it is possible to write on the console:

ffmpeg -version 

# it should output something like: fmpeg version 4.4.2-0ubuntu0.22.04.1...
# maybe with a different OS...

More examples

You can find more examples of usage in:

Dependencies

Node is preferred when running the demos (it is faster, opened a bug in bun).

Acknowledgements

TODOs

  • Fix parallel ray trace refresh bug
  • Parallel ray map
  • Serialize meshes not only triangles
  • Optimize data serialization in parallel ray tracer