HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by esm.sh, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ESM usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
<base target="_parent">
<div id="canvas-container"></div>
<div id="ui">
<div class="positioner">
<div></div>
<div class="speech-bubble">
<div id="bubble">
<span id="text">Oh no! Look at this dull room, not at all Christmassy.</span>
<span id="text-highlight"></span>
<div id="next">Next</div>
</div>
</div>
<img id="steve" src="https://assets.codepen.io/557388/sad.svg" alt="Steve">
</div>
</div>
<div id="loading">Loading</div>
@import url('https://fonts.googleapis.com/css2?family=Fredoka+One&display=swap');
*
{
font-family: 'Fredoka One', sans-serif;
}
html, body
{
width: 100%;
min-height: 100%;
margin: 0;
padding: 0;
font-size: 20px;
}
body
{
background: #eee;
background: linear-gradient(to left, #ddd , #eee);
position: relative;
overflow: hidden;
}
.page
{
z-index: 2;
position: relative;
width: calc(80vw - 80px);
padding: 20px 40px;
margin: 0;
}
#canvas-container
{
position: absolute;
top: 0;
left: 0;
z-index: 1;
}
.spacer
{
display: block;
width: 100%;
height: 40vh;
}
.status
{
font-size: 3rem;
}
#loading
{
position: absolute;
background-color: #3A3F69;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 3rem;
font-family: 'Fredoka One', cursive;
}
#ui
{
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 5;
user-select: none;
.positioner
{
width: 130vh;
max-width: 100vw;
height: 100vh;
margin: 0 auto;
display: grid;
grid-template-columns: 100px 1fr 200px;
align-items: flex-end;
}
.speech-bubble
{
display: flex;
justify-content: flex-end;
}
#bubble
{
padding: 1.5rem 2rem;
width: calc(100% - 4rem);
max-width: calc(400px - 4rem);
background-color: white;
border-radius: 1.7rem;
margin-bottom: 3rem;
position: relative;
cursor: pointer;
&::after
{
content: '';
width: 0;
height: 0;
border-top: 1rem solid transparent;
border-bottom: 1rem solid transparent;
border-left:1rem solid white;
position: absolute;
left: calc(100% - 0.25rem);
bottom: 1rem;
}
}
}
#text-highlight
{
font-size: 1.5rem;
display: inline-block;
}
#next
{
// opacity: 0;
color: #505050;
font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
text-align: right;
margin-top: 1rem;
transition: opacity 0.2s ease-in-out;
display: none;
}
#steve
{
width: 100%;
}
.waiting
{
#next
{
// display: block;
}
}
.game
{
cursor: url(https://assets.codepen.io/557388/crosshair.svg) 41 41, auto;
}
let showGuides = false;
// 👆 change to true to see the physics objects
let extraBounce = 0.1;
// 👆 change to 1 for bouncey fun! Change to 2 for everything to bounce out of existence!
let powerMultiplier = 1.2 ;
// 👆 increase for more POWER!
import {
TextureLoader, RepeatWrapping,
Scene, Color, Fog, HemisphereLight,
PointLight, MeshPhongMaterial, Mesh,
PlaneBufferGeometry, WebGLRenderer,
PerspectiveCamera, Vector3,
Group, BoxBufferGeometry, IcosahedronBufferGeometry,
CylinderBufferGeometry, Cache, PCFSoftShadowMap,
LoadingManager, AxisHelper, Clock
} from "https://cdn.skypack.dev/three@0.122.0";
import { GLTFLoader } from "https://cdn.skypack.dev/three@0.122.0/examples/jsm/loaders/GLTFLoader";
import Stats from "https://cdn.skypack.dev/three@0.122.0/examples/jsm/libs/stats.module";
import CANNON from "https://cdn.skypack.dev/cannon@0.6.2";
import gsap from "https://cdn.skypack.dev/gsap@3.5.1";
class Stage
{
constructor(scale, stageSize, onReady, showStats)
{
const manager = new LoadingManager();
this.showStats = showStats;
this.models = {};
this.stats = new Stats();
manager.onLoad = function ( ) {
console.log( 'Loading complete!');
setTimeout(() => onReady(), 100);
};
this.wrappingImages = [
'data:image/png;base64,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',
'data:image/png;base64,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',
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAALh0lEQVR4Xu2da0xcxxWAD699AGsWzGNxgw3YGDv2JigOBcuWoM4PbNWFuorkEEu1asUJVGoj0yatU7UOP1yrbWSaqhJ24jShUsCWkBBuKuLKscGqVRyXaCMDwbiQpanMAgZvYHksD7s611nMY5e9d+/cuXO5MxJCsDNzz5zzzTnzurNhHYXPPQRK6WL5EIzYZik9jY3HFFcnQoIrig1h/EgRRhOAznwPfLpvjFllkBYs1h0Bz1clk66WaH1UARixzcDF8ntEG8ByZZscZtjdYGVZRKAKAGqi/tggeKxzTCuFlHB76uJhfZeJVHWK1EMdgJv7RqEjf1yRxrBWaempFDBOhbMm1iJ5qAOglzCQ4IqE4uokpo2PwlEHQC9hYFtrDOQ2reEA+NOAHsKAFuK/ah7AY52F+mNDzPcOOQJqIf6rBgA+eDUvCmkl/qsKwGpeFNJK/FcVgGnTA6g9PiDHyzJbdleDFbIcZmblWyiYKrMAnwAzLxfB9S3t4Bz7tyaUJUZIc6QFDpxOAMPwtJjsqudRFQBzXh4k//pX4Bxrg5b+c5oGAQ2fl/wC5EaXwNCho6obVqwAqgKAQj7xl3chIjlFkLd1oBauuc7B5Ky2Noy2xBdC8frfAELgvdUOruNviNW/6vlUByCu9AWwHnpxXhGuiW74650yTUCABkfDIwC+5P6wFr6uO6+6YcUKoDoAkSnJ8K33zi2SVwsQoPF/mHUGbNGbF8l+r+qPMP7JFbH6Vz2f6gAkHH0JLCXFyxTRdb8ZLvS+prqCAgnwytYPlxkf80739oLrl2/Aw4kJZmVXfRYQmZwE5vw8iPt+yXz896etmu5yJgeGe9MqIC+5NKCBH46Pg+fyJzB2+TLMfOlkGgQqHiAqIx0MmZlgfsoOJvv2FY2+UFs4O6jpLmNKgejysfeLTQjDRGsreHt6YLr3S/C2d4gtSiUfMQDQyOExMWDIzIDwmFgwbsyEiORkwfBy0tvtJeD23pVTBdGyBze+BVusBbLqxDAxNzgI3p5eeDDuEcDAv2cH6e+P+AXAZ8yFrTTZ7fN/onHRyJiM9u2ylBGs8KX/VQnTQxYSDvxef1r5AR5OJTEhHAiJL03durVIDSSgCfN4xqmdCg7FiI7hv0Oj881QihIvk5O4H0o2nCBer5oVMg+Ac7QNau6wMQ4INvhT05ChPpt5ADD+4ziAhXQ46wykr9nBgijEZGAeAGxpZVsusQbLqejV7Y1gNa6TUwVzZTkAEkxyYsdNCbm1kZUDIMFOHAAJyiKZlZUQwAEgaVUJdXEAJChLYlYeAiQojHsACcoildU1cQfOfvH4vACpekOphwMQitZklmFpIeiVrbVgi86S2SK2ijMfAlgCgC8EqQAvB0BZpXMPIEG/3ANIUBaprNwDkNKk/3q4B5CgX+4BJCiLVNbmu+9CS/87pKqTVU9B6stQuE47L32IaSzzHoClI2F4Iuin2xrBFGkRo1tN5GEagMa+SnDc+4gpReKhUAwFqwUCJgHA1b/GvjcBXxBhMeGZgKInKmQfDmWhbUwBgIa/MVTLXK8PZKh0y7Pw9Nr9kLP2uyzYMiQZVAcAjd7lbobPRz5i6vi3FG3i2CDbWgDZcYWQHvuMpsIDVQDc3n7ByE7PZ9Dn+QwGJm9r4iVQKTBgXhwnCD/mzZBi2sz0OULiAODCDaaBqW6YnPUIv6dmPUy+4iXVsHLyo5dIMWcLYBjDY4WzhdYoG5gi16i6wRTWfvfaiu8F+Ay5sPFfz9wFt9c1/6/VdMOHHCPLLStAYXh86NQHy8J68X+m8Ecv5ZBIYa+1PMn0iyEkGsnrCKwBDoDO6eAAcAB4CNAzA9wD6Nn6eFs4HwTqmwAOgL7tzz2Azu3PAeAA8IUgXTPAxwC6Nj+fBejc/BwADgBfB9A3A3wMoG/782mgzu3PAeAA8HUAXTPAxwC6Nj+fBurc/BwADgBfB9A3A3wMoG/782mgzu3PAeAA8HUAXTPAxwC6Nj+fBurc/CsAkOCKhARXFMS6IyBqMgwSXIZ5ZeFnxqlw8JoewIhtdpESBzK84LHOgSd+Du6nzIDXxF89ZJmy+RBg6zNAWqdRMHSq87Gx5Qrvsc6CK30aXBnTwm+Egyd2NBDWVLbrYYrTIPRoGgmB6Nw5Af/dMsVhoKHwFZ6xyWEGYt8cGkpbRmwz0LlzHP6TMxlKcV4mBA1gSM+5GgtpXSah06sKgE9+n1fozB+X1CRTxKP7+qbmxiSV02PmVKcRtv4rGtZ3mRY1nwkAFoJw/cAo9Kd7l9kIjb3B8oxwNVt2XAGYI9csyjM5OyrcO4QXTt12X+NQfKMd7PG7GqwBx3VMAeCzaEe+B27ue9yr8avaC1JfWmb0QD0ZYbgxdB5uDJzXLQjGqTB46mosbGtd+ToZJgFAw+IgsfNIEhzc+IeQv6wRQbjQ8zr0eR5dXKWXhG5+V0OcqIE9swBE78yHuJ/9BAwm+ffyNjorwTHM1pWzSsCIvR7d/dI4v9KzmATAaLeD7dRJojpa7RDg4tyeuniIdUdK0htzABgyMyDltychPJbcVWg+jZztPASuSTbvH5ZktSWZcT6/u8EaUhXMAZBy6iSY7PaQGhOsEEvfRB5MVrGf5zZZgg70NBMClHD9Sxv/8Ven4cZgnVj9Mp1vd0McbHJEy5KRGQ/giZuF1D//CRLiN8lqULDCODP4/efPBcvG9Oc42Ct6f62wWSc3MQFAZ74HnHstUP5so9z2iCr/we0yzU4NSRoflaUqANPGB3D1Rbew8oeLPXvTKkQZUG4mDAEYCrSYiqsTifR8X9tVA2A4ZQb+cWR4/rxASfoJyFm7n4pNnGNtUNNdRuVZJB9CIuYvlUcVAJYaH4U6vPkMpFt2kNRXwLrwq2jOfnGIyrNIPUQJ46sSAvwZnzYA+LzKtlxStlG8Hjnz/GDCUfUAGPM/PjK87BgZbQBw+/h3jj3BdMPE57iNW/R+gmKyUAXgnwfcAQ9/0AwBWhkD4Fbu96oTRW3qhEoINQDQ9f/tx/cCyknzWzm73C1woefnoeqMWjmc65M8n+lPcGoAXPrRiN+DHj6h8KDHwY1vUVGuFlYD8dhWTrP8ndBgCqUCAK7y1VcMBZMFfpFzBXzHvIJmlpHh7VvF4J7ul1GDskVxZ6+4OknZh3xTOxUAbu4bhQ4R5/1orAWwHv9xpQ/jvtRt3VBpoQJA/bFBUUfAsfe/am9U1AuwviVMy/X7gFEcALHu3yeQkoNB1peAabp+agDgRs+nCw54inFVOBjEQSHJhAdBam6XMX1IlMaof6lOFfcAjsIxcHzHI8mWGAoOZ58RvnqVRMIBH7p+lt8fUHK1byUdKg5AsOlfIOEQgqK0CtkbRFro+bQHfgt1rjgAYgeAgUDAbeLCdUclDwyxt7cOnIeW/ndIOBFF66A98KMKwAeV8ufb6A0QhJzE/WA1pK5oDHT3ONW79NVppl2+rxHY+39Qlazocq+qIYAEAAsbgOOCDZYdgkewGlOF37i9i+m2u1lzp37xHH+Ww6yoh1lVAKimKQUejL2/9JRNgZrFV6n4GIC0BxDfNPZzqhn7qa0DcAD8g6h27OcAqOwgWOj9qAIeAlQAgZXeTwWAi+VDfo+AqaB3Zh6p1qqfPwUo7gFCXQlkxloKCPJ8VRK17d5g4isOgNizAMEEXS2fK33IU6qeFAcglM0gqY3QUn61F36W6kpxAPCqlyul97VkI8VkZWHhhzoAeAVc/bHg5wEV0zpDFW9rjYHcpsW3m6ktnuIeABtYd9zF7wwGANIvdpKAhwoAfCYAoMZxLzGAUAGAzwQAvt1kgSeD3NknxmCk81AB4E7OJFw/4CYtu6bqY2nuv1BxVADQ+0CQVfdPZSnYR5vco2Ga6u5LhGXV/VMFQM/jAFbdP1UA9LogxLL7pwoAfr9Q3fEBLXvykGRn2f1jg/4PMsAZ3SnBi5YAAAAASUVORK5CYII=',
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAecUlEQVR4Xu1dCZRcZZX+3nv1au+urt7SnaSTztYJHbIHAiRAcAmKMnMUdJxhXBgRz4gMMorEM6DOgCMKgoiIB5FNHUFUhlFwSBxJhACBLKQDDdlIOt1J72t1d21vmXNf9at+VfXq1atXS1c3+c/xRLr+92/3++9/7/3vfy8j7H9ZBoALdr5E/yQUhmMhi1L8b66KCgiRMKLjwfjffrdhPeqdzpRvtX+QegcQbTlsWCcfPzJeF+wbVqG7K4o9X81Hi+ba+MiveHMVS7AWowLgM3v24ejYuOEQebcLrI1HeGQkXu+WpU24rK7W8Duh9SjEzr7CTp/jYF+3HCGHEy9+VUR0oLDdaVufEQC47Z1D+FN3b0YACOEw7C4XwqNjSt1La2vwrbOWGn4X2bUfcihcUIrwzYvA1tdg1z0RDO1hCtpXcuMzAgAPnWjDw23thgunHgkOrycOgAbOjSc3rU3/XSiM8K79BSUIW+0Hv2opDr8RxpE72YL2pdf4jADAc109uP2Q8TnN8jZIUUFZAzoOVFlg56aN4Dn9XVfo818599edjf5RGa9ep4gzRS8zAgD7hkbw5QMtaRdPS/xkADzqOwdNqx263wrvtkM8fqowROE4OM5biSDLF/3cn3EyAE3o5jdb4bVxcak+HJWw/eAAeqompX514nQcUCEtYesz6/HhOx26XCCytxXy0KTQmE8k2Ncuh1DuxWs/ihb93J+RANAjzrbro+iNhrHjvFN4a0GikMg5HBDDYfzbgxvQfJuMBQvtKU1EdrdAHjXWLqyAQhX69v42gq6niyv0zUghMB0RWp6Pov3x2K9tswP4zQffQcQRsw2oxwIBwLME2PztVH04/H+vWqGv4TfcgjmwLWyYMqHvPQWA4XEBL31hUrgK2UX84vK34seCQ7Dhaw+vU9Zk1R3A3IZEEOQbAFx9NWzNi9HRHsWBrXnHVtYNes6WsfkbqZwv64am6IO4Icio/92PRNH358Qa285vw+srujDvdBk+/cdm5ceK9TI23pi4GPkEQKkRn+Zc/QFgw9UzwBJoBICBIQGv6KhYQ2VhOMM2OCNc/PPz7mdQVWGL/3e+AFCKxKdJLrlJSqsBTdGmzqpbUxyAWtz1QBhDL2U2siTviHwAgG2oA9/UWDJsX7vC6+8BZtXOcA5AE07HBfTgpuUCkd0HII+mqpFmYapK+6Vy5s8kAZDmYpoDUGWzKpeWC0QPn4DU3mWW3pP16HJn1TIw/jIcfCGKkw9l30Shv6j7mIx1V05fATBrAIxHJLxk8qZNZY3yYACRfW9lRQvVvBtlWLQ8HZ1yPT/d4PW0nqwmWgKVs+IANN7jhyNo/ffMhheyC2y81aZYB01bAzkO/MK5YOfVY2RMwL47ZYwdKYFV0hkCXwlcci8Hns0sF5XmDGKjyhoA9JGeWqg3yYZrgZUX80AojMiBd9LLAhwHrtYPW9MCwMbh8JthHPluaS9sw2eAlZdOX+FPpZclAGRzFKz6kYy5VXZAEBF9tx1y7wDkUASM0w44nbDNrgFbU6kQvn9IwMEflu6u14L8kkc4uO2lDVIznMcSAKjh7p4o9txopgtg+X/KaJyfXlgiCf/Un5FibDLXevFrVV8mY8NV01v4y4kDqB9r7wkykYFkglmXyahsjMkPw6clhLpZdP0RRXXfyjROM7+ffz+DSo2xy8w3pVrHMgegCUUlCa/dK0zpVWyxF3a6m36T1ysnAFBj2cgDxSZWIfrb9DMGPvekqbsQfRSzzZwBkK08UMzJ5buvmSL5a9clLwCgBqfKITPfRE7XHun9m34wMyT/ggCAGjVrKi4W0fLZz3S/9Uu3FnnjAKpQuOs/xJK13lkFhGLV/GaJWv1CYcM3F0xFueG0mfDvn5IZGwemzA1wtti/ORTyINp9szztVDujKRf1ylcQIY+OQY7SvzFfSnFwOD48eTB3B1vGPwkKZuyuu1Oc6RmnA6y/DGyZVwFEJhQlL177yQhavpH5viAHnBXt04KpfROElgYDkINBSKEIjIhLRGMmKMVqCKi3ELIgQDR5A6sLAL1GGa8bttm1ChjMcIlsjERFo6aFjvJl8pUD44p7PO1m5f8bPJXjGurA1VRCtnFgyzwWRg1E9rUaAkpt1DQAEiTHCQ7BNcw2BMNUvNOztFppPspJ8AuFIfUOKgSXiG0LoumhOS5aD/C52RrMvsiyBIAEMPjLwdXXgnz2kst0lgesCH60s4XOHsi9g5YfwxKrt6+NOdnmWsI79wBC7ClfupIzAOKsxOmArWl+7GZPU8z6D+Q62Xx/b9reL4iQOnshnOy0THTt2LmFc2FbMDcv0xEOn8goC+QNAHEg+MvBL2lMOBqm21FQ91Fg3d8b3/WTp5PY2Z33uAf8umawGVQ3s+iQhkYQ3dtaHA6Q0IuNg31lzJ+PysCogFe+ODUvd80ulraekeBHhI8ebzclYFnpOx/nv7bfTF7ZeecA2s5Vj176W8vOKNoftLIkxf0mneBH53v0yImCEV6dpeP95+V1wtHdLZAM3mYWFADk5ePYsBJwOjAcEfDS1aXNBdL5+dHzdnrmXujCet3gab3yWDKpg4UFADkdet2wT0xq16NhDG0vXTeqlN2v+DIeKsjrZj0a51MDUNufcgDQQBwb1yhc4HhnGK1fK00AJO9+YvmKO3sW+nvOG9dmg+Pi9Tk3o22gJACgygL9wShevSav88tbY9rdPyXEn5hJ3oXADLaAgh8BNC9+yXzF15+8fqcqjk8mpFzyKAc3zyou7OHdLcXd+ZrB2ZoXgauvyTRcU7+bsQYWBQAUyoVUwlJ931d9hYQNH4/FOMrEMk2tfA6V8ikImplL4QFAgZw2n6MsSak6jDTfJWFBvSO2+wsc0s4MNvJhDTRjBaSxFBwA6vkfjEj4y9XmL0TMLFS+6mx6mIHPYVNUvYJFNMtysLkcBcLxDojvdpjqsaAAoKtj+7rYxUap7n4amxrnryghbU2RJVaJrfHDRmZ1l34IvuSm6MwnwhsZfpK/KRgA1Be+ZAw6/m4ErbeWroPIlsc58BwLy0/ZsyCqlaoEBNbvm/DamvARiAqQKLYz/ds7qFw5WwnHWxAAaIlfqoKflhDr75Uxq9qu3OpFW49ZodG0/SbvAFDCuSxsUB57TgfiE+Xi/v6CiPBL+wCxNGWVQqAsfwCgt/3LF8X9Ad55OYpj9xdiyIVp832PcHDZWZjRnQszgqlpNXcA0Nv+eXWwzZut7PqRoICDj4qmAkpNzZT1e63YJGHjP8eELelkJ6JH2kppeAUbS04AUEK3Ebt3OhAVZRw/GMGR+xggVLoCn9FKap9+vVfkgawBQIEdKDEDeQgT4anQWX/055gRD0Io8NPKj/FKaBvFB6DlHSWgxUwtpgFASRk4NZoHPQ0XZXSfFmYM4bUEpoinK65lUe6JeeYqRwIZVmagcGgIAIXotZXxEC60GGTRa9sj4uSvp19gh2x38aLrgEUbYoGuFCCQ8yeFuZlBHCEBAKS/M34fOH+5YnggoY6KutunUxiXbImdrj75CTR+XsKCFfY4EFSH0JjxZXofD0zwyf+Skwmu7vT+bhHdu+WSjdOXLyKbbYeExDkbEmMhk5wg9vZDeeJVoMQYZseXbT3llZeaNo4+psBPg0eB/t3yeyrsS7YLR49G6rYAs1cxcTlBbYO4gxwYhahwh1BOYXKzHVe6+sTZYeNj7z1dTjBeT9xtn3nz/p3yGYJbX2o6IugdQWUzUF6ZCghqmbgEuZYRMCRBiL0NnHA1kwNjOQmX2oe7ykNeek9IRKZknuqrb53pUSDOkQEZzDPNO0vbVdc6babkSwKEby3gXyPBXcXCVZZ4ZJgdFHESbVEe5E7IZGbboHpE6GgU6D8hKlHZgqcTw/GdAUA2q5lDXRUYtjIZZYtje04FiNqs280q5uhMhVzrtGWkR0J0PNZm4G0WQggY3mdOSzsDgEyrPcN/PwOAGU7gTNM7A4BMKzTDfz8DgBlO4EzTOwOATCs0w38/A4AZTuBM0zsDgEwrNMN/zwkAlDdwuCyCYW9I+ZdK0wk/ZvXnFmtwhq95SU0vawC0NPXiUOOAkkc4bJ90nlSziTe0e+KZREtqpmcGo7sCpgBAO/2v6zpwuHEwgejUIiWQpiJFY9apcw7WYcsr888s9zRZAUMAqIQ/2NSXMh3e7YIkSkr6eLXYwyyu//XahFSy02Qd3rPD1AXAocZBhc3rEZ5Yvd3lQiQYhCzG0sir5fIdi7DycGq8wPfs6pqcuNRwBHLZMJiAD2z7EpNf5acac+XND8i+gAPDZbGdfLI+8RZK2w3tepZlER4dS+ldm0U8P0N777QiNu8B17oeUt1JyPOOgnvtfUWZ/C8ubwVz7g+/n/Y6mHa7ussd5eUQwmGF5dPfGZaNn/s02n/8YzPmn46FhTtTzK8AEZ0K2zVP+Veq7IZc164AotDlfzYfMwYACXiyJMFbXY1ocByiIEKMRhMIT4Os7XfhC7/Lb3SrQk++lNoX1+wCt39jfEjEEZiB2jgoCjXWlqa+SQBodzt1qKp1zvJyhEZGUs577aAu3DsHF+3NT3jTQk22lNsVz/1LCttPBkUhxm8IAJvLCd7pRHBwKGPf1+xvxqzXz7D/jAuVpoK0+CCYzgYwYxUJXIA9ejaYiNNqsxm/I9U+LgMQu1d1edr9rooKjPcPZGyEKvx41Uosc3vR3yVgsBUYeJWZEa+ETE0+T5WSuYBWNmCcEcih/Gcq/dkVB1NlACK+p6oK0fFxCBPGHVXXV4+FZPWPALA2KcAxeRi375TR/d/T851gnuhquhlF+Jt/VJEFiOCeS/bAsawd5XWx9YsOuDHwh9UYb83uqCXL7ax+T4p5niy5v/yoRgvgHA5Fwi+rr8NYX1+KoGc0k3+a34BrGvWtf5RdtO2AiHcfNuejZnrFZmBFAgG/9CjmbOnBWGQALrcTvD0xavn4W3MQ2NMIKZj4dynMI3LaH1+VkF0EqXk9VeO47terURFIDDNDv5HKHz8CSMe3ORwZBT69dV/s9eDxdWsMSXIGCJkR627uwKzPvpy5YpoawWO16HpwM7TE17PP0Nn/4rpTSitxAHhrazA+OJjVzlfHsdjjxuPr15oaOAHh7W0Cup5lZlRmMVOTN6hEbL/h5mfBuaOWmxIDTgztWIZf2ri4FZduZz+xrSneJkn+f9g8GQZHAYDD61HOe61dP9MoVvt8uLi6EmsrKrDEm31iozMcIXGFveuOo+aTr2dadt3fZYEBY4vZ8/YOlOGBwcSsLSsOV8MfcOLE7OEUSy9z/gP3ysT6wyOZ89ER0T9aNwsXVlehzMIjhXSzo9xC/e0SBihC6wiD/r9ktw70VMvZMPmNb5kM3q0vfPa1SQi9wZacllLxwTfh/4Bxdg+aISuy8Ix64Bp3wibwANGdkRF0h9DvCuKG7hoEpcxvC1S7D/P+Jx6TI6OjCgdgKVTaeDC+kmolYvFfWbw4RdLPjkzZ16bM5KHxxAsnaqWsnAXPZp6kUY/jgoTTRwQcur00tJRMACDCV/dUoWzEOBPofkbG9zkRXRmWm4R+SYiC2XDfXXKyWqf99sOzanDrsqXZU6/EvqCXu1IwAkYQEnIflkqSy8rL98O36YjuqpUNe1HVUwPOxM6mBug670ZOxDFGVvw1VPuOtnES+u0ut/FdQJ3DgcfWr80ruy8qLkLhWPjXzlR/BsqOyq9cqrySnerM5yQAzrlhG/jKWKpYbbGH7Gho05xvJheQQPBNTsQBW4zDJW9yd3XM1mN4Gzhtdz9l+mg9ljm/z0RKm6idx46tIiIxzajoJd3uJ7Y/7935pnd+8sC7JRHX2GUEJ2w86u82jxt2p1Ox9BoCwMjAU/RVMtmh1N6FKOX3MZnpQ4l01rwYUxXX0Ej3r+zzw9+fKNGbXIbYrg8F8YSTxyPlrgTZrmxWLQLdPUodZuOD9yX4A2jdvC6sqsT3zo4Few5MLGg+pf9sJpOxriAi0nIo867Xachx8TnoHpCw58aMveS9QsPWZ2HzJzrYyDLAiQzmHW+0vPuVgUoSpIEBXFVXgX53DARk5o8ExxXfDpvdYcwBqI2vLF6otPVkxyncsbzZks6f91VLajDXFC/8yiaIVRXY9unihohN3v2yxIBhJIBh4Bl1o+5Ufc5LJ7adwJ0LG7CjzI1oOAxffT1CgYACAPqf4RGg7Z0Ewt+fF0v8UEpFCeh4+IRplq83dm7BHCXg5bNXWbfCWVkT1fhDdn3WGVEIr5Zc2b/aDgFge10tfjS3FrzLhUB3d4JAyLT84C75Twywi5UMdcdbljbhsrpaK/Ms2Df5iuapygE7vh0tqoFIMf/+6/PgfJO2F3Wx6jrq4BnL3sKasNjhCMSu0+iorsL1TfMRCYaweTiASyUWdTJQDyYxY8j/MhK+x6UaXsgC+JPVKwpGSCsN54v41Lea2GL3I1H0/dnKaKx/ozUBj0ssXg54cShox9+MerBZzDGF/NAQ5OEhtNXU4OHGObiuZ1AhurakBIpMBoGH4/D4+jWop6BDJVLySXwtAHZ8N4KxN4tvGSQbgH32EJ4Z8GH7UBlCMofPSSw+a9Lwo0sWSYJ4qkMRBAOzZ8PG2+HVqagbKfQxVsKjrAQi/k9WrywpwS/fxKc1UXIcNDUWVAborooZefTeTToX9qD+izvi5DkUdGLPqRp8U7TuBSRN7H7wPLjZc9JuXV0AkBXpBruMb68pMeL3DiDacjjvfKjQQiDdzz90RQscERu+8Dv9o7T+2hfgXNQbn9v3T83C7cMO1HDGaex1F2Pi7KffuLp6wJE+51DaWMHBhjpUNDXmfbGtNpirqmfULyW2DNfNKlhWs23nt+H1FbHrmaYTFfjgK40pHjo2/ygatj6n1CFZ4Oa2Ofh4hMHnBwJgKioAk5df8vgYpP5+hfWTVsHNmQtwsZC/eiUtACh7JaUuK4lCRp7dLZaSIpkZPyW2HGBcBclqmuyAQeNxRDjlGf3SE5WYf7o8/pbS+8nX0HFWD57orUA/XfUC+OlwEIuHA2Ar/WCcrvTTkSTIIyOQhie9uNnKKsiyBLbclz0A2Ipy8BMp38wsYsHqEPH3vlXQDN5kCTz8poAjd+Z2xZy8Bq+t6ML28yczjyS/vTCzZiS4PdE1COfYGGCzgSkrB2O3g7HZIAtRQJKBUBAS/U67fqIwHg8YjxcIBsFUpjcnp+UAjJ2H/cJ1ZsZY0DqFTuVGCTDsG9ei5fko2h/Pz1ToVfX280/gcGPimwozANCrUwfg7v5R1A4PA2QnTi68PRb/125XuCSBg/F6FUCIHe3g5jakPUJ0ASCPBsCfuwpc/dQafoqRwCmfRiAS9uisJ6dLo2IEBNVRQ89H40KOx9c7++AKhUDxX4norL9Kn7jEDSICxJ5OMOU+sCRH6JRUAIQjkAIjcF3xIYXlTFkpUhZvSm0brqrKSQDUI7wRkclJg2G5tD6YyUE3tDSgR7pnDQcUO8Eq2dhmQQKhErE8EABbVQXGm/p6KwEAtPNJf+RXNINfu3zKaE8dK0LfaKqDRL4H5di4Bh29LA5stdYyRU2hV7bacDnxc5iLyRTJL6lZnofNYQfH8yDDHMtOSulUlx7kMiTBkzePKEGaSFVDlzeyLOMy1oYbBlKf6OvNQOrpUfqQyfnDXwm2PNGljBm9/TsyZc2WxkYBQcBYbQ2cH9o8pV5AxUrirGQ43bDKUl5j2vXbLjihG0RDITrHgnc4wDliFlSGoSf1AGuzITwSi8EghEMKgdX66R7ikq+mt6YW0UgI7nAUj45E4NWTBXQQoGxqkh3ooonChrMsGLcLjMsT+/8j1/9LTKpgGHRUVeLLPhfqvB7cv2rllIBA0fdfa1FUUK7Gr8TWlwJjSm5cqW/Q2jZN85VqAdx2fTSrNwrahxfapu1ut0JglpIz2LiJdxaxG0YCBP1dz/Xe6Df61uWviD/YuVJicJ2UXq9PmaogKCZhwV8J28hwSm4CJnDTTTI5C/yq3INnJpIjUSNeG6eAwIrPfy5UItZP2bLJX093Mie7ILR3Kdwq12I/dyV6gnxWjiCqVU8Ni0cu9eyEoYV2NO0qYu3J3tVWiU/Om9q2rpNYXJnlHQFdCff6fLilqhxXjwZxzlgQXCSirKGhP0C904FH1xXPKVRh/e3dcGxcbSyACgIiLYctef/Ez2cL6p9259M5TuFyyLVay8aTz3vqL51nbqbfkolP9e8ROazOIPxpNwa5hUnd3Rjz+fC31ZNC4CKZAf1XRoeQi6orFU+ggpcJqd/W1AiyQpopkX2tlkFA5l92Xj2yYf9PbTmk6PZEfInO06SiR2gjbcCKOni7ZMPG1Bv7tMulXgp1+3y4SgOA+EY47/67ZZI6qai6J90Crq3woTMUwtGxcTy2bk3BjwIiJhX72izAJggI73rD0nGQrfRP0v5TW9JfRJkx8pgBtSovaOkRJxbH4kMyg69HzF9Zi6dPKcLfC/Pn4jsarZ7Aytl4fQ5ww6IF+Lu5sSvEv/b1Y1QQC+oNpBp87BesUc7/bIrQegxi5+QtmplvKSEmv2ppVtI/Xef+ZsshjEyExDXTj9U66Y4MJXaDKOEPgjn7jNTXB5m0O47D51c0Yai8HMHhQciSHI/1pHsE6AV8sDoZM99Fdu0HW+MHsf9sixVrIV3+hDweS8YfNT4yjbO7agxD3jDaZg+jpyrVrSvdXMjD6lNzZ+Oi6iqlCnlcP9nRgYfb2tNOXxucw4wmII0MQx6MaU07a6txW5kTZGUkr+DR3p7JaDB6YeKK6f9nWvBLszTS0AiiezM/qoyz0QnhL9/vAIyiqqp909F667KmOOGTp/TQiTZDEGjrb5VYXEqKUPI1sSBAol0+Ecvx7doafKPMgdGJj+1eN9x+PwI9fbGQf3oAKJr0L4gI79qneORyDXTlkX3JFgBk+hVrq/HCV4SsdH+zI4vcOoif9B3DWFKiaXpjccuypRltKxfsfMlsV3jc7cOc9tOAMJG+NipCJlWUCsdhe00V7q7xJaiRytnP83B4vYiQdXDzL38uhwOj8ZfB8RfBRTAG0U2f3DsI+0bj6CJGKyIc74BImb3NFI6DY9NadLRLOHCLmQ+yq0Op4bbcxyty09a33o5/bPaFFR0BxAUyFXLRpwc7io1GECC8cxzS4CB6+wbRw8h41eXA005e2fV6qiTFg6Bor2RgYi58+KeKJVAvPgCFfvne8rMK4xCq7v4s1D69hYnuboFk8s5Adf0qlPv3kpskNK2OCbH3HH0Xz3V1G7J8dT4kA3xu7z50hiYDb+vNlZ7pf2ru3LQCOfX51KnTCZ/qaSckB4yR15BqB6AbJrI368UEJIsgdfqJObMzsq9MyNX+rtr7+XNXgC2z5v8uB8OIvLzfXLfq7u+ULF/8ZOrokkc4uE0kftRrh0DwYl8/ToeCilB4ZHQsHo+hyetVdnsmz2w9GUJPo9ByhbgM4KmpgRAc1w0ErQ54TYVPGQgNju4iLL8VmNj99ICT9brBk+4/kXcg0yJrf8/GEFTo3V+xXsbGG6178WYz73R1n+vqwe2HEm0VegBIiAmpCoFq/H8bbzMEgdq52XNNb7DJt32Mvzw7AxCg6P5kAzBVirD7tezf1JgKUIk4x6W7Xom3nM44pcsB1DiBdBxwdh4kGBoFjbKsKmp2v3YNFCfUJfNNcQK6HYzue9u0BZAkf7a+BoU6+2ke591vLUl0vnFw85uteDFDhFctMHTVQAKBesmRDgRWjUVGDzvoOLBR1A4Da2C2xFd9/godBeQjv7Lgv59v6gPYNzSCLx9oSdty8pGQEChSe+2YKXScVQBk9PSx2cDNq4Ntbl0CNyCBTySVL0uzL1n9hHJvwfR+WunqDwAbri4NANB4vvTGQbxBTiA6JS0A9IQFiiQxSvbkpNQw1O4dy89Ka9FKBz95MIDIvrdM4544gkzCYTBs6U2A+ugz31a/5Aksug5YdkHpAIBkgY+/+lqKMUpR+zRJQJT/VoVAPQAQF7B7PLogsCIECq1HdQM2mUZElhXpxm9E5PDitWmTomTZon715m/JWNA0tRpA8shIU/vSGy0JICBT9GV1sxR1nm56/9o3AOYffvZjma589QpJi+SI6PZXIjg8pFwgaC2FmeIDJ7SZRvjLCwV0GlHVvmI8+S4VATATCJK5NoGAefvF7fJn9+obU1R1QS9FHHX2/MbzTRuHCvGqNx14VGfPjvZowYw+2r5LFQA0RuIEpBl0hcPQ09wYYf/L8m3vHMKfulPv1LXHgtPnQ4QeHk7kEKDGtX4DmXZy9MChvDt1puuTfP0Et6uggp+271LRANKtB8kEZCUkMCQb7xQAJF9eqA2lZBHx+zHeF7MhUzETJl6pSOx/p7VAyJmAlfy76um797cRdD1t3nMm236mEwCM5vb/su2eP7XanUIAAAAASUVORK5CYII=',
'data:image/png;base64,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',
'data:image/png;base64,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',
'data:image/png;base64,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',
'data:image/png;base64,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'
]
this.presentTextures = [];
this.presentMaterials = [];
for(var i in this.wrappingImages)
{
var presentTexture = new TextureLoader().load(this.wrappingImages[i]);
presentTexture.wrapS = RepeatWrapping;
presentTexture.wrapT = RepeatWrapping;
presentTexture.repeat.set(3, 3);
this.presentTextures.push(presentTexture);
this.presentMaterials.push(new MeshPhongMaterial( { shininess: 100, map: presentTexture } ));
}
this.boxGeometry = new BoxBufferGeometry(1, 1, 1);
this.greyMaterial = new MeshPhongMaterial( {color: 0xeeeeee, shininess: 30} )
this.container;
this.scene;
this.plane;
this.renderer;
this.width = 0;
this.height = 0;
this.lookAtHelper;
this.stageSize;
this.cameraTarget;
this.camera;
this.scale = scale;
this.stageSize = stageSize;
Cache.enabled = true;
// SCENE
this.scene = new Scene();
this.scene.background = new Color( 0x424874 );
this.scene.fog = new Fog(0x424874, 100, 200);
// this.scene.add(new AxisHelper());
// LIGHTS
this.scene.add( new HemisphereLight(0xfefeff, 0xeeeeff, 0.4 ));
const ambientLight = new PointLight( 0xffffff, 0.1);
ambientLight.position.set(20, -10, 20)
this.scene.add( ambientLight );
const shadowLight = new PointLight( 0xffffff, 0.6, 100 );
shadowLight.position.set( 10, 0, 4 );
shadowLight.castShadow = true;
shadowLight.shadow.radius = 16;
shadowLight.shadow.mapSize.width = 2048;
shadowLight.shadow.mapSize.height = 2048;
this.scene.add( shadowLight );
this.cannonLight = new PointLight( 0xEDB458, 0, 100, 2);
this.cannonLight.position.set(28, -20, 28)
this.cannonLight.castShadow = true;
this.cannonLight.shadow.radius = 2;
this.cannonLight.shadow.mapSize.width = 256;
this.cannonLight.shadow.mapSize.height = 256;
this.scene.add( this.cannonLight );
// FLOOR
this.plane = new Mesh(
new PlaneBufferGeometry( 1000 * this.scale, 1000 * this.scale ),
new MeshPhongMaterial ( { color: 0xDCD6F7} )
);
this.plane.position.set(-10, -30.5, -10);
this.plane.receiveShadow = true;
this.plane.rotation.x = -Math.PI / 2;
this.scene.add( this.plane );
// RENDERER
this.renderer = new WebGLRenderer( { antialias: true } );
console.log('pixel ratio:', window.devicePixelRatio)
// this.renderer.setPixelRatio( window.devicePixelRatio );
this.renderer.setSize( window.innerWidth, window.innerHeight );
this.renderer.shadowMap.enabled = true;
this.renderer.shadowMap.type = PCFSoftShadowMap;
// CONTAINER
this.container = document.getElementById( 'canvas-container' );
this.container.appendChild( this.renderer.domElement );
if(this.showStats) this.container.appendChild( this.stats.dom );
// CAMERA
this.camera = new PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 5, 400 );
this.camera.position.set(55, 15, 55);
this.cameraTarget = new Vector3( 0, -22, 0 );
// this.camera.position.set(65, -20, 20);
// this.cameraTarget = new Vector3( 30, -25, 30 );
let center = new Vector3((this.stageSize.left + (this.stageSize.width / 2)) * scale, (this.stageSize.top - (this.stageSize.height / 2)) * scale, 0)
const previewCameraDistance = 70 * scale;
// this.lookAtHelper = this.createBall(0.5, new Color(0xffffff));
// let stageSizeHelper = new Mesh(
// new PlaneBufferGeometry( this.stageSize.width * this.scale, this.stageSize.height * this.scale, Math.floor(this.stageSize.width / 5), Math.floor(this.stageSize.height / 5) ),
// new MeshPhongMaterial ( { color: 0xaaddff, wireframe: false} )
// );
// stageSizeHelper.position.set(this.stageSize.left * this.scale, this.stageSize.top * this.scale, 0);
// stageSizeHelper.applyMatrix4( new THREE.Matrix4().makeTranslation( (this.stageSize.width / 2), -this.stageSize.height / 2, 0 ) );
// this.scene.add( stageSizeHelper );
// ROOM
this.lights = [];
let colors = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff];
for (let i = 0; i < 3; i++) {
let group = new Group();
group.position.x = 1000;
let color = colors[Math.floor(Math.random() * colors.length)];
let light = new PointLight(color, 0.5, 50, 1.7 );
// gsap.timeline({ repeat: -1}).to(light, {intensity: 0.7, duration: 0.2}).to(light, {intensity: 0.5, duration: 0.2}).to(light, {intensity: 0.8, duration: 0.2})
group.add(light);
let geometry = new IcosahedronBufferGeometry(0.5, 4);
let material = new MeshPhongMaterial ( { color: color, wireframe: false } );
let mesh = new Mesh( geometry, material );
mesh.castShadow = true;
group.add(mesh);
this.scene.add(group);
this.lights.push(group);
}
///=================
// SOFA
///=================
let sofaGroup = new Group();
sofaGroup.position.y = 1000;
this.scene.add(sofaGroup);
var sofaLoader = new GLTFLoader(manager);
sofaLoader.load("https://assets.codepen.io/557388/sofa.glb", object => {
object.scene.rotation.y = Math.PI * 0.5;
let mat = new MeshPhongMaterial ( { color: 0xffffff } );
sofaGroup.add( object.scene );
object.scene.traverse( function( child ) {
if ( child.isMesh ) {
child.position.set(0, 0, 0);
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.sofa = sofaGroup;
});
///=================
// TREE
///=================
let treeGroup = new Group();
treeGroup.position.y = 1000;
this.scene.add( treeGroup );
var treeLoader = new GLTFLoader(manager);
treeLoader.load("https://assets.codepen.io/557388/PineTree.gltf", object => {
object.scene.position.set(0, 0, -17);
object.scene.scale.set(1.2, 1.2, 1.2);
object.scene.rotation.x = Math.PI * 0.5;
treeGroup.add( object.scene );
treeGroup.position.y = 1000;
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0x99dd66 } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.tree = treeGroup;
});
///=================
// FIREPLACE
///=================
let fireplaceGroup = new Group();
this.scene.add( fireplaceGroup );
var fireplaceLoader = new GLTFLoader(manager);
fireplaceLoader.load("https://assets.codepen.io/557388/fireplace.gltf", object => {
object.scene.position.set(0, -29, -19.5);
object.scene.scale.set(4, 4, 4);
object.scene.rotation.y = -Math.PI * 0.5;
fireplaceGroup.add( object.scene );
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0xffffff } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.fireplace = fireplaceGroup;
});
///=================
// TABLE
///=================
let tableGroup = new Group();
tableGroup.position.y = 1000;
this.scene.add( tableGroup );
var tableLoader = new GLTFLoader(manager);
tableLoader.load("https://assets.codepen.io/557388/table.gltf", object => {
object.scene.position.set(0, -6.3, 0);
object.scene.scale.set(2, 2, 2);
tableGroup.add( object.scene );
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0xffffff } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;
// child.intensity = 0;
}
} );
this.models.table = tableGroup;
});
///=================
// TV STAND
///=================
let standGroup = new Group();
standGroup.position.y = 1000;
this.scene.add( standGroup );
var tableLoader = new GLTFLoader(manager);
tableLoader.load("https://assets.codepen.io/557388/stand.gltf", object => {
object.scene.rotation.y = Math.PI * 0.5;
standGroup.add( object.scene );
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0xffffff } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.stand = standGroup;
});
///=================
// TV
///=================
let tvGroup = new Group();
tvGroup.position.y = 1000;
this.scene.add( tvGroup );
var tableLoader = new GLTFLoader(manager);
tableLoader.load("https://assets.codepen.io/557388/tv.gltf", object => {
object.scene.scale.set(2, 2, 2);
object.scene.rotation.y = Math.PI * 0.5;
tvGroup.add( object.scene );
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0xffffff } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.tv = tvGroup;
});
///=================
// POT
///=================
let potGroup = new Group();
potGroup.position.y = 1000;
this.scene.add( potGroup );
var tableLoader = new GLTFLoader(manager);
tableLoader.load("https://assets.codepen.io/557388/pot.gltf", object => {
object.scene.position.set(0, 0, -15);
object.scene.scale.set(6, 6, 6);
object.scene.rotation.x = Math.PI * 0.5;
potGroup.add( object.scene );
object.scene.traverse( function( child ) {
let mat = new MeshPhongMaterial ( { color: 0xB2967D } );
if ( child.isMesh ) {
child.castShadow = true;
child.receiveShadow = true;
child.material = mat;
}
else if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.pot = potGroup;
});
///=================
// CANNON
///=================
let cannonGroup = new Group();
this.scene.add( cannonGroup );
var tableLoader = new GLTFLoader(manager);
tableLoader.load("https://assets.codepen.io/557388/cannon2.gltf", object => {
object.scene.position.set(30, -30, 30);
object.scene.scale.set(3, 3, 3);
object.scene.rotation.y = Math.PI * 1.25;
cannonGroup.add( object.scene );
object.scene.traverse( function( child ) {
if ( child.isMesh ) {
child.castShadow = true;
}
if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.cannon = cannonGroup;
});
///=================
// SNOWMAN
///=================
let snowmanGroup = new Group();
snowmanGroup.position.y = 1000;
this.scene.add( snowmanGroup );
var snowmanLoader = new GLTFLoader(manager);
snowmanLoader.load("https://assets.codepen.io/557388/snowman.gltf", object => {
//object.scene.position.set(30, -30, 30);
object.scene.scale.set(2.5, 2.5, 2.5);
// object.scene.rotation.y = Math.PI * 1.25;
snowmanGroup.add( object.scene );
object.scene.traverse( function( child ) {
if ( child.isMesh ) {
child.castShadow = true;
}
if(child.isLight)
{
child.visible = false;//child.intensity = 0;
}
} );
this.models.snowman = snowmanGroup;
});
///=================
// STAR
///=================
let starGroup = new Group();
starGroup.position.y = 1000;
this.scene.add( starGroup );
var starLoader = new GLTFLoader(manager);
starLoader.load("https://assets.codepen.io/557388/star.gltf", object => {
object.scene.position.set(-1, 0, 0);
object.scene.scale.set(0.01, 0.01, 0.01);
object.scene.rotation.y = Math.PI * .5;
starGroup.add( object.scene );
object.scene.traverse( function( child ) {
if ( child.isMesh ) {
child.castShadow = true;
}
if(child.isLight)
{
child.visible = false;
// child.intensity = 0;
}
} );
this.models.star = starGroup;
});
this.onResize();
}
setPlane(physicsPlane)
{
this.plane.position.copy(physicsPlane.position);
this.plane.quaternion.copy(physicsPlane.quaternion);
}
render()
{
this.camera.lookAt( this.cameraTarget );
this.renderer.render( this.scene, this.camera );
if(this.showStats) this.stats.update();
}
onResize()
{
this.camera.aspect = window.innerWidth / window.innerHeight;
this.camera.updateProjectionMatrix();
this.renderer.setSize( window.innerWidth, window.innerHeight );
var aspect = window.innerWidth / window.innerHeight;
this.width = window.innerWidth;
this.height = window.innerHeight;
}
createBox(width, height, depth, color = 0xffffff, present = false)
{
//let geometry = new BoxBufferGeometry( width * this.scale, height * this.scale, depth * this.scale );
//let texture = present ? this.presentTextures[Math.floor(Math.random() * this.presentTextures.length)] : null;
//let material = new MeshPhongMaterial( { color: color, shininess: present ? 100 : 30, map: texture } );
let material = present ?
this.presentMaterials[Math.floor(Math.random() * this.presentMaterials.length)]
: this.greyMaterial
let mesh = new Mesh( this.boxGeometry, material );
mesh.scale.set(width, height, depth)
mesh.castShadow = true;
mesh.receiveShadow = true;
this.scene.add(mesh);
return mesh;
}
createSphere(radius, color)
{
let geometry = new IcosahedronBufferGeometry(radius, 3);
let material = new MeshPhongMaterial( { color: color, shininess: 30 } );
let mesh = new Mesh( geometry, material );
mesh.castShadow = true;
mesh.receiveShadow = true;
this.scene.add(mesh);
return mesh;
}
createBall(size, color, light = false)
{
if(light && this.lights.length)
{
return this.lights.shift();
}
let group = new Group();
let material = new MeshPhongMaterial ( { color: color, wireframe: false } );
let ball = new IcosahedronBufferGeometry(size, 4);
let mesh = new Mesh( ball, material );
mesh.castShadow = true;
group.add(mesh);
if(!light)
{
let cap = new CylinderBufferGeometry( size / 2, size / 2, size, 5 );
let capMat = new MeshPhongMaterial ( { color: 0xFFD338, wireframe: false } );
let capMesh = new Mesh( cap, capMat );
capMesh.castShadow = true;
capMesh.position.y = size * 0.75;
group.add(capMesh);
}
this.scene.add(group);
return group;
}
createCylinder(radiusTop, radiusBottom, height, numSegments)
{
const group = new Group();
const geometry = new CylinderBufferGeometry( radiusTop, radiusBottom, height, numSegments );
const material = new MeshPhongMaterial( { color: 0xff0000 } );
const cylinder = new Mesh( geometry, material );
// cylinder.position.set(x, y, z
cylinder.rotation.x = Math.PI * 0.5;
group.add(cylinder);
this.scene.add(group);
return group;
}
}
const PHYSICS_MATERIAL = {
lowBounce: 'lowbounce',
normalBounce: 'normalbounce',
highBounce: 'highbounce',
}
class Physics
{
constructor(scale = 1, stageSize)
{
this.scale = 1;
this.stageSize;
this.scale = scale;
this.stageSize = stageSize;
this.materials = {};
let mainMaterial = new CANNON.Material('main');
mainMaterial.friction = 1;
this.materials[PHYSICS_MATERIAL.lowBounce] = new CANNON.ContactMaterial(mainMaterial, mainMaterial, {friction: 2, restitution: 0 + extraBounce });
this.materials[PHYSICS_MATERIAL.normalBounce] = new CANNON.ContactMaterial(mainMaterial, mainMaterial, {friction: 2, restitution: 0 + extraBounce });
this.materials[PHYSICS_MATERIAL.highBounce] = new CANNON.ContactMaterial(mainMaterial, mainMaterial, {friction: 2, restitution: 1.5 + extraBounce });
// WORLD
this.world = new CANNON.World();
this.world.gravity.set(0, -60 * this.scale, 0);
this.world.broadphase = new CANNON.SAPBroadphase(this.world);
this.world.solver.iterations = 4;
this.world.allowSleep = true;
this.world.addContactMaterial(this.materials[PHYSICS_MATERIAL.lowBounce]);
this.world.addContactMaterial(this.materials[PHYSICS_MATERIAL.normalBounce]);
this.world.addContactMaterial(this.materials[PHYSICS_MATERIAL.highBounce]);
// GROUND
this.groundBody = new CANNON.Body({mass: 0, material: mainMaterial});
let groundShape = new CANNON.Plane();
this.groundBody.addShape(groundShape);
var rotate = new CANNON.Vec3(1,0,0)
this.groundBody.quaternion.setFromAxisAngle(rotate, - (Math.PI/2))
this.groundBody.position.set(0, (this.stageSize.top - this.stageSize.height) * scale, 0)
this.world.addBody(this.groundBody);
}
createBody(mass, position, rotation, material = PHYSICS_MATERIAL.normalBounce)
{
let body = new CANNON.Body({
type: mass == 0 ? CANNON.Body.KINEMATIC : CANNON.Body.DYNAMIC,
material: this.materials[material],
mass: mass * this.scale,
position: new CANNON.Vec3(position.x * this.scale, position.y * this.scale, position.z * this.scale), // m
});
Object.keys(rotation || {}).forEach(key =>
{
this.setAngle(body, rotation[key], key);
})
this.world.addBody(body);
return body;
}
createBoxShape(width, height, depth)
{
return new CANNON.Box(new CANNON.Vec3(width / 2 * this.scale, height / 2 * this.scale, depth / 2 * this.scale));
}
createCylinderShape(radiusTop, radiusBottom, height, segments)
{
return new CANNON.Cylinder(radiusTop, radiusBottom, height, segments);
}
createSphereShape(radius)
{
return new CANNON.Sphere(radius);
}
// createCylinder(x, y, z, radiusTop, radiusBottom, height, numSegments)
// {
// let shape = new CANNON.Cylinder(radiusTop, radiusBottom, height, numSegments);
// let body = new CANNON.Body({
// material: this.materials[PHYSICS_MATERIAL.normalBounce],
// mass: 15 * this.scale,
// position: new CANNON.Vec3(x * this.scale, y * this.scale, z * this.scale), // m
// });
// body.addShape(shape);
// this.setAngle(body, -Math.PI * 0.5, 'x');
// this.world.addBody(body);
// return body;
// }
createBox(width, height, depth, x, y, z, mass = 0, rotation = 0, trigger)
{
let shape = new CANNON.Box(new CANNON.Vec3(width / 2 * this.scale, height / 2 * this.scale, depth / 2 * this.scale));
let body = new CANNON.Body({
type: mass == 0 ? CANNON.Body.KINEMATIC : CANNON.Body.DYNAMIC,
material: this.materials[PHYSICS_MATERIAL.normalBounce],
mass: mass * this.scale,
position: new CANNON.Vec3(x * this.scale, y * this.scale, z * this.scale), // m
});
body.addShape(shape);
body.collisionResponse = trigger ? false : true;
if(trigger)
{
body.addEventListener('collide', () => trigger())
}
this.setAngle(body, rotation);
this.world.addBody(body);
return body;
}
setAngle(body, rotation, direction = 'z', )
{
let q = new CANNON.Quaternion();
let x = direction === 'x' ? 1 : 0
let y = direction === 'y' ? 1 : 0
let z = direction === 'z' ? 1 : 0
q.setFromAxisAngle(new CANNON.Vec3(x,y,z), rotation);
body.quaternion = q.mult(body.quaternion);
}
createBall(size, x = 0, y = 0, z = 0)
{
let shape = new CANNON.Sphere(size);
let body = new CANNON.Body({
material: this.materials[PHYSICS_MATERIAL.highBounce],
mass: 1 * this.scale,
position: new CANNON.Vec3(x * this.scale, y * this.scale, z * this.scale), // m
});
body.addShape(shape);
this.world.addBody(body);
return body;
}
createCylinder(x, y, z, radiusTop, radiusBottom, height, numSegments)
{
let shape = new CANNON.Cylinder(radiusTop, radiusBottom, height, numSegments);
let body = new CANNON.Body({
material: this.materials[PHYSICS_MATERIAL.normalBounce],
mass: 15 * this.scale,
position: new CANNON.Vec3(x * this.scale, y * this.scale, z * this.scale), // m
});
body.addShape(shape);
this.setAngle(body, -Math.PI * 0.5, 'x');
this.world.addBody(body);
return body;
}
remove(body)
{
this.world.remove(body);
}
tick(delta)
{
this.world.step(1/60, delta, 3);
}
}
console.clear();
const DIRECTION = {
left: 'LEFT',
right: 'RIGHT'
}
const GAME_STATE = {
loading: 'loading',
intro: 'intro',
waiting: 'waiting',
game: 'game'
}
let sounds = {
fire: [new Audio('https://assets.codepen.io/557388/fire_01.mp3'), new Audio('https://assets.codepen.io/557388/fire_02.mp3')],
bells: [new Audio('https://assets.codepen.io/557388/bells_01.mp3')],
bing: [new Audio('https://assets.codepen.io/557388/bing_01.mp3'), new Audio('https://assets.codepen.io/557388/bing_02.mp3')]
};
let gameState = GAME_STATE.loading;
let physicsItems = [];
let stage;
let physics;
let mousePos = {x: 0, y: 0};
let count = 0;
let cannonFlash;
let cannonRecoil;
let stars = [];
const introSteps = [init, prepUI, loadComplete, dropIn, createClickListeners, introRoom, introCannon, introStart, startGame];
function next()
{
if(introSteps.length)
{
introSteps.shift()();
}
}
function loadComplete()
{
const loadingScreen = document.querySelector('#loading');
loadingScreen.innerHTML = '';
setState(GAME_STATE.intro);
gsap.to(loadingScreen, {autoAlpha: 0, duration: 1.5});
setTimeout(() => next(), 1000);
}
function prepUI()
{
gsap.set('#steve', {y: '50%', scale: 0, rotation: 45});
gsap.set('#bubble', {transformOrigin: '100% 50%', autoAlpha: 0, x:'+=50', rotation: 5, scale: 0.9})
next();
}
function dropIn()
{
createSofa();
createTable();
createStand();
createTV();
next();
}
function setState(newState)
{
gameState = newState;
document.body.setAttribute('class', gameState);
}
function onMouseMove(event)
{
mousePos = {x: event.clientX, y: event.clientY};
}
function createClickListeners()
{
document.addEventListener( 'keypress', onClick, false );
document.addEventListener( 'click', onClick, false );
document.addEventListener( 'mousemove', onMouseMove, false );
next();
}
function introRoom()
{
setState(GAME_STATE.intro);
let roomTL = gsap.timeline({onComplete: () => setState(GAME_STATE.waiting)});
roomTL.to('#steve', {delay:1, y: 0, rotation: 0, scale: 1, ease: 'power4.out', duration: 0.6, onComplete:() => playSound('bing')})
roomTL.fromTo('#bubble', {autoAlpha: 0, y: 0, x:'+=50', rotation: 5, scale: 0.9}, {autoAlpha: 1, rotation: 0, scale: 1, x:0, ease: 'elastic', duration: 1})
}
function introCannon()
{
setState(GAME_STATE.intro);
const steveEl = document.querySelector('#steve');
const textEl = document.querySelector('#text');
const textHighlightEl = document.querySelector('#text-highlight');
let cannonTL = gsap.timeline({onComplete: () => setState(GAME_STATE.waiting), defaults: { ease: 'power4.easeInOut', duration: .8}});
cannonTL.to(stage.camera.position, {x: 65, y: -20, z: 20})
cannonTL.to(stage.cameraTarget, {x: 30, y: -25, z: 30}, 0)
cannonTL.to('#bubble', {autoAlpha: 0, y:'-=30', scale: 0.5, duration: 0.3, ease: 'power2.in'}, 0);
cannonTL.to(steveEl, {y: '-=20', duration: 0.1, onComplete: () => {
steveEl.setAttribute('src', 'https://assets.codepen.io/557388/happy.svg');
textEl.textContent = "But wait, we have this ";
textHighlightEl.textContent = "Christmas Cannon!!";
setTimeout(() => playSound('bing'),300);
}}, 0.5)
cannonTL.fromTo('#bubble', {autoAlpha: 0, y: 0, x:'+=50', rotation: 5, scale: 0.9}, {autoAlpha: 1, rotation: 0, scale: 1, x:0, ease: 'elastic', duration: 1});
cannonTL.to(steveEl, {y: 0, duration: .7, ease: 'bounce'}, 0.6);
}
function introStart()
{
setState(GAME_STATE.intro);
const steveEl = document.querySelector('#steve');
const textEl = document.querySelector('#text');
const textHighlightEl = document.querySelector('#text-highlight');
let cannonTL = gsap.timeline({onComplete: () => setState(GAME_STATE.game), defaults: { ease: 'power4.easeInOut', duration: .8}});
cannonTL.to(stage.camera.position, {x: 55, y: 15, z: 55})
cannonTL.to(stage.cameraTarget, {x: 0, y: -22, z: 0, duration: 1.4}, 0)
cannonTL.to('#bubble', {autoAlpha: 0, y:'-=30', scale: 0.5, duration: 0.3, ease: 'power2.in'}, 0);
cannonTL.to(steveEl, {y: '-=20', duration: 0.1, onComplete: () => {
steveEl.setAttribute('src', 'https://assets.codepen.io/557388/steve.svg');
textEl.textContent = "Click or tap to fire the Christmas Cannon, let’s make this room more festive!!";
textHighlightEl.textContent = "";
setTimeout(() => playSound('bing'),700);
}}, 0.5)
cannonTL.fromTo('#bubble', {autoAlpha: 0, y: 0, x:'+=50', rotation: 5, scale: 0.9}, {autoAlpha: 1, rotation: 0, scale: 1, x:0, ease: 'elastic', duration: 1});
cannonTL.to(steveEl, {y: 0, duration: .7, ease: 'bounce'}, 0.6);
}
function endMessage()
{
const steveEl = document.querySelector('#steve');
const textEl = document.querySelector('#text');
const textHighlightEl = document.querySelector('#text-highlight');
let changed = false;
steveEl.addEventListener('click', (event) => {
event.stopPropagation();
if(!changed)
{
changed = true;
let steveTL = gsap.timeline();
steveTL.to(steveEl, {y: '-=40', duration: 0.1, onComplete: () => {
steveEl.setAttribute('src', 'https://assets.codepen.io/557388/snowman.svg');
}}, 0)
steveTL.to(steveEl, {y: 0, duration: .7, ease: 'bounce'}, 0.1);
}
else window.open('https://ste.vg/pJ96mS5DC','_blank');
})
textEl.addEventListener('click', (event) => {
event.stopPropagation();
startGame();
// window.open('https://www.twitter.com/steeevg/','_blank');
})
// steveEl.setAttribute('src', 'https://assets.codepen.io/557388/snowman.svg');
textEl.innerHTML = `Yay! So much better.`
// Be sure to send a screenshot to <a href="https://twitter.com/steeevg/" target="_blank">@steeevg</a>, he’d love to see it!`;
textHighlightEl.textContent = "Merry Christmas!";
let roomTL = gsap.timeline();
setTimeout(() => playSound('bing'),700);
roomTL.to('#steve', {y: 0, rotation: 0, scale: 1, ease: 'power4.out', duration: 0.6})
roomTL.fromTo('#bubble', {autoAlpha: 0, y: 0, x:'+=50', rotation: 5, scale: 0.9}, {autoAlpha: 1, rotation: 0, scale: 1, x:0, ease: 'elastic', duration: 1})
}
function hideEndMessage()
{
}
function playSound(name)
{
let options = sounds[name];
if(options)
{
let sound = options[Math.floor(Math.random() * options.length)];
sound.currentTime = 0;
sound.play();
}
}
function startGame()
{
setState(GAME_STATE.game);
let gameStartTL = gsap.timeline({defaults: { ease: 'power4.easeInOut', duration: .5}});
gameStartTL.to('#bubble', {autoAlpha: 0, y:'-=30', scale: 0.5, duration: 0.3, ease: 'power2.in'}, 0);
gameStartTL.to('#steve', {y: '100%', scale: 0, rotation: 45}, 0)
}
function onClick(event)
{
if(event) event.preventDefault();
let coords = {
x: event.clientX || mousePos.x,
y: event.clientY || mousePos.y
}
switch(gameState)
{
case GAME_STATE.waiting:
next();
break;
case GAME_STATE.game:
fire(coords);
break;
default:
return;
}
}
function fire(coords)
{
if(count === 0) next();
count++;
let item;
let randomItems = [addBall, createStar];
if(count === 50) item = createSnowman();
else if(count === 10) item = createTree();
else if(stars.length && Math.random() > 0.8) item = createStar(); //randomItems[Math.floor(Math.random() * randomItems.length)]();
else item = addBall();
if(count === 100)
{
setTimeout(() => endMessage(), 1000);
}
playSound('fire');
// if(Math.random() > 0.8) playSound('bells');
let range = stage.height * 0.4;
let x = -60;
// let y = 20;
let z = -60;
let xStart = (stage.width / 2) - range;
let xEnd = (stage.width / 2) + range;
if(coords.x > stage.width / 2)
{
if(coords.x > xEnd) x = -20;
else
{
let r = coords.x - (stage.width / 2)
x = -20 + ((range - r) / range) * -40;
}
}
// let yStart = (stage.width / 2);
if(coords.x < stage.width / 2)
{
if(coords.x < xStart) z = -20;
else
{
let r = coords.x - xStart;
z = -20 + (r / range) * -40;
}
}
let hRange = 100;
let y = 60 - (coords.y / stage.height) * hRange;
item.physics.velocity.set(x * powerMultiplier, y, z * powerMultiplier)
const angularRandomness = 10;
item.physics.angularVelocity.set(
((Math.random() * angularRandomness) - (angularRandomness/2)),
((Math.random() * angularRandomness) - (angularRandomness/2)),
((Math.random() * angularRandomness) - (angularRandomness/2)))
item.physics.angularDamping = 0.8;
cannonFlash.restart();
cannonRecoil.restart();
}
function onReady()
{
// createTree();
setState(GAME_STATE.intro);
cannonFlash = gsap.timeline();
cannonFlash.fromTo(stage.cannonLight, {intensity: 2}, {intensity: 0, duration: .3});
cannonRecoil = gsap.timeline();
cannonRecoil.to(stage.models.cannon.position, {x: '+=3', z: '+=3', duration: 0.1, ease: 'Power2.out'}).to(stage.models.cannon.position, {x: '-=3', z: '-=3', duration: 0.4})
// cannonFlash.stop();
for (let i = 0; i < 20; i++) {
let star = stage.models.star.clone();
stars.push(star);
stage.scene.add(star);
}
setTimeout(() => {
animate();
next();
},100)
}
function addBall()
{
// gsap.to(stage.cameraTarget, {x: stageSize.left + (stageSize.width * 0.5), ease: 'Power4.inOut', duration: 1})
let x = 35;
let y = -15;
let z = 35;
let width = 1 + Math.random() * 4;
let height = 1 + Math.random() * 4;
let depth = 1 + Math.random() * 4;
let isBall = Math.random() > 0.5;
let light = Math.random() > 0.8;
var size = light ? .5 : .8;
var physicsItem = {
mesh: isBall ? stage.createBall(size, showGuides ? 0xFF0000 : Math.random() * 0xFFFFFF, light) : stage.createBox(width, height, depth, showGuides ? 0xFF0000 : 0xFFFFFF, !showGuides),
physics: isBall ? physics.createBall(size, x, y, z) : physics.createBox(width, height, depth, x, y, z, 2),
previousPosition: new CANNON.Vec3(x, y, z),
rotation: 0,
rotationVelocity: 0
}
// physicsItem.physics.velocity.set(-20 - (Math.random() * 50), 1 + (Math.random() * 10), -20 - (Math.random() * 50))
// -60 => -20
// 10 => 30
// -20 => -60
// physicsItem.physics.velocity.set(-60, 10, -60)
// const angularRandomness = 10;
// physicsItem.physics.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// physicsItem.physics.angularDamping = 0.8;
physicsItems.push(physicsItem);
return physicsItem;
// if(pauseTimer) clearTimeout(pauseTimer);
// pauseTimer = setTimeout( _ => doPhysics = false, 7000);
}
function createStaticBox(settings)
{
// const z = 1;
var physicsItem = {
mesh: settings.show ? stage.createBox(settings.width, settings.height, settings.depth, settings.color) : null,
physics: physics.createBox(settings.width, settings.height, settings.depth, settings.x, settings.y, settings.z, 0, settings.rotation, settings.trigger),
previousPosition: new CANNON.Vec3(settings.x, settings.y, settings.z),
rotation: settings.rotation,
rotationVelocity: 0
}
physicsItems.push(physicsItem);
return physicsItem
}
const clock = new Clock();
let oldElapsedTime = 0;
function animate()
{
const elapsedTime = clock.getElapsedTime();
const delta = elapsedTime - oldElapsedTime;
oldElapsedTime = elapsedTime;
physics.tick(delta)
for(var i in physicsItems)
{
if(physicsItems[i].mesh)
{
physicsItems[i].mesh.position.copy(physicsItems[i].physics.position);
physicsItems[i].mesh.quaternion.copy(physicsItems[i].physics.quaternion);
}
}
stage.render();
requestAnimationFrame( animate );
}
function init()
{
console.log('init()');
let worldScale = 1;
let stageSize = {
left: -20,
width: 40,
top: 0,
height: 30
}
stage = new Stage(worldScale, stageSize, onReady, showGuides);
physics = new Physics(worldScale, stageSize);
window.addEventListener( 'resize', () => { stage.onResize() }, false );
let staticItems = [
{
show: true,
x: stageSize.left,
y: -18.5,
z: 0,
width: 25,
height: 2,
depth: 40,
color: 0xcccccc,
rotation: Math.PI * 0.5,
},
{
show: true,
x: stageSize.left + (stageSize.width / 2) - 0.5,
y: -18.5,
z: -20,
width: 41,
height: 25,
depth: 2,
color: 0xcccccc,
rotation: 0
},
{
show: true,
x: stageSize.left + (stageSize.width / 2),
y: -30,
z: 0,
width: 40,
height: 2,
depth: 40,
color: 0xcccccc,
rotation: 0
},
{
show: showGuides,
x: 5.5,
y: -25,
z: -18,
width: 3,
height: 14,
depth: 3,
color: 0xff0000,
rotation: 0
},
{
show: showGuides,
x: -5,
y: -25,
z: -18,
width: 3,
height: 14,
depth: 3,
color: 0xff0000,
rotation: 0
},
{
show: showGuides,
x: 0,
y: -19,
z: -18,
width: 10,
height: 2.5,
depth: 3,
color: 0xff0000,
rotation: 0
},
{
show: showGuides,
x: 0,
y: -17.7,
z: -18,
width: 15.2,
height: 0.5,
depth: 3.3,
color: 0xff0000,
rotation: 0
}
]
staticItems.forEach(settings => {
createStaticBox(settings);
})
// addBall();
}
function createSofa()
{
let body = physics.createBody(5, {x: 12, y: -10, z: 2}, {y: Math.PI * 1.023, x: Math.PI * 0.01}, PHYSICS_MATERIAL.lowBounce);
let shapes = [{
show: false,
x: 0,
y: -1.5,
z: 0,
width: 9,
height: 2.6,
depth: 23.5,
rotation: 0
},
{
show: false,
x: -4,
y: 0,
z: 0,
width: 2.3,
height: 6,
depth: 23,
rotation: 0
},
{
show: false,
x: 0,
y: 0,
z: -10.3,
width: 9,
height: 2,
depth: 2.5,
rotation: 0
},
{
show: false,
x: 0,
y: 0,
z: 10.3,
width: 9,
height: 2,
depth: 2.5,
rotation: 0
},
{
show: false,
x: -2.2,
y: 2.8,
z: 0,
width: 3.5,
height: 1,
depth: 18.5,
rotation: -Math.PI * 0.4
}];
stage.models.sofa.position.y = 0;
let sofaGroup = new Group();
sofaGroup.add(stage.models.sofa)
stage.scene.add(sofaGroup);
shapes.forEach(box => {
let shape = physics.createBoxShape(box.width, box.height, box.depth);
if(showGuides)
{
let b = stage.createBox(box.width, box.height, box.depth, 0xff0000);
b.position.set(box.x, box.y, box.z);
b.rotation.set(0, 0, box.rotation);
sofaGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(box.x, box.y, box.z), new CANNON.Quaternion(0, 0, box.rotation));
})
var physicsItem = {
mesh: sofaGroup,
physics: body,
}
physicsItem.physics.velocity.set(0, -20, 0)
// const angularRandomness = 10;
// physicsItem.physics.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// physicsItem.physics.angularDamping = 0.8;
physicsItems.push(physicsItem);
}
function createTable()
{
let body = physics.createBody(3, {x: 0, y: -13, z: 2}, {y: -Math.PI * 1.013, x: Math.PI * 0.01}, PHYSICS_MATERIAL.lowBounce);
let shapes = [
{
x: 0.5,
y: -1.2,
z: 0,
width: 7,
height: 0.5,
depth: 16,
rotation: 0
},
{
x: 4,
y: -2.5,
z: 7.8,
width: 0.5,
height: 2.5,
depth: 0.5,
rotation: 0
},
{
x: 4,
y: -2.5,
z: -7.8,
width: 0.5,
height: 2.5,
depth: 0.5,
rotation: 0
},
{
x: -2.8,
y: -2.5,
z: 7.8,
width: 0.5,
height: 2.5,
depth: 0.5,
rotation: 0
},
{
x: -2.8,
y: -2.5,
z: -7.8,
width: 0.5,
height: 2.5,
depth: 0.5,
rotation: 0
},
];
stage.models.table.position.y = 0;
let tableGroup = new Group();
tableGroup.add(stage.models.table)
stage.scene.add(tableGroup);
shapes.forEach(box => {
let shape = physics.createBoxShape(box.width, box.height, box.depth);
if(showGuides)
{
let b = stage.createBox(box.width, box.height, box.depth, 0xff0000);
b.position.set(box.x, box.y, box.z);
b.rotation.set(0, 0, box.rotation);
tableGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(box.x, box.y, box.z), new CANNON.Quaternion(0, 0, box.rotation));
})
var physicsItem = {
mesh: tableGroup,
physics: body,
}
physicsItem.physics.velocity.set(0, -20, 0)
// const angularRandomness = 10;
// physicsItem.physics.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// physicsItem.physics.angularDamping = 0.8;
physicsItems.push(physicsItem);
}
function createStand()
{
let body = physics.createBody(6, {x: -16, y: -10, z: 0}, {y: -Math.PI * 0.001, x: Math.PI * 0.05}, PHYSICS_MATERIAL.lowBounce);
let shapes = [
{
x: 0,
y: 1.5,
z: 0,
width: 4.5,
height: 4.8,
depth: 18,
rotation: 0
}
];
stage.models.stand.position.y = 0;
let standGroup = new Group();
standGroup.add(stage.models.stand)
stage.scene.add(standGroup);
shapes.forEach(box => {
let shape = physics.createBoxShape(box.width, box.height, box.depth);
if(showGuides)
{
let b = stage.createBox(box.width, box.height, box.depth, 0xff0000);
b.position.set(box.x, box.y, box.z);
b.rotation.set(0, 0, box.rotation);
standGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(box.x, box.y, box.z), new CANNON.Quaternion(0, 0, box.rotation));
})
var physicsItem = {
mesh: standGroup,
physics: body,
}
physicsItem.physics.velocity.set(0, -20, 0)
// const angularRandomness = 10;
// physicsItem.physics.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// physicsItem.physics.angularDamping = 0.8;
physicsItems.push(physicsItem);
}
function createTV()
{
let body = physics.createBody(2, {x: -15.5, y: 0, z: 0}, {y: -Math.PI * 0.001, x: Math.PI * 0.001}, PHYSICS_MATERIAL.lowBounce);
let shapes = [
{
x: 0,
y: 4.5,
z: 0.5,
width: 1.5,
height: 9.5,
depth: 18,
rotation: 0
},
{
x: 0,
y: -1.6,
z: 0.5,
width: 2.5,
height: 0.5,
depth: 6.8,
rotation: 0
}
];
stage.models.tv.position.y = 0;
let tvGroup = new Group();
tvGroup.add(stage.models.tv)
stage.scene.add(tvGroup);
shapes.forEach(box => {
let shape = physics.createBoxShape(box.width, box.height, box.depth);
if(showGuides)
{
let b = stage.createBox(box.width, box.height, box.depth, 0xff0000);
b.position.set(box.x, box.y, box.z);
b.rotation.set(0, 0, box.rotation);
tvGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(box.x, box.y, box.z), new CANNON.Quaternion(0, 0, box.rotation));
})
var physicsItem = {
mesh: tvGroup,
physics: body,
}
physicsItem.physics.velocity.set(0, -20, 0)
// const angularRandomness = 10;
// physicsItem.physics.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// physicsItem.physics.angularDamping = 0.8;
physicsItems.push(physicsItem);
}
function createTree()
{
let body = physics.createBody(10, {x: 30, y: -10, z: 30}, {y: -Math.PI * 0.001, x: Math.PI * 0.001}, PHYSICS_MATERIAL.lowBounce);
physics.setAngle(body, -Math.PI * 0.5, 'x');
let shapes = [
{
x: 0,
y: 0,
z: -2.2,
topRadius: 1,
bottomRadius: 6,
height: 16,
segments: 10
},
{
x: 0,
y: 0,
z: -13,
topRadius: 0.5,
bottomRadius: 1,
height: 7,
segments: 5
},
{
x: 0,
y: 0,
z: -15,
topRadius: 3,
bottomRadius: 2,
height: 5,
segments: 7
}
];
stage.models.tree.position.y = 0;
stage.models.pot.position.y = 0;
let treeGroup = new Group();
treeGroup.add(stage.models.tree);
treeGroup.add(stage.models.pot);
stage.scene.add(treeGroup);
shapes.forEach(cylinder => {
let shape = physics.createCylinderShape(cylinder.topRadius, cylinder.bottomRadius, cylinder.height, cylinder.segments);
if(showGuides)
{
let b = stage.createCylinder(cylinder.topRadius, cylinder.bottomRadius, cylinder.height, cylinder.segments, 0xff0000);
b.position.set(cylinder.x, cylinder.y, cylinder.z);
b.rotation.set(0,0,0);
treeGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(cylinder.x, cylinder.y, cylinder.z), new CANNON.Quaternion(0, 0, cylinder.rotation));
})
var physicsItem = {
mesh: treeGroup,
physics: body,
}
// body.velocity.set(-40, 30, -40)
// const angularRandomness = 5;
// body.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// body.angularDamping = 0.8;
physicsItems.push(physicsItem);
return physicsItem;
}
function createSnowman()
{
// let body = physics.createBody(10, {x: 30, y: -10, z: 30}, {y: -Math.PI * 0.001, x: Math.PI * 0.001}, PHYSICS_MATERIAL.lowBounce);
let body = physics.createBody(10, {x: 30, y: -10, z: 30}, {y: 0, x: Math.PI * .5}, PHYSICS_MATERIAL.normalBounce);
physics.setAngle(body, -Math.PI * 0.5, 'x');
let shapes = [
{
x: 0,
y: 2.5,
z: 0,
radius: 3
},
{
x: 0,
y: 5,
z: 0,
radius: 2.5
},
{
x: 0,
y: 9.5,
z: 0,
radius: 1.7
}
];
stage.models.snowman.position.y = 0;
let snowmanGroup = new Group();
snowmanGroup.add(stage.models.snowman);
stage.scene.add(snowmanGroup);
shapes.forEach(sphere => {
let shape = physics.createSphereShape(sphere.radius);
if(showGuides)
{
let b = stage.createSphere(sphere.radius, 0xff0000);
b.position.set(sphere.x, sphere.y, sphere.z);
b.rotation.set(0,0,0);
snowmanGroup.add(b);
}
body.addShape(shape, new CANNON.Vec3(sphere.x, sphere.y, sphere.z), new CANNON.Quaternion(0, 0, 0));
})
var physicsItem = {
mesh: snowmanGroup,
physics: body,
}
// body.velocity.set(-40, 30, -40)
// const angularRandomness = 5;
// body.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// body.angularDamping = 0.8;
physicsItems.push(physicsItem);
return physicsItem;
}
function createStar()
{
// let body = physics.createBody(10, {x: 30, y: -10, z: 30}, {y: -Math.PI * 0.001, x: Math.PI * 0.001}, PHYSICS_MATERIAL.lowBounce);
let body = physics.createBody(1, {x: 30, y: -10, z: 30}, {y: 0, x: Math.PI * .5}, PHYSICS_MATERIAL.normalBounce);
// physics.setAngle(body, -Math.PI * 0.5, 'x');
let shapes = [
{
x: 0,
y: 0,
z: 0,
topRadius: 1,
bottomRadius: 1,
height: 0.5,
segments: 5
}
];
let star = stars.shift();
star.position.y = 0;
shapes.forEach(cylinder => {
let shape = physics.createCylinderShape(cylinder.topRadius, cylinder.bottomRadius, cylinder.height, cylinder.segments);
if(showGuides)
{
let b = stage.createCylinder(cylinder.topRadius, cylinder.bottomRadius, cylinder.height, cylinder.segments, 0xff0000);
b.position.set(cylinder.x, cylinder.y, cylinder.z);
b.rotation.set(0,0,0);
star.add(b);
}
body.addShape(shape, new CANNON.Vec3(cylinder.x, cylinder.y, cylinder.z), new CANNON.Quaternion(0, 0, cylinder.rotation));
})
var physicsItem = {
mesh: star,
physics: body,
}
// body.velocity.set(-40, 30, -40)
// const angularRandomness = 5;
// body.angularVelocity.set(
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)),
// ((Math.random() * angularRandomness) - (angularRandomness/2)))
// body.angularDamping = 0.8;
physicsItems.push(physicsItem);
return physicsItem;
}
next();
Also see: Tab Triggers