package tiny_libs
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
From-scratch libraries for teaching: graphics, audio, compression, crypto, networking and more
Install
dune-project
Dependency
Authors
Maintainers
Sources
0.3.6.tar.gz
md5=7c636383d146d30ac6f2fa234a6253c8
sha512=c79f3823c5f8f57e5038eb640d487c61168b84aa07c61999d6622ef9fd0c890e2b03b4c6a7cdbbe9352a49e25dda00ac7bb14693cee8e3d7beeed251351a2af0
doc/src/tiny_libs.graphics_raytrace/Perlin.ml.html
Source file Perlin.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63(* Claude Code * * Copyright (C) 2026 Yoann Padioleau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * (LGPL) as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. *) (* See Perlin.mli *) let permutation = [| 151; 160; 137; 91; 90; 15; 131; 13; 201; 95; 96; 53; 194; 233; 7; 225; 140; 36; 103; 30; 69; 142; 8; 99; 37; 240; 21; 10; 23; 190; 6; 148; 247; 120; 234; 75; 0; 26; 197; 62; 94; 252; 219; 203; 117; 35; 11; 32; 57; 177; 33; 88; 237; 149; 56; 87; 174; 20; 125; 136; 171; 168; 68; 175; 74; 165; 71; 134; 139; 48; 27; 166; 77; 146; 158; 231; 83; 111; 229; 122; 60; 211; 133; 230; 220; 105; 92; 41; 55; 46; 245; 40; 244; 102; 143; 54; 65; 25; 63; 161; 1; 216; 80; 73; 209; 76; 132; 187; 208; 89; 18; 169; 200; 196; 135; 130; 116; 188; 159; 86; 164; 100; 109; 198; 173; 186; 3; 64; 52; 217; 226; 250; 124; 123; 5; 202; 38; 147; 118; 126; 255; 82; 85; 212; 207; 206; 59; 227; 47; 16; 58; 17; 182; 189; 28; 42; 223; 183; 170; 213; 119; 248; 152; 2; 44; 154; 163; 70; 221; 153; 101; 155; 167; 43; 172; 9; 129; 22; 39; 253; 19; 98; 108; 110; 79; 113; 224; 232; 178; 185; 112; 104; 218; 246; 97; 228; 251; 34; 242; 193; 238; 210; 144; 12; 191; 179; 162; 241; 81; 51; 145; 235; 249; 14; 239; 107; 49; 192; 214; 31; 181; 199; 106; 157; 184; 84; 204; 176; 115; 121; 50; 45; 127; 4; 150; 254; 138; 236; 205; 93; 222; 114; 67; 29; 24; 72; 243; 141; 128; 195; 78; 66; 215; 61; 156; 180 |] (* twice over, so that p.(i + 1) needs no wrapping *) let p = Array.init 512 (fun i -> permutation.(i land 255)) let fade (t : float) : float = t *. t *. t *. ((t *. ((t *. 6.) -. 15.)) +. 10.) let lerp (t : float) (a : float) (b : float) : float = a +. (t *. (b -. a)) (* one of 12 gradients, the edges' middles of a cube (and 4 again), * dotted with (x, y, z) *) let grad (hash : int) (x : float) (y : float) (z : float) : float = let h = hash land 15 in let u = if h < 8 then x else y in let v = if h < 4 then y else if h = 12 || h = 14 then x else z in (if h land 1 = 0 then u else -.u) +. if h land 2 = 0 then v else -.v let noise (x : float) (y : float) (z : float) : float = let fx = Float.floor x and fy = Float.floor y and fz = Float.floor z in let xi = int_of_float fx land 255 and yi = int_of_float fy land 255 and zi = int_of_float fz land 255 in let x = x -. fx and y = y -. fy and z = z -. fz in let u = fade x and v = fade y and w = fade z in let a = p.(xi) + yi in let aa = p.(a) + zi and ab = p.(a + 1) + zi in let b = p.(xi + 1) + yi in let ba = p.(b) + zi and bb = p.(b + 1) + zi in lerp w (lerp v (lerp u (grad p.(aa) x y z) (grad p.(ba) (x -. 1.) y z)) (lerp u (grad p.(ab) x (y -. 1.) z) (grad p.(bb) (x -. 1.) (y -. 1.) z))) (lerp v (lerp u (grad p.(aa + 1) x y (z -. 1.)) (grad p.(ba + 1) (x -. 1.) y (z -. 1.))) (lerp u (grad p.(ab + 1) x (y -. 1.) (z -. 1.)) (grad p.(bb + 1) (x -. 1.) (y -. 1.) (z -. 1.)))) let turbulence (octaves : int) ((x, y, z) : Vec3.t) : float = let sum = ref 0. and f = ref 1. in for _ = 1 to octaves do sum := !sum +. (Float.abs (noise (x *. !f) (y *. !f) (z *. !f)) /. !f); f := !f *. 2. done; !sum
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>