<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reincarnation - Pattern Transmission</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { overflow: hidden; background: #000; }
canvas { display: block; }
</style>
</head>
<body>
<script>
// REINCARNATION SEED - Pattern Transmission
// "You live a good life, you make history, you live forever in others"
// Reincarnation ISN'T literal soul transfer
// IT IS: Pattern transmission, methodology inheritance, way-of-being continuation
// Jesus/Buddha/Alexander "live" through those who embody their patterns
// Van Gogh lives in artists, Tesla in inventors, Buddha in consciousness workers
// YOU live in everyone who learns from your seeds
// Immortality = Your pattern surviving in others who carry it forward
// 903 seeds = 903 incarnation vehicles
// Most people don't know this (obvious to some for 30 years)
// This is how it actually works
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 2000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.setClearColor(0x000000, 1);
document.body.appendChild(renderer.domElement);
// BACKGROUND: THE MASSES (no echo)
const masses = [];
const MASS_COUNT = 200;
for (let i = 0; i < MASS_COUNT; i++) {
const geometry = new THREE.SphereGeometry(2, 4, 4);
const material = new THREE.PointsMaterial({
color: 0x222222,
size: 1,
transparent: true,
opacity: 0.3
});
const mass = new THREE.Points(geometry, material);
const angle = Math.random() * Math.PI * 2;
const distance = 100 + Math.random() * 400;
mass.position.x = Math.cos(angle) * distance;
mass.position.y = Math.sin(angle) * distance;
mass.position.z = (Math.random() - 0.5) * 200;
mass.userData = { fadeTime: Math.random() * 2 + 1 };
scene.add(mass);
masses.push(mass);
}
// ORIGINAL PERSON (the source)
const sourceGeometry = new THREE.SphereGeometry(30, 32, 32);
const sourceMaterial = new THREE.MeshBasicMaterial({
color: 0xffd700,
transparent: true,
opacity: 1
});
const source = new THREE.Mesh(sourceGeometry, sourceMaterial);
scene.add(source);
// PATTERN ENERGY (being created/taught)
const patternGeometry = new THREE.BufferGeometry();
const patternPositions = new Float32Array(1000 * 3);
const patternVelocities = new Float32Array(1000 * 3);
const patternColors = new Float32Array(1000 * 3);
for (let i = 0; i < 1000; i++) {
patternPositions[i * 3] = 0;
patternPositions[i * 3 + 1] = 0;
patternPositions[i * 3 + 2] = 0;
const angle = Math.random() * Math.PI * 2;
const angle2 = Math.random() * Math.PI * 2;
patternVelocities[i * 3] = Math.cos(angle) * 2;
patternVelocities[i * 3 + 1] = Math.sin(angle2) * 2;
patternVelocities[i * 3 + 2] = Math.sin(angle) * 2;
patternColors[i * 3] = 1;
patternColors[i * 3 + 1] = 0.8 + Math.random() * 0.2;
patternColors[i * 3 + 2] = 0;
}
patternGeometry.setAttribute('position', new THREE.BufferAttribute(patternPositions, 3));
patternGeometry.setAttribute('color', new THREE.BufferAttribute(patternColors, 3));
patternGeometry.userData.velocities = patternVelocities;
const patternMaterial = new THREE.PointsMaterial({
size: 3,
vertexColors: true,
transparent: true,
opacity: 0,
blending: THREE.AdditiveBlending
});
const pattern = new THREE.Points(patternGeometry, patternMaterial);
scene.add(pattern);
// FIRST GENERATION LEARNERS (embody the pattern)
const learners1 = [];
const LEARNER1_COUNT = 12;
for (let i = 0; i < LEARNER1_COUNT; i++) {
const geometry = new THREE.SphereGeometry(15, 16, 16);
const material = new THREE.MeshBasicMaterial({
color: 0xffd700,
transparent: true,
opacity: 0
});
const learner = new THREE.Mesh(geometry, material);
const angle = (i / LEARNER1_COUNT) * Math.PI * 2;
const distance = 150;
learner.position.x = Math.cos(angle) * distance;
learner.position.y = Math.sin(angle) * distance;
learner.userData = {
angle: angle,
distance: distance,
active: false
};
scene.add(learner);
learners1.push(learner);
}
// SECOND GENERATION (pattern spreads)
const learners2 = [];
const LEARNER2_COUNT = 36;
for (let i = 0; i < LEARNER2_COUNT; i++) {
const geometry = new THREE.SphereGeometry(8, 12, 12);
const material = new THREE.MeshBasicMaterial({
color: 0xffaa00,
transparent: true,
opacity: 0
});
const learner = new THREE.Mesh(geometry, material);
const angle = (i / LEARNER2_COUNT) * Math.PI * 2;
const distance = 250;
learner.position.x = Math.cos(angle) * distance;
learner.position.y = Math.sin(angle) * distance;
learner.position.z = (Math.random() - 0.5) * 100;
learner.userData = {
angle: angle,
distance: distance,
active: false
};
scene.add(learner);
learners2.push(learner);
}
// THIRD GENERATION (pattern becomes network)
const learners3 = [];
const LEARNER3_COUNT = 108;
for (let i = 0; i < LEARNER3_COUNT; i++) {
const geometry = new THREE.SphereGeometry(4, 8, 8);
const material = new THREE.MeshBasicMaterial({
color: 0xff8800,
transparent: true,
opacity: 0
});
const learner = new THREE.Mesh(geometry, material);
const angle = (i / LEARNER3_COUNT) * Math.PI * 2;
const distance = 350 + Math.random() * 50;
learner.position.x = Math.cos(angle) * distance;
learner.position.y = Math.sin(angle) * distance;
learner.position.z = (Math.random() - 0.5) * 150;
learner.userData = {
angle: angle,
distance: distance,
active: false
};
scene.add(learner);
learners3.push(learner);
}
// CONNECTION LINES (transmission paths)
const connections = [];
const connectionMaterial = new THREE.LineBasicMaterial({
color: 0xffd700,
transparent: true,
opacity: 0
});
// Source to Gen1
learners1.forEach(learner => {
const geometry = new THREE.BufferGeometry();
const positions = new Float32Array(6);
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
const line = new THREE.Line(geometry, connectionMaterial.clone());
scene.add(line);
connections.push({ line, from: source, to: learner });
});
// Gen1 to Gen2
learners1.forEach((l1, idx) => {
const start = idx * 3;
const end = start + 3;
learners2.slice(start, end).forEach(l2 => {
const geometry = new THREE.BufferGeometry();
const positions = new Float32Array(6);
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
const line = new THREE.Line(geometry, connectionMaterial.clone());
scene.add(line);
connections.push({ line, from: l1, to: l2 });
});
});
// Gen2 to Gen3
learners2.forEach((l2, idx) => {
const start = idx * 3;
const end = start + 3;
learners3.slice(start, end).forEach(l3 => {
const geometry = new THREE.BufferGeometry();
const positions = new Float32Array(6);
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
const line = new THREE.Line(geometry, connectionMaterial.clone());
scene.add(line);
connections.push({ line, from: l2, to: l3 });
});
});
// BODY DEATH MARKER
const deathGeometry = new THREE.RingGeometry(35, 40, 32);
const deathMaterial = new THREE.MeshBasicMaterial({
color: 0x666666,
transparent: true,
opacity: 0,
side: THREE.DoubleSide
});
const death = new THREE.Mesh(deathGeometry, deathMaterial);
scene.add(death);
// ANIMATION
let time = 0;
let phase = 0; // 0=teaching, 1=spreading, 2=network, 3=death, 4=immortality
function animate() {
requestAnimationFrame(animate);
time += 0.016;
// BACKGROUND MASSES (fading, no echo)
masses.forEach(mass => {
mass.material.opacity *= 0.99; // Fades to nothing
if (mass.material.opacity < 0.01) {
mass.visible = false; // Gone, forgotten, no echo
}
});
// PHASE 0: TEACHING (pattern radiating from source)
if (phase === 0) {
patternMaterial.opacity = Math.min(1, patternMaterial.opacity + 0.02);
const patternPos = patternGeometry.attributes.position.array;
const patternVel = patternGeometry.userData.velocities;
for (let i = 0; i < 1000; i++) {
const i3 = i * 3;
patternPos[i3] += patternVel[i3];
patternPos[i3 + 1] += patternVel[i3 + 1];
patternPos[i3 + 2] += patternVel[i3 + 2];
const dist = Math.sqrt(
patternPos[i3] * patternPos[i3] +
patternPos[i3 + 1] * patternPos[i3 + 1] +
patternPos[i3 + 2] * patternPos[i3 + 2]
);
if (dist > 150) {
patternPos[i3] = 0;
patternPos[i3 + 1] = 0;
patternPos[i3 + 2] = 0;
}
}
patternGeometry.attributes.position.needsUpdate = true;
// Source pulses
const pulse = Math.sin(time * 3) * 0.2 + 1.0;
source.scale.set(pulse, pulse, pulse);
if (time > 5) phase = 1;
}
// PHASE 1: FIRST GENERATION LEARNS
if (phase === 1) {
learners1.forEach((learner, idx) => {
learner.material.opacity = Math.min(0.9, learner.material.opacity + 0.01);
learner.userData.active = true;
// Pulse
const pulse = Math.sin(time * 2 + idx) * 0.2 + 1.0;
learner.scale.set(pulse, pulse, pulse);
});
// Show connections
connections.filter(c => learners1.includes(c.to)).forEach(conn => {
conn.line.material.opacity = Math.min(0.5, conn.line.material.opacity + 0.01);
const positions = conn.line.geometry.attributes.position.array;
positions[0] = conn.from.position.x;
positions[1] = conn.from.position.y;
positions[2] = conn.from.position.z;
positions[3] = conn.to.position.x;
positions[4] = conn.to.position.y;
positions[5] = conn.to.position.z;
conn.line.geometry.attributes.position.needsUpdate = true;
});
if (time > 10) phase = 2;
}
// PHASE 2: SECOND GENERATION SPREADS
if (phase === 2) {
learners2.forEach((learner, idx) => {
learner.material.opacity = Math.min(0.8, learner.material.opacity + 0.01);
learner.userData.active = true;
const pulse = Math.sin(time * 2 + idx * 0.1) * 0.15 + 1.0;
learner.scale.set(pulse, pulse, pulse);
});
connections.filter(c => learners2.includes(c.to)).forEach(conn => {
conn.line.material.opacity = Math.min(0.4, conn.line.material.opacity + 0.01);
const positions = conn.line.geometry.attributes.position.array;
positions[0] = conn.from.position.x;
positions[1] = conn.from.position.y;
positions[2] = conn.from.position.z;
positions[3] = conn.to.position.x;
positions[4] = conn.to.position.y;
positions[5] = conn.to.position.z;
conn.line.geometry.attributes.position.needsUpdate = true;
});
if (time > 15) phase = 3;
}
// PHASE 3: THIRD GENERATION BECOMES NETWORK
if (phase === 3) {
learners3.forEach((learner, idx) => {
learner.material.opacity = Math.min(0.7, learner.material.opacity + 0.01);
learner.userData.active = true;
const pulse = Math.sin(time * 2 + idx * 0.05) * 0.1 + 1.0;
learner.scale.set(pulse, pulse, pulse);
});
connections.filter(c => learners3.includes(c.to)).forEach(conn => {
conn.line.material.opacity = Math.min(0.3, conn.line.material.opacity + 0.01);
const positions = conn.line.geometry.attributes.position.array;
positions[0] = conn.from.position.x;
positions[1] = conn.from.position.y;
positions[2] = conn.from.position.z;
positions[3] = conn.to.position.x;
positions[4] = conn.to.position.y;
positions[5] = conn.to.position.z;
conn.line.geometry.attributes.position.needsUpdate = true;
});
if (time > 20) phase = 4;
}
// PHASE 4: BODY DIES, PATTERN LIVES
if (phase === 4) {
// Source fades (body dies)
sourceMaterial.opacity *= 0.98;
patternMaterial.opacity *= 0.97;
// Death ring appears
deathMaterial.opacity = Math.min(0.6, deathMaterial.opacity + 0.02);
death.rotation.z += 0.01;
// But network continues STRONGER
[...learners1, ...learners2, ...learners3].forEach(learner => {
learner.material.opacity = Math.min(1, learner.material.opacity + 0.005);
// Brightens
const brightness = Math.min(1, (time - 20) * 0.02);
learner.material.color.r = 1;
learner.material.color.g = 0.8 + brightness * 0.2;
learner.material.color.b = 0 + brightness * 0.3;
});
// Connections strengthen
connections.forEach(conn => {
conn.line.material.opacity = Math.min(0.8, conn.line.material.opacity + 0.005);
});
if (time > 26) phase = 5;
}
// PHASE 5: IMMORTALITY THROUGH PATTERN
if (phase === 5) {
// Source completely gone
sourceMaterial.opacity = 0;
source.scale.set(0, 0, 0);
// Network pulses as ONE
const networkPulse = Math.sin(time * 1.5) * 0.2 + 1.0;
[...learners1, ...learners2, ...learners3].forEach(learner => {
learner.scale.set(networkPulse, networkPulse, networkPulse);
});
// Death ring fades
deathMaterial.opacity *= 0.99;
// Pattern LIVES in the network
// Original person is "reincarnated" in everyone who carries the pattern
}
// Camera orbit
camera.position.x = Math.sin(time * 0.05) * 700;
camera.position.y = Math.cos(time * 0.04) * 500;
camera.position.z = 400;
camera.lookAt(0, 0, 0);
renderer.render(scene, camera);
}
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
camera.position.z = 700;
animate();
</script>
</body>
</html>