Skip to content

Commit

Permalink
Add manhattan distance to other voronoi sketches
Browse files Browse the repository at this point in the history
  • Loading branch information
vhiribarren committed Dec 12, 2023
1 parent 71e2c9d commit 1d240e0
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 9 deletions.
18 changes: 15 additions & 3 deletions src/app/noise/voronoi-areas/fragment.glsl
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
#pragma glslify: random = require(../../../glsl-modules/random)

uniform uint u_cell_count;
uniform int u_distance_type;

varying vec2 v_uv;

const float infinity = 1.0 / 0.0;
const float INFINITY = 1.0 / 0.0;
const int DISTANCE_EUCLIDIAN = 0;
const int DISTANCE_MANHATTAN = 1;

vec2 generate_cell(uint id) {
return vec2(random(vec2(float(id), 0.0)), random(vec2(float(id), 1.0)));
Expand All @@ -14,16 +17,25 @@ float generate_color(uint id) {
return random(vec2(id));
}

float voronoi_distance(vec2 left, vec2 right) {
if (u_distance_type == DISTANCE_MANHATTAN) {
vec2 diff = right - left;
return abs(diff.x) + abs(diff.y);
} else {
return distance(left, right);
}
}

void main() {
vec2 size = gl_FragCoord.xy / v_uv;
float ratio = size.x / size.y;
vec2 uv = v_uv * vec2(ratio, 1.0);

float min_dist = infinity;
float min_dist = INFINITY;
uint min_cell_id = 0u;
for (uint i = 0u; i<u_cell_count; i++) {
vec2 v_cell = generate_cell(i)*ratio;
float v_cell_dist = distance(v_cell, uv);
float v_cell_dist = voronoi_distance(v_cell, uv);
if (v_cell_dist < min_dist) {
min_dist = v_cell_dist;
min_cell_id = i;
Expand Down
12 changes: 11 additions & 1 deletion src/app/noise/voronoi-areas/page.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
"use client";

import { NumberInput } from "@mantine/core";
import { NumberInput, Select } from "@mantine/core";
import fragmentShader from "./fragment.glsl";
import { FragmentLogic, FragmentView } from "@/components/shaders/FragmentView";
import styles from "../../../styles/shaderControl.module.css";
import { useUniform } from "@/components/shaders/uniforms";


const DISTANCE_TYPE = ["Euclidean Distance", "Manhattan Distance"];

function VoronoiNoiseControl({controlUiTunnel}: FragmentLogic) {
const [cellCount, setCellCount] = useUniform("u_cell_count", 20);
const [distanceType, setDistanceType] = useUniform("u_distance_type", 0);
const ControlUiTunnel = controlUiTunnel;

return (
<ControlUiTunnel>
<div className={styles.shaderControlWrapper}>
<NumberInput className={styles.shaderControl} label="Number of cells" onChange={setCellCount} value={cellCount} min={1} max={1000} allowDecimal={false} />
<Select
className={styles.shaderControl}
label="Distance algorithm"
placeholder="Pick value"
data={DISTANCE_TYPE}
value={DISTANCE_TYPE[distanceType]}
onChange={(e) => setDistanceType(DISTANCE_TYPE.indexOf(e!))} />
</div>
</ControlUiTunnel>
);
Expand Down
18 changes: 15 additions & 3 deletions src/app/noise/worley-random/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,36 @@

uniform uint u_cell_count;
uniform float u_luminosity;
uniform int u_distance_type;

varying vec2 v_uv;

const float infinity = 1.0 / 0.0;
const float INFINITY = 1.0 / 0.0;
const int DISTANCE_EUCLIDIAN = 0;
const int DISTANCE_MANHATTAN = 1;

vec2 generate_cell(uint id) {
return vec2(random(vec2(float(id), 0.0)), random(vec2(float(id), 1.0)));
}

float voronoi_distance(vec2 left, vec2 right) {
if (u_distance_type == DISTANCE_MANHATTAN) {
vec2 diff = right - left;
return abs(diff.x) + abs(diff.y);
} else {
return distance(left, right);
}
}

void main() {
vec2 size = gl_FragCoord.xy / v_uv;
float ratio = size.x / size.y;
vec2 uv = v_uv * vec2(ratio, 1.0);

float min_dist = infinity;
float min_dist = INFINITY;
for (uint i = 0u; i<u_cell_count; i++) {
vec2 v_cell = generate_cell(i)*ratio;
min_dist = min(min_dist, distance(v_cell, uv));
min_dist = min(min_dist, voronoi_distance(v_cell, uv));
}

gl_FragColor = vec4(vec3(u_luminosity*min_dist), 1.0);
Expand Down
14 changes: 12 additions & 2 deletions src/app/noise/worley-random/page.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
"use client";

import { NumberInput } from "@mantine/core";
import { NumberInput, Select } from "@mantine/core";
import fragmentShader from "./fragment.glsl";
import { FragmentLogic, FragmentView } from "@/components/shaders/FragmentView";
import styles from "../../../styles/shaderControl.module.css";
import { useUniform } from "@/components/shaders/uniforms";

const DISTANCE_TYPE = ["Euclidean Distance", "Manhattan Distance"];

function VoronoidNoiseControl({controlUiTunnel}: FragmentLogic) {

const [cellCount, setCellCount] = useUniform("u_cell_count", 20);
const [luminosity, setLuminosity] = useUniform("u_luminosity", 2.0);

const [distanceType, setDistanceType] = useUniform("u_distance_type", 0);
const ControlUiTunnel = controlUiTunnel;

return (
<ControlUiTunnel>
<div className={styles.shaderControlWrapper}>
<NumberInput className={styles.shaderControl} label="Number of cells" onChange={setCellCount} value={cellCount} min={1} max={1000} allowDecimal={false} />
<NumberInput className={styles.shaderControl} label="Luminosity" onChange={setLuminosity} value={luminosity} min={0.0} max={10.0} step={0.1} decimalScale={2} />
<Select
className={styles.shaderControl}
label="Distance algorithm"
placeholder="Pick value"
data={DISTANCE_TYPE}
value={DISTANCE_TYPE[distanceType]}
onChange={(e) => setDistanceType(DISTANCE_TYPE.indexOf(e!))}
/>
</div>
</ControlUiTunnel>
);
Expand Down

0 comments on commit 1d240e0

Please sign in to comment.