mirror of
				https://github.com/taigrr/skyline
				synced 2025-01-18 04:33:13 -08:00 
			
		
		
		
	Initial commit
This commit is contained in:
		
							parent
							
								
									6d38b020c3
								
							
						
					
					
						commit
						779ca25dc6
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					.DS_Store
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Logs
 | 
					# Logs
 | 
				
			||||||
logs
 | 
					logs
 | 
				
			||||||
*.log
 | 
					*.log
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								gulpfile.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								gulpfile.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					const gulp = require('gulp')
 | 
				
			||||||
 | 
					const bs = require('browser-sync').create()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('browser-sync', function() {
 | 
				
			||||||
 | 
					    bs.init({
 | 
				
			||||||
 | 
					        server: {
 | 
				
			||||||
 | 
					            baseDir: "./"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulp.task('watch', ['browser-sync'], function () {
 | 
				
			||||||
 | 
					  gulp.watch("css/*.css").on('change', bs.reload)
 | 
				
			||||||
 | 
					  gulp.watch("js/*.js").on('change', bs.reload)
 | 
				
			||||||
 | 
					  gulp.watch("*.html").on('change', bs.reload)
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
						<head>
 | 
				
			||||||
 | 
							<meta charset="utf-8">
 | 
				
			||||||
 | 
							<title>3D GitHub Contributions</title>
 | 
				
			||||||
 | 
							<style>
 | 
				
			||||||
 | 
					      body { margin: 0; }
 | 
				
			||||||
 | 
								canvas { display: block; }
 | 
				
			||||||
 | 
							</style>
 | 
				
			||||||
 | 
						</head>
 | 
				
			||||||
 | 
						<body>
 | 
				
			||||||
 | 
					    <script type="module" src="js/contributions.js"></script>
 | 
				
			||||||
 | 
						</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										3507
									
								
								js/GLTFLoader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3507
									
								
								js/GLTFLoader.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1188
									
								
								js/OrbitControls.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1188
									
								
								js/OrbitControls.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										162
									
								
								js/contributions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								js/contributions.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,162 @@
 | 
				
			|||||||
 | 
					import * as THREE from "./three.module.js";
 | 
				
			||||||
 | 
					import { GLTFLoader } from './GLTFLoader.js';
 | 
				
			||||||
 | 
					import { OrbitControls } from './OrbitControls.js';
 | 
				
			||||||
 | 
					import { GUI } from './dat.gui.module.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const BASE_LENGTH = 0.834
 | 
				
			||||||
 | 
					const BASE_WIDTH = 0.167
 | 
				
			||||||
 | 
					const BASE_HEIGHT = 0.05
 | 
				
			||||||
 | 
					const CUBE_SIZE = 0.0143
 | 
				
			||||||
 | 
					const MAX_HEIGHT = 0.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let username = "jasonlong"
 | 
				
			||||||
 | 
					let year = "2018"
 | 
				
			||||||
 | 
					let json = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let camera, scene, renderer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var urlParams = new URLSearchParams(window.location.search);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (urlParams.has('username')) {
 | 
				
			||||||
 | 
					  username = urlParams.get('username')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (urlParams.has('year')) {
 | 
				
			||||||
 | 
					  year = urlParams.get('year')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Import JSON data
 | 
				
			||||||
 | 
					async function loadJSON(username, year) {
 | 
				
			||||||
 | 
					  let url = `https://json-contributions.vercel.app/api/user?username=${username}&year=${year}`
 | 
				
			||||||
 | 
					  let response = await fetch(url)
 | 
				
			||||||
 | 
					  if (response.ok) {
 | 
				
			||||||
 | 
					    json = await response.json()
 | 
				
			||||||
 | 
					    init()
 | 
				
			||||||
 | 
					    render()
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    alert("HTTP-Error: " + response.status)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loadJSON(username, year)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const init = () => {
 | 
				
			||||||
 | 
					  // SCENE
 | 
				
			||||||
 | 
					  scene = new THREE.Scene()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // CAMERA
 | 
				
			||||||
 | 
					  camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // RENDERER
 | 
				
			||||||
 | 
					  renderer = new THREE.WebGLRenderer({ antialias: true })
 | 
				
			||||||
 | 
					  renderer.setPixelRatio( window.devicePixelRatio )
 | 
				
			||||||
 | 
					  renderer.setSize( window.innerWidth, window.innerHeight )
 | 
				
			||||||
 | 
					  renderer.outputEncoding = THREE.sRGBEncoding
 | 
				
			||||||
 | 
					  renderer.setClearColor(0xffffff, 1)
 | 
				
			||||||
 | 
					  document.body.appendChild(renderer.domElement)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // MATERIALS
 | 
				
			||||||
 | 
					  let phongMaterial = new THREE.MeshPhongMaterial( { color: 0x40c463, transparent: true, opacity: 0.2, side: THREE.DoubleSide } )
 | 
				
			||||||
 | 
					  let bronzeMaterial = new THREE.MeshPhysicalMaterial( { color: 0x645f61, metalness: 1, clearcoat: 0.5, clearcoatRoughness: 0.5, side: THREE.DoubleSide } )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // LIGHTS
 | 
				
			||||||
 | 
					  const dLight1 = new THREE.DirectionalLight(0xebeb8c, 0.8)
 | 
				
			||||||
 | 
					  dLight1.position.set(-2, -5, 5);
 | 
				
			||||||
 | 
					  dLight1.target.position.set(0, 0, 0);
 | 
				
			||||||
 | 
					  const dLight2 = new THREE.DirectionalLight(0xebeb8c, 0.8)
 | 
				
			||||||
 | 
					  dLight2.position.set(2, -5, 5);
 | 
				
			||||||
 | 
					  dLight2.target.position.set(0, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  scene.add(dLight1)
 | 
				
			||||||
 | 
					  scene.add(dLight2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // LOAD REFERENCE MODEL
 | 
				
			||||||
 | 
					  let loader = new GLTFLoader().setPath('../models/')
 | 
				
			||||||
 | 
					  loader.load('ashtom-orig.glb', function (gltf) {
 | 
				
			||||||
 | 
					    gltf.scene.traverse(function (child) {
 | 
				
			||||||
 | 
					      if (child.isMesh) {
 | 
				
			||||||
 | 
					        child.material = phongMaterial
 | 
				
			||||||
 | 
					        child.material.depthWrite = !child.material.transparent
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gltf.scene.rotation.x = Math.PI/2
 | 
				
			||||||
 | 
					    gltf.scene.rotation.y = -Math.PI
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // let worldAxis = new THREE.AxesHelper(2);
 | 
				
			||||||
 | 
					    // scene.add(worldAxis)
 | 
				
			||||||
 | 
					    render()
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // BASE GEOMETRY
 | 
				
			||||||
 | 
					  let baseLoader = new GLTFLoader().setPath('../models/')
 | 
				
			||||||
 | 
					  baseLoader.load('base.glb', function (base) {
 | 
				
			||||||
 | 
					    base.scene.traverse(function (child) {
 | 
				
			||||||
 | 
					      if (child.isMesh) {
 | 
				
			||||||
 | 
					        child.material = bronzeMaterial
 | 
				
			||||||
 | 
					        child.material.depthWrite = !child.material.transparent
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base.scene.rotation.x = -Math.PI/2
 | 
				
			||||||
 | 
					    base.scene.rotation.z = -Math.PI
 | 
				
			||||||
 | 
					    scene.add(base.scene)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // CONTRIBUTION BARS
 | 
				
			||||||
 | 
					  let barGroup = new THREE.Group()
 | 
				
			||||||
 | 
					  let maxCount = json.max
 | 
				
			||||||
 | 
					  let x = 0
 | 
				
			||||||
 | 
					  let y = 0
 | 
				
			||||||
 | 
					  json.contributions.forEach(week => {
 | 
				
			||||||
 | 
					    y = (CUBE_SIZE * 7) 
 | 
				
			||||||
 | 
					    week.days.forEach(day => {
 | 
				
			||||||
 | 
					      console.log(day.date)
 | 
				
			||||||
 | 
					      console.log(day.count)
 | 
				
			||||||
 | 
					      y -= CUBE_SIZE
 | 
				
			||||||
 | 
					      let height = (MAX_HEIGHT / maxCount * day.count).toFixed(4)
 | 
				
			||||||
 | 
					      // console.log(height)
 | 
				
			||||||
 | 
					      let geometry = new THREE.BoxGeometry(CUBE_SIZE, CUBE_SIZE, height)
 | 
				
			||||||
 | 
					      let cube = new THREE.Mesh(geometry, bronzeMaterial)
 | 
				
			||||||
 | 
					      cube.position.x = x
 | 
				
			||||||
 | 
					      cube.position.y = y
 | 
				
			||||||
 | 
					      cube.position.z = BASE_HEIGHT / 2 + height / 2
 | 
				
			||||||
 | 
					      barGroup.add(cube)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    x += CUBE_SIZE
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  const groupBox = new THREE.Box3().setFromObject(barGroup)
 | 
				
			||||||
 | 
					  const groupCenter = groupBox.getCenter(new THREE.Vector3())
 | 
				
			||||||
 | 
					  barGroup.position.x -= groupCenter.x
 | 
				
			||||||
 | 
					  barGroup.position.y -= groupCenter.y 
 | 
				
			||||||
 | 
					  scene.add(barGroup)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const box = new THREE.Box3().setFromObject(scene)
 | 
				
			||||||
 | 
					  const center = box.getCenter(new THREE.Vector3())
 | 
				
			||||||
 | 
					  camera.lookAt(center)
 | 
				
			||||||
 | 
					  camera.position.y = -0.4
 | 
				
			||||||
 | 
					  camera.position.z = 0.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let controls = new OrbitControls(camera, renderer.domElement)
 | 
				
			||||||
 | 
					  controls.autoRotate = false
 | 
				
			||||||
 | 
					  controls.screenSpacePanning = true
 | 
				
			||||||
 | 
					  controls.addEventListener('change', render);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const render = () => {
 | 
				
			||||||
 | 
					  renderer.render(scene, camera)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Event listeners
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					const onWindowResize = () => {
 | 
				
			||||||
 | 
					  let canvasWidth = window.innerWidth;
 | 
				
			||||||
 | 
					  let canvasHeight = window.innerHeight;
 | 
				
			||||||
 | 
					  renderer.setSize( canvasWidth, canvasHeight );
 | 
				
			||||||
 | 
					  camera.aspect = canvasWidth / canvasHeight;
 | 
				
			||||||
 | 
					  camera.updateProjectionMatrix();
 | 
				
			||||||
 | 
					  render()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					window.addEventListener('resize', onWindowResize, false)
 | 
				
			||||||
							
								
								
									
										3575
									
								
								js/dat.gui.module.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3575
									
								
								js/dat.gui.module.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										51534
									
								
								js/three.module.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51534
									
								
								js/three.module.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								models/ashtom-orig.glb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								models/ashtom-orig.glb
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								models/base.glb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								models/base.glb
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5496
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										5496
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										11
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "3d-contributions",
 | 
				
			||||||
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "browser-sync": "^2.18.2",
 | 
				
			||||||
 | 
					    "gulp": "^3.9.1",
 | 
				
			||||||
 | 
					    "gulp-watch": "^4.3.11"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "three": "^0.118.1"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user