game.objects.pinwheel.cameraY = 9999;
scene.add(game.objects.pinwheel);
- game.objects.words = [];
- game.objects.words.collectedCount = 0;
- game.assets.fonts.geometry = {};
- let letterMaterial = new THREE.MeshStandardMaterial({
- color: 0xffffff,
- emissive: 0x606060,
- roughness: 0.4,
- metalness: 1,
- });
- const interWordDistance = new THREE.Vector3();
- let placementSuccess;
- for(let i = 0; i < 100; i++) {
- let angleInCourse;
- let clusteringFunction = (val) => Math.max(0.15 + val / 2, 0.7 - 3 * Math.pow(0.75 - 2 * val, 2), 1 - 3 * Math.pow(1 - val, 2));
- do {
- angleInCourse = Math.random();
- } while(clusteringFunction(angleInCourse) < Math.random());
- angleInCourse = (0.08 + 0.87 * angleInCourse);
- if(i == 0) {
- angleInCourse = 0.05;
- }
- let randomCameraX = game.courseRadius * Math.sin(angleInCourse * 2 * Math.PI);
- let randomCameraY = game.courseRadius * -Math.cos(angleInCourse * 2 * Math.PI);
- let word = new THREE.Group();
- word.text = getRandomWord();
- for(let letter of word.text) {
- if(!(letter in game.assets.fonts.geometry)) {
- game.assets.fonts.geometry[letter] = new TextGeometry(letter, {
- font: game.assets.fonts.cookie,
- size: 0.2,
- depth: 0.03,
- curveSegments: 2,
- bevelEnabled: false,
- });
- game.assets.fonts.geometry[letter].computeBoundingBox();
- let bbox = game.assets.fonts.geometry[letter].boundingBox;
- // Add these to local 0,0 later to get the letter's center rotation point
- game.assets.fonts.geometry[letter].dx = (bbox.max.x - bbox.min.x) / 2;
- game.assets.fonts.geometry[letter].dy = (bbox.max.y - bbox.min.y) / 2;
- }
- let mesh = new THREE.Mesh(game.assets.fonts.geometry[letter], letterMaterial);
- let container = new THREE.Group();
- mesh.position.set(-game.assets.fonts.geometry[letter].dx, -game.assets.fonts.geometry[letter].dy, 0);
- container.add(mesh);
- word.add(container);
- }
- word.randomAnimOffset = Math.random();
- const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
- let attempts = 0;
- do {
- let randomPlacementRadius = Math.min(0.8, angleInCourse) * Math.tan(vFOV / 2) * Math.abs(word.position.z - game.view.camera.position.z);
- if(i == 0) {
- randomPlacementRadius = 0;
- }
- let randomPlacementAngle = Math.random() * 2 * Math.PI;
- let randomPlacementX = Math.sin(randomPlacementAngle) * randomPlacementRadius;
- let randomPlacementY = Math.cos(randomPlacementAngle) * randomPlacementRadius;
- word.mapPos = new THREE.Vector3(
- randomCameraX + randomPlacementX,
- randomCameraY + randomPlacementY,
- 0,
- );
- placementSuccess = true;
- for(let j = 0; j < i; j++) {
- if(interWordDistance.subVectors(word.mapPos, game.objects.words[j].mapPos).length() <= 1.2) {
- placementSuccess = false;
- break;
- }
- }
- attempts += 1;
- if(attempts >= 10) {
- angleInCourse = 0.04 + 0.92 * Math.random();
- attempts = 0;
- }
- } while(!placementSuccess);
- scene.add(word);
- game.objects.words.push(word);
- }
-
game.objects.clouds = [];
const cloudGeometry = new THREE.PlaneGeometry(1, 200 / 350);
const cloudShaders = {
game.view.camera.position.set(-5, -game.courseRadius, game.view.camera.position.z);
game.view.scene = scene;
+
+ reset(game);
function pinwheelPositionUpdate(game, viewportX, viewportY) {
const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
game.objects.feather.position.set(-11.45, -game.courseRadius - 4.2, -6.6);
game.objects.feather.rotation.set(Math.PI, 0, Math.PI / 2.1);
game.objects.pinwheel.material[4].opacity = 0.0;
+ game.ui.root.querySelector('.ui-page.title').classList.remove('end');
+
+ if(game.objects.words) {
+ for(let word of game.objects.words) {
+ game.view.scene.remove(word);
+ }
+ }
+ game.objects.words = [];
game.objects.words.collectedCount = 0;
- for(let word of game.objects.words) {
- word.collected = null;
+ game.assets.fonts.geometry = {};
+ let letterMaterial = new THREE.MeshStandardMaterial({
+ color: 0xffffff,
+ emissive: 0x606060,
+ roughness: 0.4,
+ metalness: 1,
+ });
+ const interWordDistance = new THREE.Vector3();
+ let placementSuccess;
+ for(let i = 0; i < 100; i++) {
+ let angleInCourse;
+ let clusteringFunction = (val) => Math.max(0.15 + val / 2, 0.7 - 3 * Math.pow(0.75 - 2 * val, 2), 1 - 3 * Math.pow(1 - val, 2));
+ do {
+ angleInCourse = Math.random();
+ } while(clusteringFunction(angleInCourse) < Math.random());
+ angleInCourse = (0.08 + 0.87 * angleInCourse);
+ if(i == 0) {
+ angleInCourse = 0.05;
+ }
+ let randomCameraX = game.courseRadius * Math.sin(angleInCourse * 2 * Math.PI);
+ let randomCameraY = game.courseRadius * -Math.cos(angleInCourse * 2 * Math.PI);
+ let word = new THREE.Group();
+ word.text = getRandomWord();
+ for(let letter of word.text) {
+ if(!(letter in game.assets.fonts.geometry)) {
+ game.assets.fonts.geometry[letter] = new TextGeometry(letter, {
+ font: game.assets.fonts.cookie,
+ size: 0.2,
+ depth: 0.03,
+ curveSegments: 2,
+ bevelEnabled: false,
+ });
+ game.assets.fonts.geometry[letter].computeBoundingBox();
+ let bbox = game.assets.fonts.geometry[letter].boundingBox;
+ // Add these to local 0,0 later to get the letter's center rotation point
+ game.assets.fonts.geometry[letter].dx = (bbox.max.x - bbox.min.x) / 2;
+ game.assets.fonts.geometry[letter].dy = (bbox.max.y - bbox.min.y) / 2;
+ }
+ let mesh = new THREE.Mesh(game.assets.fonts.geometry[letter], letterMaterial);
+ let container = new THREE.Group();
+ mesh.position.set(-game.assets.fonts.geometry[letter].dx, -game.assets.fonts.geometry[letter].dy, 0);
+ container.add(mesh);
+ word.add(container);
+ }
+ word.randomAnimOffset = Math.random();
+ const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
+ let attempts = 0;
+ do {
+ let randomPlacementRadius = Math.min(0.8, angleInCourse) * Math.tan(vFOV / 2) * Math.abs(word.position.z - game.view.camera.position.z);
+ if(i == 0) {
+ randomPlacementRadius = 0;
+ }
+ let randomPlacementAngle = Math.random() * 2 * Math.PI;
+ let randomPlacementX = Math.sin(randomPlacementAngle) * randomPlacementRadius;
+ let randomPlacementY = Math.cos(randomPlacementAngle) * randomPlacementRadius;
+ word.mapPos = new THREE.Vector3(
+ randomCameraX + randomPlacementX,
+ randomCameraY + randomPlacementY,
+ 0,
+ );
+ placementSuccess = true;
+ for(let j = 0; j < i; j++) {
+ if(interWordDistance.subVectors(word.mapPos, game.objects.words[j].mapPos).length() <= 1.2) {
+ placementSuccess = false;
+ break;
+ }
+ }
+ attempts += 1;
+ if(attempts >= 10) {
+ angleInCourse = 0.04 + 0.92 * Math.random();
+ attempts = 0;
+ }
+ } while(!placementSuccess);
+ game.view.scene.add(word);
+ game.objects.words.push(word);
}
- game.ui.root.querySelector('.ui-page.title').classList.remove('end');
}
function animate(game, renderer, scene) {