|  |  | @ -4,6 +4,7 @@ import axios from "axios"; | 
			
		
	
		
			
				
					|  |  |  | import { SpotLight } from "three"; | 
			
		
	
		
			
				
					|  |  |  | import * as TWEEN from "@tweenjs/tween.js"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { AppString } from "@/constants/app"; | 
			
		
	
		
			
				
					|  |  |  | import { createCamera } from "./components/camera.js"; | 
			
		
	
		
			
				
					|  |  |  | import { createLights } from "./components/lights.js"; | 
			
		
	
		
			
				
					|  |  |  | import { createScene } from "./components/scene.js"; | 
			
		
	
	
		
			
				
					|  |  | @ -12,8 +13,8 @@ import { Loop } from "./systems/Loop.js"; | 
			
		
	
		
			
				
					|  |  |  | import { Resizer } from "./systems/Resizer.js"; | 
			
		
	
		
			
				
					|  |  |  | import { createControls } from "./systems/controls.js"; | 
			
		
	
		
			
				
					|  |  |  | import { createRenderer } from "./systems/renderer.js"; | 
			
		
	
		
			
				
					|  |  |  | import { AppString } from "@/constants/app"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const ANIMATION_DURATION_SECS = 10; | 
			
		
	
		
			
				
					|  |  |  | const BASE32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; | 
			
		
	
		
			
				
					|  |  |  | const COLOR1 = "#42b883"; | 
			
		
	
		
			
				
					|  |  |  | const COLOR2 = "#0055aa"; | 
			
		
	
	
		
			
				
					|  |  | @ -22,7 +23,7 @@ const PLATFORM_EDGE_FOR_UNKNOWNS = 10; | 
			
		
	
		
			
				
					|  |  |  | const PLATFORM_SIZE = 100; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | function createLight() { | 
			
		
	
		
			
				
					|  |  |  |   const light = new SpotLight(0xffffff, 100, 0, Math.PI / 8, 0.5, 0); | 
			
		
	
		
			
				
					|  |  |  |   const light = new SpotLight(0xffffff, 0, 0, Math.PI / 8, 0.5, 0); | 
			
		
	
		
			
				
					|  |  |  |   // eslint-disable-next-line @typescript-eslint/no-empty-function
 | 
			
		
	
		
			
				
					|  |  |  |   light.tick = () => {}; | 
			
		
	
		
			
				
					|  |  |  |   return light; | 
			
		
	
	
		
			
				
					|  |  | @ -92,42 +93,53 @@ class World { | 
			
		
	
		
			
				
					|  |  |  |   async loadClaims() { | 
			
		
	
		
			
				
					|  |  |  |     const endorserApiServer = AppString.DEFAULT_ENDORSER_API_SERVER; | 
			
		
	
		
			
				
					|  |  |  |     try { | 
			
		
	
		
			
				
					|  |  |  |       const url = endorserApiServer + "/api/v2/report/claims"; | 
			
		
	
		
			
				
					|  |  |  |       const url = | 
			
		
	
		
			
				
					|  |  |  |         endorserApiServer + "/api/v2/report/claims?claimType=GiveAction"; | 
			
		
	
		
			
				
					|  |  |  |       const headers = { "Content-Type": "application/json" }; | 
			
		
	
		
			
				
					|  |  |  |       const resp = await axios.get(url, { headers: headers }); | 
			
		
	
		
			
				
					|  |  |  |       if (resp.status === 200) { | 
			
		
	
		
			
				
					|  |  |  |         resp.data.data.map((claim) => { | 
			
		
	
		
			
				
					|  |  |  |         const minDate = resp.data.data[resp.data.data.length - 1].issuedAt; | 
			
		
	
		
			
				
					|  |  |  |         const maxDate = resp.data.data[0].issuedAt; | 
			
		
	
		
			
				
					|  |  |  |         const minTimeMillis = new Date(minDate).getTime(); | 
			
		
	
		
			
				
					|  |  |  |         const fullTimeMillis = new Date(maxDate).getTime() - minTimeMillis; | 
			
		
	
		
			
				
					|  |  |  |         // ratio of animation time to real time
 | 
			
		
	
		
			
				
					|  |  |  |         const fakeRealRatio = (ANIMATION_DURATION_SECS * 1000) / fullTimeMillis; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // calculate when lights shine on appearing claim area
 | 
			
		
	
		
			
				
					|  |  |  |         for (const claim of resp.data.data) { | 
			
		
	
		
			
				
					|  |  |  |           // claim is a GiveServerRecord (see endorserServer.ts)
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |           // compute location for this claim
 | 
			
		
	
		
			
				
					|  |  |  |           const randomness = claim.id.substring(10); | 
			
		
	
		
			
				
					|  |  |  |           const x = | 
			
		
	
		
			
				
					|  |  |  |             (100 * BASE32.indexOf(randomness.substring(0, 1))) / 32 - 50; | 
			
		
	
		
			
				
					|  |  |  |           const z = | 
			
		
	
		
			
				
					|  |  |  |             (100 * BASE32.indexOf(randomness.substring(8, 9))) / 32 - 50; | 
			
		
	
		
			
				
					|  |  |  |           console.log( | 
			
		
	
		
			
				
					|  |  |  |             "randomness", | 
			
		
	
		
			
				
					|  |  |  |             randomness, | 
			
		
	
		
			
				
					|  |  |  |             randomness.substring(0, 1), | 
			
		
	
		
			
				
					|  |  |  |             BASE32.indexOf(randomness.substring(0, 1)), | 
			
		
	
		
			
				
					|  |  |  |             x, | 
			
		
	
		
			
				
					|  |  |  |             randomness.substring(8, 9), | 
			
		
	
		
			
				
					|  |  |  |             BASE32.indexOf(randomness.substring(8, 9)), | 
			
		
	
		
			
				
					|  |  |  |             z | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |           const light = createLight(); | 
			
		
	
		
			
				
					|  |  |  |           light.position.set(x, 20, z); | 
			
		
	
		
			
				
					|  |  |  |           light.target.position.set(x, 0, z); | 
			
		
	
		
			
				
					|  |  |  |           this.loop.updatables.push(light); | 
			
		
	
		
			
				
					|  |  |  |           this.scene.add(light); | 
			
		
	
		
			
				
					|  |  |  |           this.scene.add(light.target); | 
			
		
	
		
			
				
					|  |  |  |           new TWEEN.Tween(light.position) | 
			
		
	
		
			
				
					|  |  |  |             .to({ y: 5 }, 1000) | 
			
		
	
		
			
				
					|  |  |  |             .start() | 
			
		
	
		
			
				
					|  |  |  |             .onComplete(() => { | 
			
		
	
		
			
				
					|  |  |  |               this.scene.remove(light); | 
			
		
	
		
			
				
					|  |  |  |               light.dispose(); | 
			
		
	
		
			
				
					|  |  |  |             }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |           // now figure out the timing and shine a light
 | 
			
		
	
		
			
				
					|  |  |  |           const timeDelayMillis = | 
			
		
	
		
			
				
					|  |  |  |             fakeRealRatio * | 
			
		
	
		
			
				
					|  |  |  |             (new Date(claim.issuedAt).getTime() - minTimeMillis); | 
			
		
	
		
			
				
					|  |  |  |           new TWEEN.Tween(light) | 
			
		
	
		
			
				
					|  |  |  |             .delay(timeDelayMillis) | 
			
		
	
		
			
				
					|  |  |  |             .to({ intensity: 100 }, 10) | 
			
		
	
		
			
				
					|  |  |  |             .chain( | 
			
		
	
		
			
				
					|  |  |  |               new TWEEN.Tween(light.position) | 
			
		
	
		
			
				
					|  |  |  |                 .to({ y: 5 }, 1000) | 
			
		
	
		
			
				
					|  |  |  |                 .onComplete(() => { | 
			
		
	
		
			
				
					|  |  |  |                   this.scene.remove(light); | 
			
		
	
		
			
				
					|  |  |  |                   light.dispose(); | 
			
		
	
		
			
				
					|  |  |  |                 }) | 
			
		
	
		
			
				
					|  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |             .start(); | 
			
		
	
		
			
				
					|  |  |  |           this.lights = [...this.lights, light]; | 
			
		
	
		
			
				
					|  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         console.log("done adding cube"); | 
			
		
	
		
			
				
					|  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |         console.log( | 
			
		
	
	
		
			
				
					|  |  | 
 |