procedurally generated ring mostly done, needs radius tweaked

This commit is contained in:
ad044 2020-09-19 19:45:38 +04:00
parent 5f473325fc
commit 01db296737
5 changed files with 75 additions and 69 deletions

Binary file not shown.

View file

@ -15,12 +15,12 @@ const GrayRing = memo((props: GrayRingProps) => {
const lifeTex = useLoader(THREE.TextureLoader, lifeTexture);
const uniforms = useMemo(
() => ({
lof: { type: "t", value: lofTex },
hole: { type: "t", value: holeTex },
life: { type: "t", value: lifeTex },
}),
[lofTex, holeTex, lifeTex]
() => ({
lof: { type: "t", value: lofTex },
hole: { type: "t", value: holeTex },
life: { type: "t", value: lifeTex },
}),
[lofTex, holeTex, lifeTex]
);
const vertexShader = `
@ -34,12 +34,13 @@ const GrayRing = memo((props: GrayRingProps) => {
}
`;
const fragmentShader = `
varying vec2 vUv;
uniform sampler2D lof;
uniform sampler2D hole;
uniform sampler2D life;
// transform coordinates to uniform within segment
float tolocal(float x, int segments, float step) {
float period = 1.0/step*float(segments);
@ -50,12 +51,12 @@ const GrayRing = memo((props: GrayRingProps) => {
bool isheight(float y, float thin) {
return y > 0.5-thin/2.0 && y < 0.5+thin/2.0;
}
// sloping function
float slope(float x, float thin) {
return x*(1.0-thin)/2.0;
}
// frag color / texture
// #424252 hex in original textures
vec4 color(vec2 vUv, int quadnum, bool textureexists, int thinperiod, int quadlen, float step) {
@ -63,16 +64,19 @@ const GrayRing = memo((props: GrayRingProps) => {
return vec4(0.259,0.259,0.322, 1);
} else if (quadnum % 2 == 1) {
return texture2D(hole, vec2(tolocal(vUv.x, quadlen-thinperiod, step), vUv.y));
// return vec4(tolocal(vUv.x, quadlen-thinperiod, step), 0, 0, 1);
} else if (quadnum == 0) {
return texture2D(lof, vec2(tolocal(vUv.x, quadlen-thinperiod, step), vUv.y));
} else {
return texture2D(life, vec2(tolocal(vUv.x, quadlen-thinperiod, step), vUv.y));
}
}
void main() {
// number of segments
float step = 64.0;
// thin line height
float thin = 0.3;
// segment within circle
@ -87,7 +91,7 @@ const GrayRing = memo((props: GrayRingProps) => {
int quadnum = int(segment) / quadlen;
// how big thin part is
int thinperiod = 12;
int thinperiod = 8;
if (quadel < thinperiod && isheight(vUv.y, thin)) {
// thin line
@ -117,15 +121,16 @@ const GrayRing = memo((props: GrayRingProps) => {
}
`;
return (
<mesh
position={[0, props.grayRingPosY, 0]}
rotation={[0, 3.7, 0]}
rotation={[0, 3.95, 0]}
renderOrder={1}
scale={[5, 2.5, 5]}
scale={[25,25,25]}
>
<cylinderBufferGeometry
args={[0.25, 0.25, 0.027, 64, 64, true]}
args={[0.05, 0.05, 0.003, 64, 64, true]}
attach="geometry"
/>
<shaderMaterial

View file

@ -14,28 +14,28 @@ const Hub = memo(() => {
<Suspense fallback={<>loading...</>}>
{/* average distance between rings from my CALCULATIONS is 1.87 in our case */}
<PurpleRing purpleRingPosY={2.27} />
<GrayRing grayRingPosY={1.6} />
<GrayRing grayRingPosY={1.59} />
<PurpleRing purpleRingPosY={0.4} />
<GrayRing grayRingPosY={-0.27} />
{/*{Object.values(level_sprites).map((sprite) => {*/}
{/* return (*/}
{/* <LevelSprite*/}
{/* position={sprite.position as [number, number, number]}*/}
{/* scale={sprite.scale as [number, number, number]}*/}
{/* rotation={*/}
{/* sprite.rotation as [*/}
{/* number,*/}
{/* number,*/}
{/* number,*/}
{/* (string | undefined)?*/}
{/* ]*/}
{/* }*/}
{/* sprite={sprite.sprite}*/}
{/* key={sprite.id}*/}
{/* active={sprite.id === currentSprite}*/}
{/* />*/}
{/* );*/}
{/*})}*/}
<GrayRing grayRingPosY={-0.28} />
{Object.values(level_sprites).map((sprite) => {
return (
<LevelSprite
position={sprite.position as [number, number, number]}
scale={sprite.scale as [number, number, number]}
rotation={
sprite.rotation as [
number,
number,
number,
(string | undefined)?
]
}
sprite={sprite.sprite}
key={sprite.id}
active={sprite.id === currentSprite}
/>
);
})}
</Suspense>
</>
);

View file

@ -1,12 +1,13 @@
import { atom } from "recoil";
export const camPosYAtom = atom({
key: "camPosYAtom",
default: 0,
key: "camPosYAtom",
// default: -1.87,
default: 0,
});
export const camRotYAtom = atom({
key: "camRotYAtom",
default: 0,
key: "camRotYAtom",
// default: 0.45,
default: 0,
});

View file

@ -5,44 +5,44 @@ import * as THREE from "three";
import { GLTF, GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
type PurpleRingProps = {
purpleRingPosY: number;
purpleRingPosY: number;
};
type GLTFResult = GLTF & {
nodes: {
Circle002: THREE.Mesh;
};
materials: {};
nodes: {
Circle002: THREE.Mesh;
};
materials: {};
};
const PurpleRing = memo((props: PurpleRingProps) => {
const purpleRingRef = useRef<THREE.Object3D>();
const purpleRingRef = useRef<THREE.Object3D>();
const { nodes } = useLoader<GLTFResult>(
GLTFLoader,
"/models/ring1.glb",
draco("/draco-gltf/")
);
const { nodes } = useLoader<GLTFResult>(
GLTFLoader,
"/models/ring1.glb",
draco("/draco-gltf/")
);
useFrame(() => {
purpleRingRef.current!.rotation.y += 0.01;
});
useFrame(() => {
purpleRingRef.current!.rotation.y += 0.01;
});
return (
<group
position={[0, props.purpleRingPosY, 0]}
scale={[1.3, 1.3, 1.3]}
ref={purpleRingRef}
>
<mesh geometry={nodes.Circle002.geometry} rotation={[0, Math.PI / 4, 0]}>
<meshStandardMaterial
attach="material"
color={0x281f47}
side={THREE.DoubleSide}
/>
</mesh>
</group>
);
return (
<group
position={[0, props.purpleRingPosY, 0]}
scale={[1.3, 1.3, 1.3]}
ref={purpleRingRef}
>
<mesh geometry={nodes.Circle002.geometry} rotation={[0, Math.PI / 4, 0]}>
<meshStandardMaterial
attach="material"
color={0x281f47}
side={THREE.DoubleSide}
/>
</mesh>
</group>
);
});
export default PurpleRing;