Coder Social home page Coder Social logo

cloydlau / webgl-fluid Goto Github PK

View Code? Open in Web Editor NEW
93.0 3.0 13.0 821 KB

ESM support for https://github.com/PavelDoGreat/WebGL-Fluid-Simulation.

Home Page: https://cloydlau.github.io/playground/webgl-fluid/

License: MIT License

JavaScript 87.05% HTML 1.85% TypeScript 11.10%
fluid webgl background simulation gpu navier-stokes

webgl-fluid's Introduction

ESM support for WebGL-Fluid-Simulation.

playground
conventional commits code style PRs Welcome
npm downloads jsDelivr downloads minzipped size created at


Features

  • Hover to activate by default, can also be click
  • Control whether to generate configurable number of random splats at initialization and at intervals
  • Background image

Install

NPM

npm i webgl-fluid

CDN + ESM

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>

  <body>
    <canvas style="width: 100vw; height: 100vh" />
    <script type="importmap">
      {
        "imports": {
          "webgl-fluid": "https://cdn.jsdelivr.net/npm/[email protected]/dist/webgl-fluid.mjs"
        }
      }
    </script>
    <script type="module">
      import WebGLFluid from 'webgl-fluid'

      WebGLFluid(document.querySelector('canvas'), {
        // options
      })
    </script>
  </body>
</html>

CDN + IIFE

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>

  <body>
    <canvas style="width: 100vw; height: 100vh" />
    <script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
    <script>
      WebGLFluid(document.querySelector('canvas'), {
        // options
      })
    </script>
  </body>
</html>

Options

WebGLFluid(document.querySelector('canvas'), {
  TRIGGER: 'hover',
  IMMEDIATE: true,
  AUTO: false,
  INTERVAL: 3000,
  SIM_RESOLUTION: 128,
  DYE_RESOLUTION: 1024,
  CAPTURE_RESOLUTION: 512,
  DENSITY_DISSIPATION: 1,
  VELOCITY_DISSIPATION: 0.3,
  PRESSURE: 0.8,
  PRESSURE_ITERATIONS: 20,
  CURL: 30,
  SPLAT_RADIUS: 0.35,
  SPLAT_FORCE: 6000,
  SPLAT_COUNT: Number.parseInt(Math.random() * 20) + 5,
  SHADING: true,
  COLORFUL: true,
  COLOR_UPDATE_SPEED: 10,
  PAUSED: false,
  BACK_COLOR: { r: 0, g: 0, b: 0 },
  TRANSPARENT: false,
  BLOOM: true,
  BLOOM_ITERATIONS: 8,
  BLOOM_RESOLUTION: 256,
  BLOOM_INTENSITY: 0.8,
  BLOOM_THRESHOLD: 0.6,
  BLOOM_SOFT_KNEE: 0.7,
  SUNRAYS: true,
  SUNRAYS_RESOLUTION: 196,
  SUNRAYS_WEIGHT: 1.0,
})

Trigger Mode

WebGLFluid(document.querySelector('canvas'), {
  TRIGGER: 'hover', // Can be change to 'click'
})

Auto Splating at Initialization

WebGLFluid(document.querySelector('canvas'), {
  IMMEDIATE: true,
})

Auto Splating at Intervals

WebGLFluid(document.querySelector('canvas'), {
  AUTO: true, // Whether to enable auto-splating
  INTERVAL: 3000, // The time (in milliseconds) the timer should delay in between auto-splating
})

Set the Splats' Count

WebGLFluid(document.querySelector('canvas'), {
  SPLAT_COUNT: Number.parseInt(Math.random() * 20) + 5,
})

Background Image

CSS

canvas {
  width: 100vw;
  height: 100vh;
  background-image: url('xxx.png');
  background-size: 100% 100%;
}

JS

WebGLFluid(document.querySelector('canvas'), {
  TRANSPARENT: true
})

Background Color

Background color will be whitened by 13 on each RGB color values when options.BLOOM is true. Set it to false to get pure color.


Example

Vue 3

<script setup>
import { onMounted, ref } from 'vue'
import WebGLFluid from 'webgl-fluid'

const canvas = ref()

onMounted(() => {
  WebGLFluid(canvas.value)
})
</script>

<template>
  <canvas ref="canvas" />
</template>

<style>
canvas {
  width: 100vw;
  height: 100vh;
}
</style>

Vue 2

<script>
import WebGLFluid from 'webgl-fluid'

export default {
  mounted() {
    WebGLFluid(this.$refs.canvas)
  }
}
</script>

<template>
  <canvas ref="canvas" />
</template>

<style>
canvas {
  width: 100vw;
  height: 100vh;
}
</style>

Vanilla JS or Any Other Framework

<!-- index.html -->

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>

  <body>
    <canvas style="width: 100vw; height: 100vh" />
    <script src="src/index.js"></script>
  </body>
</html>
// src/index.js

import WebGLFluid from 'webgl-fluid'

WebGLFluid(document.querySelector('canvas'), {
  // options
})

Changelog

Detailed changes for each release are documented in the release notes


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.