<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://artterra.artbb.me/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>ArtTerra</title>
		<link>http://artterra.artbb.me/</link>
		<description>ArtTerra</description>
		<language>ru-ru</language>
		<lastBuildDate>Thu, 25 Nov 2021 11:13:59 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Тестовое сообщение</title>
			<link>http://artterra.artbb.me/viewtopic.php?pid=5#p5</link>
			<description>&lt;p&gt;[html]&lt;br /&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Chronology&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;* {&lt;br /&gt;&amp;#160; margin: 0;&lt;br /&gt;&amp;#160; padding: 0;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;body {&lt;br /&gt;&amp;#160; overflow: hidden;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;#wrapper {&lt;br /&gt;&amp;#160; position: relative;&lt;br /&gt;&amp;#160; height: 100vh;&lt;br /&gt;&amp;#160; background: #000;&lt;br /&gt;&amp;#160; font-family: &#039;Comfortaa&#039;, cursive;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;#canvas_container {&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; left: 0;&lt;br /&gt;&amp;#160; top: 0;&lt;br /&gt;&amp;#160; width: 100%;&lt;br /&gt;&amp;#160; height: 100vh;&lt;br /&gt;&amp;#160; z-index: 0;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;canvas {&lt;br /&gt;&amp;#160; display: block;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.text {&lt;br /&gt;&amp;#160; width: 100%;&lt;br /&gt;&amp;#160; height: 100px;&lt;br /&gt;&amp;#160; text-align: center;&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; left: 50%;&lt;br /&gt;&amp;#160; top: 50%;&lt;br /&gt;&amp;#160; transform: translate(-50%, -50%);&lt;br /&gt;&amp;#160; z-index: 10;&lt;br /&gt;&amp;#160; cursor: pointer;&lt;br /&gt;&amp;#160; color: rgb(255, 255, 255);&lt;br /&gt;&amp;#160; background-color: rgba(0, 0, 0, 0.81);&lt;br /&gt;&amp;#160; font-size: 1.6rem;&lt;br /&gt;&amp;#160; line-height: 1.5;&lt;br /&gt;&amp;#160; user-select: none;&lt;br /&gt;&amp;#160; overflow: hidden;&lt;br /&gt;&amp;#160; display: flex;&lt;br /&gt;&amp;#160; align-items:center;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.text span {&lt;br /&gt;&amp;#160; color: #e7aa27;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.text .quoteText {&lt;br /&gt;&amp;#160; width: 85%;&lt;br /&gt;&amp;#160; margin: 0 auto;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.text .quoteText span {&lt;br /&gt;&amp;#160; font-weight: 700;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.clickInfo {&lt;br /&gt;&amp;#160; width: 100%;&lt;br /&gt;&amp;#160; text-align: center;&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; left: 0;&lt;br /&gt;&amp;#160; top: -80px;&lt;br /&gt;&amp;#160; z-index: 11;&lt;br /&gt;&amp;#160; cursor: pointer;&lt;br /&gt;&amp;#160; color: #F9B31C;&lt;br /&gt;&amp;#160; background-color: rgba(23, 23, 23, 0.9);&lt;br /&gt;&amp;#160; padding: 10px 0;&lt;br /&gt;&amp;#160; font-size: 20px;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.btn {&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; bottom: 5%;&lt;br /&gt;&amp;#160; right: 0px;&lt;br /&gt;&amp;#160; transform: translateX(-50%);&lt;br /&gt;&amp;#160; border: 1px solid white;&lt;br /&gt;&amp;#160; border-radius: 5px;&lt;br /&gt;&amp;#160; font-size: 0.9rem;&lt;br /&gt;&amp;#160; padding: 0.5rem 0.7em;&lt;br /&gt;&amp;#160; background: transparent;&lt;br /&gt;&amp;#160; color: #F9B31C;&lt;br /&gt;&amp;#160; -webkit-font-smoothing: antialiased;&lt;br /&gt;&amp;#160; font-weight: 700;&lt;br /&gt;&amp;#160; cursor: pointer;&lt;br /&gt;&amp;#160; transition: all .3s;&lt;br /&gt;&amp;#160; z-index: 11;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.btn_works {&lt;br /&gt;&amp;#160; left: 100px;&lt;br /&gt;&amp;#160; right: unset;&lt;br /&gt;&amp;#160; text-decoration: none;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.btn:hover {&lt;br /&gt;&amp;#160; background: #ffffff;&lt;br /&gt;&amp;#160; color: #2a2b2f;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;@media only screen and (max-width:815px) {&lt;br /&gt;&amp;#160; .text {&lt;br /&gt;&amp;#160; &amp;#160; font-size: 1.2rem;&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; .text span {&lt;br /&gt;&amp;#160; &amp;#160; afont-size: 0.8rem !important;&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; .clickInfo {&lt;br /&gt;&amp;#160; &amp;#160; font-size: 1rem;&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;div id=&amp;quot;wrapper&amp;quot;&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;lt;div id=&amp;quot;canvas_container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p class=&amp;quot;quoteText&amp;quot;&amp;gt;&amp;#8220; Never memorize something that you can look&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; up.&amp;#8221;&amp;lt;br&amp;gt;&amp;lt;span style=&amp;quot;font-style: italic; font-size: 1.4rem; color:#ED760D&amp;quot;&amp;gt;#Stack Overflow&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;p class=&amp;quot;clickInfo&amp;quot;&amp;gt;click anywhere to start journey&amp;lt;/p&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;lt;img id=&amp;quot;first&amp;quot; src=&amp;quot;https://i.imgur.com/hDB2Egy.jpg&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;https://codepen.io/collection/DxkYzq&amp;quot; target=&amp;quot;_blank&amp;quot; class=&amp;quot;btn btn_works&amp;quot;&amp;gt;My Works&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;button class=&amp;quot;btn&amp;quot; id=&amp;quot;fullscr&amp;quot;&amp;gt;Go Fullscreen&amp;lt;/button&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;script&amp;gt;&lt;br /&gt;gsap.registerPlugin(SplitText);&lt;/p&gt;
						&lt;p&gt;let webgl = {};&lt;br /&gt;let tail = {};&lt;/p&gt;
						&lt;p&gt;(function initThree() {&lt;br /&gt;&amp;#160; &amp;#160; webgl.container = document.getElementById(&amp;quot;canvas_container&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; webgl.quoteText = document.querySelector(&amp;quot;.quoteText&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; webgl.text = document.querySelector(&amp;quot;.text&amp;quot;);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.scene = new THREE.Scene();&lt;br /&gt;&amp;#160; &amp;#160; webgl.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 10000);&lt;br /&gt;&amp;#160; &amp;#160; webgl.camera.position.z = 180;&lt;br /&gt;&amp;#160; &amp;#160; webgl.renderer = new THREE.WebGLRenderer({ alpha: true });&amp;#160; //, antialias: true&lt;br /&gt;&amp;#160; &amp;#160; webgl.renderer.setSize(webgl.container.clientWidth, webgl.container.clientHeight);&lt;br /&gt;&amp;#160; &amp;#160; webgl.renderer.setPixelRatio(window.devicePixelRatio);&lt;br /&gt;&amp;#160; &amp;#160; webgl.container.appendChild(webgl.renderer.domElement);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.loader = new THREE.TextureLoader();&lt;br /&gt;&amp;#160; &amp;#160; webgl.clock = new THREE.Clock(true);&lt;br /&gt;&amp;#160; &amp;#160; webgl.loader.crossOrigin = &#039;&#039;;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.textureIndex = 1;&lt;br /&gt;&amp;#160; &amp;#160; webgl.threshold = 30;&lt;br /&gt;&amp;#160; &amp;#160; webgl.lastClick = 0;&lt;br /&gt;&amp;#160; &amp;#160; tail.on = false;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.texture = webgl.loader.load(document.getElementById(&amp;quot;first&amp;quot;).src, setup);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Promise.all([&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texture,&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/WnbfKGk/2.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/4RWFQtT/3.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/FyHLAY8.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/RjjfRYn/4.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/wzXGCjc/5.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/CvFkkt5/6.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/dMyyJRf/7.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/0B8zcfx/8.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/0FJ11K8/9.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/m0623ht/10.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/NZG7sTH/11.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/n0mP4YD/12.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/8v7cwEB.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/DktpY1G/13.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/YhD5x95/14.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/CltKjqc.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/99kssL1/15.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/xFaOgpw.mp4&amp;quot;), &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/FOnGfth.mp44&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/RxoPTCO.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/FX4bL6Z/16.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/0mT1FdC.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/KNv9Sk0/17.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/26jn4mf/18.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/BGhZSPY/19.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/khHC166/20.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/Bm7WdGD.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/eC1nmy0.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/N0XnaNd.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.loader.load(&#039;https://i.ibb.co/Z8jb7zk/21.jpg&#039;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/uxaxWKi.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/ijKZXbr.mp4&amp;quot;),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loadAsync(&amp;quot;https://i.imgur.com/Cw3BCnG.mp4&amp;quot;),&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; ]).then(result =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturesArray = result;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.getElementById(&amp;quot;wrapper&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, changeTexture, false);&lt;br /&gt;&amp;#160; &amp;#160; });&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; async function loadAsync(url) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let video = document.createElement(&amp;quot;video&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; video.muted = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; video.loop = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; video.playsinline = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; video.crossOrigin = &amp;quot;anonymous&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; video.src = url;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return new THREE.VideoTexture(video);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; webgl.texturesOptions = [&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 0, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;Things aren&amp;#8217;t always &amp;lt;span style=&amp;quot;color:#666666&amp;quot;&amp;gt;#000000&amp;lt;/span&amp;gt; and &amp;lt;em&amp;gt;#FFFFFF&amp;lt;/em&amp;gt;.&amp;#8221;&#039;, threshold: 20, random: 4.0, depth: 30.0, size: 1.7, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 1, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;Maybe you have to know the &amp;lt;span style=&amp;quot;color:#f4852a&amp;quot;&amp;gt;darkness&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;before you can appreciate the light&amp;#8221;&#039;, threshold: 60, random: 2.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 2, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;Some people never go &amp;lt;span style=&amp;quot;color:#3ac5f8&amp;quot;&amp;gt;crazy.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;What truly horrible lives they must lead.&amp;#8221;&#039;, threshold: 10, random: 1.0, depth: 2.0, size: 1.2, square: 0},&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 3, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220;When you stop chasing them, &amp;lt;span style=&amp;quot;color:#a87171; font-style: italic;&amp;quot;&amp;gt; they start noticing.&amp;lt;/span&amp;gt;&amp;#8221;&#039;, threshold: 100, random: 2.0, depth: 2.0, maxDepth: 60, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 4, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;#8220; Trapped by a reality, &amp;lt;span style=&amp;quot;color:#f81b1b&amp;quot;&amp;gt;freed by imagination&amp;lt;/span&amp;gt; &amp;#8221;&#039;, threshold: 80, random: 1.0, depth: 4.0, maxDepth:120, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 5, texture: &amp;quot;image&amp;quot;, quote: &#039;Someday I will &amp;lt;span style=&amp;quot;color:#c89c5b&amp;quot;&amp;gt;go&amp;lt;/span&amp;gt; far away!&#039;, threshold: 30, random: 2.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 6, texture: &amp;quot;image&amp;quot;, quote: &#039;This is &amp;lt;span style=&amp;quot;color:#f14646&amp;quot;&amp;gt;Lucy&amp;lt;/span&amp;gt;, but I lost a couple of her best pixels&#039;, threshold: 30, random: 2.0, depth: 3.0, size: 1.0, square: 1 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 7, texture: &amp;quot;image&amp;quot;, quote: &#039;Some &amp;lt;span style=&amp;quot;color:#e7aa27&amp;quot;&amp;gt;Pixels&amp;lt;/span&amp;gt; are good &amp;lt;br&amp;gt;and some are bad!&#039;, threshold: 60, random: 0.8, depth: 4.0, size: 0.6, square: 1 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 8, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;Its hard to be sugarfree in a world full of &amp;lt;span style=&amp;quot;color:#f4852a&amp;quot;&amp;gt;lollipops.&amp;lt;/span&amp;gt;&amp;#8220;&#039;, threshold: 20, random: 2.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 9, texture: &amp;quot;image&amp;quot;, quote: &#039;Somethimes I pretend to be &amp;lt;span style=&amp;quot;color:#C32B59&amp;quot;&amp;gt;normal&amp;lt;/span&amp;gt;. But it gets boring.&#039;, threshold: 20, random: 2.0, depth: 8.0, size: 1.5, square: 0, a2: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 10, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;lt;span style=&amp;quot;color:#eeb9b9&amp;quot;&amp;gt;Angels,&amp;lt;/span&amp;gt; pixies, &amp;lt;span style=&amp;quot;color:#e89191&amp;quot;&amp;gt;faerie dust&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;span style=&amp;quot;color:#e76e6e&amp;quot;&amp;gt;Treading love&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;color:#e33131&amp;quot;&amp;gt;living lust&amp;lt;/span&amp;gt;&#039;, threshold: 30, random: 2.0, depth: 30.0, maxDepth: 100, size: 1.5, square: 0, a3: true, a4: true, stagger: 0.3 },&amp;#160; //72&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 11, texture: &amp;quot;image&amp;quot;, quote: &#039;Do you see any Teletubbies?&amp;lt;br&amp;gt; &amp;lt;span style=&amp;quot;font-style: italic; color:#f91a1a&amp;quot;&amp;gt;- I did&amp;lt;/span&amp;gt;&#039;, threshold: 60, random: 2.0, depth: 2.0, maxDepth: 80, size: 1.5, square: 0, color: &amp;quot;transparent&amp;quot;, stagger: 1 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 12, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;My imaginary friend says that I need a&amp;#160; &amp;lt;span style=&amp;quot;color:#f3ee62&amp;quot;&amp;gt;therapist.&amp;lt;/span&amp;gt;&amp;#8221;&#039;, threshold: 60, random: 2.0, depth: 4.0, maxDepth: 60, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 13, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220; Some people I &amp;lt;span style=&amp;quot;color:#f91a1a&amp;quot;&amp;gt;like&amp;lt;/span&amp;gt; and some I don&amp;#8217;t &amp;#8221; &amp;lt;span style=&amp;quot;font-style: italic; font-size: 1.5vw; color:#f77e7e&amp;quot;&amp;gt; Covid-19&amp;lt;/span&amp;gt;&#039;, threshold: 60, random: 2.0, depth: 15.0, maxDepth: 120, size: 2.0, square: 0, stagger: 1 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 14, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;What doesn&amp;#8217;t kill you&amp;lt;br&amp;gt; gives you a set of unhealthy coping mechanisms and a &amp;lt;span style=&amp;quot;font-style: italic; color:#c8664c&amp;quot;&amp;gt; dark&amp;lt;/span&amp;gt; sense of humor. &amp;#8221;&#039;, threshold: 20, random: 2.0, depth: 4.0, maxDepth:180, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 15, texture: &amp;quot;image&amp;quot;, quote: &#039;When life suckes,&amp;lt;br&amp;gt; trow yourself into &amp;lt;span style=&amp;quot;color:#b3be1e&amp;quot;&amp;gt;Creativity!&amp;lt;/span&amp;gt;&#039;, threshold: 0, random: 2.0, depth: 3.0, maxDepth: 100, size: 1.5, square: 0, a5: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 16, texture: &amp;quot;video&amp;quot;, quote: &#039;and go wild!&#039;, threshold: 100, random: 4.0, depth: 20.0, maxDepth: 100, size: 1.5, square: 0, a4: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 17, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;In the beginning there was &amp;lt;span style=&amp;quot;color:#f17946&amp;quot;&amp;gt; nothing&amp;lt;/span&amp;gt;.&amp;#8221;&#039;, threshold: 60, random: 2.0, depth: 40.0, maxDepth: -100, size: 1.5, square: 0, a6: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 18, texture: &amp;quot;video&amp;quot;, quote: &#039;...then it &amp;lt;span style=&amp;quot;color:#259be9&amp;quot;&amp;gt;exploded&amp;lt;/span&amp;gt;.&#039;, threshold: 30, random: 2.0, depth: 20.0, maxDepth: 80, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 19, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220; Life is about using the whole box of crayons.&amp;#8221;&#039;, threshold: 30, random: 2.0, depth: 30.0, maxDepth: 100, size: 1.5, square: 0, a8:true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 20, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220;it is beautiful to be &amp;lt;span style=&amp;quot;color:#fac370&amp;quot;&amp;gt;alive&amp;lt;/span&amp;gt;&amp;#8221;&#039;, threshold: 100, random: 2.0, depth: 10.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 21, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220; &amp;lt;span style=&amp;quot;color:#979f28&amp;quot;&amp;gt;Live&amp;lt;/span&amp;gt; like there&amp;amp;lsquo;s no tomorrow! &amp;#8221;&#039;, threshold: 30, random: 1.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 22, texture: &amp;quot;video&amp;quot;, quote: &#039;If not now, &amp;lt;span style=&amp;quot;font-style: italic; color:#3bbbd8&amp;quot;&amp;gt;&amp;lt;br&amp;gt; then when?&amp;lt;/span&amp;gt;&#039;, threshold: 30, random: 2.0, depth: 30.0, maxDepth: -50, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 23, texture: &amp;quot;image&amp;quot;, quote: &amp;quot;&amp;#8220; What&#039;s the good of living if you don&#039;t try a &amp;lt;span style=&#039;color:#f2f637&#039;&amp;gt;few&amp;lt;/span&amp;gt; things &amp;#8221;&amp;quot;, threshold: 30, random: 2.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 24, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;I &amp;lt;span style=&amp;quot;color:#ea1f66&amp;quot;&amp;gt; always&amp;lt;/span&amp;gt; take two!&amp;#8221;&#039;, threshold: 10, random: 2.0, depth: 4.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 25, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220; In my &amp;lt;span style=&amp;quot;color:#ec1713&amp;quot;&amp;gt;sex&amp;lt;/span&amp;gt; fantasy, nobody ever loves me for my mind.&amp;#8220;&#039;, threshold: 20, random: 2.0, depth: 4.0, size: 1.5, square: 0, a1: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 26, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220; Some beautiful paths can`t be &amp;lt;span style=&amp;quot;color:#D873EE&amp;quot;&amp;gt;discovered&amp;lt;/span&amp;gt; without getting &amp;lt;span style=&amp;quot;color:#1BACBF&amp;quot;&amp;gt;lost.&amp;lt;/span&amp;gt; &amp;#8221;&#039;, threshold: 20, random: 2.0, depth: 4.0, maxDepth:150, size: 1.5, square: 0, a10:true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 27, texture: &amp;quot;video&amp;quot;, quote: &#039;They said: back-end is a good paid job!&amp;lt;br&amp;gt; - now I work for food.&#039;, threshold: 30, random: 2.0, depth: 15.0, maxDepth: 50, size: 1.5, square: 0, a6:true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 28, texture: &amp;quot;video&amp;quot;, quote: &#039;and I dream my painting and I &amp;lt;span id=&amp;quot;paint_only&amp;quot; style=&amp;quot;color:#D234EB&amp;quot;&amp;gt;paint only&amp;lt;/span&amp;gt; my Pen.&#039;, threshold: 60, random: 2.0, depth: 18.0, size: 1.5, square: 0, a9:true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 29, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220;Talk is cheap. Show me the &amp;lt;span style=&amp;quot;color:#f1ee46&amp;quot;&amp;gt;magic!&amp;lt;/span&amp;gt;&amp;#8221;&#039;, threshold: 150, random: 2.0, depth: 20.0, maxDepth: 70, bg: &#039;#000&#039;, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 30, texture: &amp;quot;image&amp;quot;, quote: &#039;&amp;#8220;Actions speak &amp;lt;span style=&amp;quot;color:#ea1f66&amp;quot;&amp;gt;louder&amp;lt;/span&amp;gt; then words!&amp;#8221;&#039;, threshold: 60, random: 2.0, depth: 4.0, size: 1.5, square: 0, a4:true, a1:true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 31, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220;&amp;lt;span style=&amp;quot;color:#f6a62c&amp;quot;&amp;gt;Creativity&amp;lt;/span&amp;gt; is knowing how to hide your &amp;lt;span style=&amp;quot;color:#f6a62c&amp;quot;&amp;gt;sources&amp;lt;/span&amp;gt;&amp;#8221;&#039;, threshold: 100, random: 2.0, depth: 10.0, maxDepth: 60, size: 1.5, square: 0, a1: true },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 32, texture: &amp;quot;video&amp;quot;, quote: &#039;&amp;#8220; Plant your own garden&amp;lt;br&amp;gt; and decorate your own&amp;lt;span style=&amp;quot;color:#f91a1a&amp;quot;&amp;gt; soul&amp;lt;/span&amp;gt; &amp;#8221;&#039;, threshold: 160, random: 2.0, depth: 3.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { index: 33, texture: &amp;quot;video&amp;quot;, quote: &#039;End is not the &amp;lt;span style=&amp;quot;color:#f4e25d&amp;quot;&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt; if I set a loop!&#039;, threshold: 60, random: 2.0, depth: 5.0, maxDepth: 40.0, size: 1.5, square: 0 },&lt;br /&gt;&amp;#160; &amp;#160; ];&lt;br /&gt;})();&lt;/p&gt;
						&lt;p&gt;function setup() {&lt;br /&gt;&amp;#160; &amp;#160; pixelExtraction();&lt;br /&gt;&amp;#160; &amp;#160; initParticles();&lt;br /&gt;&amp;#160; &amp;#160; initTail();&lt;br /&gt;&amp;#160; &amp;#160; initRaycaster();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; window.addEventListener(&amp;quot;resize&amp;quot;, () =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; clearTimeout(webgl.timeout_Debounce);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.timeout_Debounce = setTimeout(resize, 50);&lt;br /&gt;&amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; resize();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.scene.add(webgl.particlesMesh);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.firstAnimation1 = gsap.to(webgl.particlesMesh.rotation, 30, { z: 2, repeat: -1, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; webgl.firstAnimation2 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 2, { value: 30 }, { value: 45.0, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot;, delay: 2 });&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.timeoutClickInfo = window.setTimeout(() =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (webgl.textureIndex == 1) gsap.to(document.querySelector(&amp;quot;.clickInfo&amp;quot;), 1.5, { top: 0, ease: &amp;quot;power4.out&amp;quot; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; else return;&lt;br /&gt;&amp;#160; &amp;#160; }, 4000);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; animate();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function pixelExtraction() {&lt;br /&gt;&amp;#160; &amp;#160; webgl.width = webgl.texture.image.width;&lt;br /&gt;&amp;#160; &amp;#160; webgl.height = webgl.texture.image.height;&lt;br /&gt;&amp;#160; &amp;#160; webgl.totalPoints = webgl.width * webgl.height;&lt;br /&gt;&amp;#160; &amp;#160; webgl.visiblePoints = 0;&lt;br /&gt;&amp;#160; &amp;#160; webgl.threshold = webgl.texturesOptions[webgl.textureIndex].threshold;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const img = webgl.texture.image;&lt;br /&gt;&amp;#160; &amp;#160; const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;&amp;#160; &amp;#160; const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;&amp;#160; &amp;#160; canvas.width = webgl.width;&lt;br /&gt;&amp;#160; &amp;#160; canvas.height = webgl.height;&lt;br /&gt;&amp;#160; &amp;#160; ctx.scale(1, -1);&lt;br /&gt;&amp;#160; &amp;#160; ctx.drawImage(img, 0, 0, webgl.width, webgl.height * -1);&lt;br /&gt;&amp;#160; &amp;#160; const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);&lt;br /&gt;&amp;#160; &amp;#160; webgl.arrayOfColors = Float32Array.from(imgData.data);&lt;br /&gt;&amp;#160; &amp;#160; for (let i = 0; i &amp;lt; webgl.totalPoints; i++) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (webgl.arrayOfColors[i * 4 + 0] &amp;gt; webgl.threshold) webgl.visiblePoints++;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function initParticles() {&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles = new THREE.InstancedBufferGeometry();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const positions = new THREE.BufferAttribute(new Float32Array(4 * 3), 3);&lt;br /&gt;&amp;#160; &amp;#160; positions.setXYZ(0, -0.5, 0.5, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; positions.setXYZ(1, 0.5, 0.5, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; positions.setXYZ(2, -0.5, -0.5, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; positions.setXYZ(3, 0.5, -0.5, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;position&#039;, positions);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const uvs = new THREE.BufferAttribute(new Float32Array(4 * 2), 2);&lt;br /&gt;&amp;#160; &amp;#160; uvs.setXYZ(0, 0.0, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; uvs.setXYZ(1, 1.0, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; uvs.setXYZ(2, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; uvs.setXYZ(3, 1.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;uv&#039;, uvs);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setIndex(new THREE.BufferAttribute(new Uint16Array([0, 2, 1, 2, 3, 1]), 1));&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const offsets = new Float32Array(webgl.totalPoints * 3); &lt;br /&gt;&amp;#160; &amp;#160; const indices = new Uint16Array(webgl.totalPoints);&lt;br /&gt;&amp;#160; &amp;#160; const angles = new Float32Array(webgl.totalPoints);&lt;br /&gt;&amp;#160; &amp;#160; for (let i = 0, j = 0; i &amp;lt; webgl.totalPoints; i++) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (webgl.arrayOfColors[i * 4 + 0] &amp;lt;= webgl.threshold) continue;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; offsets[j * 3 + 0] = i % webgl.width;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; offsets[j * 3 + 1] = Math.floor(i / webgl.width);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; indices[j] = i;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; angles[j] = Math.random() * Math.PI;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; j++;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;offset&#039;, new THREE.InstancedBufferAttribute(offsets, 3, false));&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;angle&#039;, new THREE.InstancedBufferAttribute(angles, 1, false));&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;pindex&#039;, new THREE.InstancedBufferAttribute(indices, 1, false));&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const uniforms = {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uTime: { value: 0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uRandom: { value: 3.0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uDepth: { value: 30.0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uSize: { value: 1.5 },&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uTextureSize: { value: new THREE.Vector2(webgl.width, webgl.height) },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uTexture: { value: webgl.texture },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uTouch: { value: null },&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uAlphaCircle: { value: 0.0 },&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uAlphaSquare: { value: 1.0 },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uCircleORsquare: { value: 0.0 }, &lt;br /&gt;&amp;#160; &amp;#160; };&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const materialParticles = new THREE.RawShaderMaterial({&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniforms: uniforms,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vertexShader: vertexShader(),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; fragmentShader: fragmentShader(),&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; depthTest: false,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; transparent: true,&lt;br /&gt;&amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh = new THREE.Mesh(webgl.geometryParticles, materialParticles);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function initTail() {&lt;br /&gt;&amp;#160; &amp;#160; tail.array = [];&lt;br /&gt;&amp;#160; &amp;#160; tail.size = 80;&lt;br /&gt;&amp;#160; &amp;#160; tail.maxAge = 70;&lt;br /&gt;&amp;#160; &amp;#160; tail.radius = 0.08;&lt;br /&gt;&amp;#160; &amp;#160; tail.red = 255;&lt;br /&gt;&amp;#160; &amp;#160; tail.canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;&amp;#160; &amp;#160; tail.canvas.width = tail.canvas.height = tail.size;&lt;br /&gt;&amp;#160; &amp;#160; tail.ctx = tail.canvas.getContext(&#039;2d&#039;);&lt;br /&gt;&amp;#160; &amp;#160; tail.ctx.fillStyle = &#039;black&#039;;&lt;br /&gt;&amp;#160; &amp;#160; tail.ctx.fillRect(0, 0, tail.canvas.width, tail.canvas.height);&lt;br /&gt;&amp;#160; &amp;#160; tail.texture = new THREE.Texture(tail.canvas);&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTouch.value = tail.texture;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function initRaycaster() {&lt;br /&gt;&amp;#160; &amp;#160; const geometryPlate = new THREE.PlaneGeometry(webgl.width, webgl.height, 1, 1);&lt;br /&gt;&amp;#160; &amp;#160; const materialPlate = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, wireframe: true, depthTest: false });&lt;br /&gt;&amp;#160; &amp;#160; materialPlate.visible = false;&lt;br /&gt;&amp;#160; &amp;#160; webgl.hoverPlate = new THREE.Mesh(geometryPlate, materialPlate)&lt;br /&gt;&amp;#160; &amp;#160; webgl.scene.add(webgl.hoverPlate);&lt;br /&gt;&amp;#160; &amp;#160; webgl.raycaster = new THREE.Raycaster();&lt;br /&gt;&amp;#160; &amp;#160; webgl.mouse = new THREE.Vector2(0, 0);&lt;br /&gt;&amp;#160; &amp;#160; window.addEventListener(&amp;quot;mousemove&amp;quot;, onMouseMove, false);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function onMouseMove(event) {&lt;br /&gt;&amp;#160; &amp;#160; webgl.mouse.x = (event.clientX / webgl.renderer.domElement.clientWidth) * 2 - 1;&lt;br /&gt;&amp;#160; &amp;#160; webgl.mouse.y = - (event.clientY / webgl.renderer.domElement.clientHeight) * 2 + 1;&lt;br /&gt;&amp;#160; &amp;#160; webgl.raycaster.setFromCamera(webgl.mouse, webgl.camera);&lt;br /&gt;&amp;#160; &amp;#160; let intersects = webgl.raycaster.intersectObjects([webgl.hoverPlate]);&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.rotation.y = webgl.mouse.x / 8;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.rotation.x = -webgl.mouse.y / 8;&lt;br /&gt;&amp;#160; &amp;#160; if (intersects[0] &amp;amp;&amp;amp; tail.on) buildTail(intersects[0].uv);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function buildTail(uv) {&lt;br /&gt;&amp;#160; &amp;#160; let force = 0;&lt;br /&gt;&amp;#160; &amp;#160; const last = tail.array[tail.array.length - 1];&lt;br /&gt;&amp;#160; &amp;#160; if (last) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; const dx = last.x - uv.x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; const dy = last.y - uv.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; const dd = dx * dx + dy * dy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; force = Math.min(dd * 10000, 1);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; tail.array.push({ x: uv.x, y: uv.y, age: 0, force });&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;function changeTexture(e) {&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (Date.now() - webgl.lastClick &amp;lt; 800) return;&lt;br /&gt;&amp;#160; &amp;#160; webgl.lastClick = Date.now();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (webgl.texturaAnimation0) webgl.texturaAnimation0.kill();&lt;br /&gt;&amp;#160; &amp;#160; if (webgl.texturaAnimation1) webgl.texturaAnimation1.kill();&lt;br /&gt;&amp;#160; &amp;#160; if (webgl.texturaAnimation2) webgl.texturaAnimation2.kill();&lt;br /&gt;&amp;#160; &amp;#160; if (webgl.texturaAnimation5) webgl.texturaAnimation5.kill();&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.rotation.z = 0.0;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (e.target.classList.contains(&amp;quot;btn&amp;quot;)) return;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let opt = webgl.texturesOptions[webgl.textureIndex];&lt;br /&gt;&amp;#160; &amp;#160; let t = webgl.texturesArray[webgl.textureIndex];&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (webgl.textureIndex == 1) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.firstAnimation1.kill(null, &amp;quot;z&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.firstAnimation2.kill();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gsap.fromTo(webgl.particlesMesh.rotation, 0.3, { z: 0.5 }, { z: 0 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; clearTimeout(webgl.timeoutClickInfo);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gsap.to(document.querySelector(&amp;quot;.clickInfo&amp;quot;), 1, { top: -80, ease: &amp;quot;power4.out&amp;quot; }, 0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; tail.on = true;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.width = 250;&amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; webgl.height = 145;&amp;#160; &amp;#160;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (opt.texture == &amp;quot;video&amp;quot;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.video = t.image;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.video.currentTime = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texture = t;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTexture.value = t;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.totalPoints = webgl.width * webgl.height;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; //webgl.texture.needsUpdate = true; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.video.play(); &lt;br /&gt;&amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texture = t;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTexture.value = t;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTextureSize.value.x = webgl.width;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTextureSize.value.y = webgl.height;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uRandom.value = opt.random;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uDepth.value = opt.depth;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uSize.value = opt.size;&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uCircleORsquare.value = opt.square;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (opt.texture != &amp;quot;video&amp;quot;) pixelExtraction();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const offsets = new Float32Array(webgl.totalPoints * 3);&lt;br /&gt;&amp;#160; &amp;#160; const indices = new Uint16Array(webgl.totalPoints);&lt;br /&gt;&amp;#160; &amp;#160; const angles = new Float32Array(webgl.totalPoints);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; for (let i = 0, j = 0; i &amp;lt; webgl.totalPoints; i++) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (opt.texture != &amp;quot;video&amp;quot;) if (webgl.arrayOfColors[i * 4 + 0] &amp;lt;= webgl.threshold) continue;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (webgl.textureIndex === 18) if (webgl.arrayOfColors[i * 4 + 0] &amp;lt;= webgl.threshold) continue; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; offsets[j * 3 + 0] = i % webgl.width;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; offsets[j * 3 + 1] = Math.floor(i / webgl.width);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; indices[j] = i;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; angles[j] = Math.random() * Math.PI;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; j++;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;offset&#039;, new THREE.InstancedBufferAttribute(offsets, 3, false));&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;angle&#039;, new THREE.InstancedBufferAttribute(angles, 1, false));&lt;br /&gt;&amp;#160; &amp;#160; webgl.geometryParticles.setAttribute(&#039;pindex&#039;, new THREE.InstancedBufferAttribute(indices, 1, false));&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; webgl.textureIndex++;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (webgl.textureIndex === webgl.texturesOptions.length) webgl.textureIndex = 0;&lt;br /&gt;&amp;#160; &amp;#160; if (!opt.maxDepth) opt.maxDepth = 30;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let tl = gsap.timeline();&lt;br /&gt;&amp;#160; &amp;#160; tl.fromTo(webgl.quoteText, 0.5, { opacity: 1 }, { opacity: 0 }, 0);&lt;br /&gt;&amp;#160; &amp;#160; tl.fromTo(webgl.text, 1, { rotation: 0 }, { rotation: 180, transformOrigin: &amp;quot;center&amp;quot;, ease: &amp;quot;power2.out&amp;quot; }, 0);&lt;br /&gt;&amp;#160; &amp;#160; tl.call(() =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.quoteText.innerHTML = opt.quote;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gsap.set(webgl.quoteText, { rotation: 180, opacity: 1, transformOrigin: &amp;quot;center&amp;quot; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let split = new SplitText(&amp;quot;.quoteText&amp;quot;, { type: &amp;quot;lines,words,chars&amp;quot; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!opt.stagger) opt.stagger = 0.3;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (opt.a4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation5 = gsap.from(split.words, { duration: 0.5, y: 100, rotationX: -60, stagger: opt.stagger });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; gsap.set(&amp;quot;.quoteText&amp;quot;, { perspective: 400 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; gsap.from(split.lines, { duration: 0.5, opacity: 0, rotationX: -60, force3D: true, transformOrigin: &amp;quot;0 center -150&amp;quot;, stagger: opt.stagger });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; }, null, 0.5);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (opt.a1) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 1, { value: -20 }, { value: 20, ease: &amp;quot;power2.out&amp;quot;, repeat: -1, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a2) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uRandom, 1, { value: 0 }, { value: -40, ease: &amp;quot;power2.out&amp;quot;, repeatDelay: 0.5, repeat: -1, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a3) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 1, { value: 20 }, { value: 50, ease: &amp;quot;power2.out&amp;quot;, repeat: -1, repeatDelay: 0.5, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation2 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uSize, 1, { value: 0 }, { value: 1.5, ease: &amp;quot;power2.out&amp;quot;, repeatDelay: 0.5, repeat: -1, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a5) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 4, { value: opt.depth }, { value: opt.maxDepth, ease: &amp;quot;power3.out&amp;quot;, delay: 2 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation5 = gsap.fromTo(webgl.particlesMesh.rotation, 5, { z: 0.0 }, { z: THREE.Math.degToRad(360), ease: &amp;quot;bounce.out&amp;quot;, delay: 5 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation2 = gsap.fromTo(webgl.particlesMesh.position, 5, { z: 0.0 }, { z: -80, ease: &amp;quot;bounce.out&amp;quot;, delay: 5 });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a6) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation5 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 6, { value: 20 }, { value: -200, ease: &amp;quot;power3.out&amp;quot;, yoyoEase: &amp;quot;bounce.out&amp;quot;, delay: 2, yoyo: true, repeat: 1 });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a7) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 4, { value: opt.depth }, { value: 10, ease: &amp;quot;bounce.out&amp;quot;, delay: 2, yoyo: true, repeat: 1 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation2 = gsap.fromTo(webgl.particlesMesh.position, 2, { z: 0.0 }, { z: 60.0, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot; });&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a8) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.video.loop = false;&lt;br /&gt;&amp;#160; &amp;#160; } else if (opt.a11) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 1, { value: 4 }, { value: 40, ease: &amp;quot;power2.out&amp;quot;, repeat: -1, yoyo: true, repeatDelay:0.5 });&lt;br /&gt;&amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation0 = tl.fromTo(webgl.text, 1, { scale: 1 }, { scale: 1.3, transformOrigin: &amp;quot;center&amp;quot;, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot;, yoyo: true, repeat: 1 }, 2.8);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.fromTo(webgl.particlesMesh.position, 4, { z: 0.0 }, { z: 15.0, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot;, yoyo: true, repeat: 1, repeatDelay: 5 });&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (opt.texture === &amp;quot;video&amp;quot;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation2 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 4, { value: opt.depth }, { value: opt.maxDepth / 2, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot;, repeatDelay: 5, repeat: 1, yoyo: true });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; } else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation2 = gsap.fromTo(webgl.particlesMesh.material.uniforms.uDepth, 4, { value: opt.depth }, { value: opt.maxDepth, ease: &amp;quot;elastic.in(1, 0.3)&amp;quot;, repeatDelay: 5, repeat: 1, yoyo: true });&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (opt.a10) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.texturaAnimation1 = gsap.set(webgl.particlesMesh.material.uniforms.uTexture, { value: webgl.loader.load(&amp;quot;https://i.ibb.co/0qhkwkd/20cc.jpg&amp;quot;), delay: 4 })&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function animate() {&lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.material.uniforms.uTime.value += webgl.clock.getDelta();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (tail.on) drawTail();&lt;br /&gt;&amp;#160; &amp;#160; tail.texture.needsUpdate = true;&lt;br /&gt;&amp;#160; &amp;#160; webgl.texture.needsUpdate = true;&lt;br /&gt;&amp;#160; &amp;#160; webgl.renderer.render(webgl.scene, webgl.camera);&lt;br /&gt;&amp;#160; &amp;#160; webgl.raf = requestAnimationFrame(animate);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function drawTail() {&lt;br /&gt;&amp;#160; &amp;#160; tail.ctx.fillStyle = &#039;black&#039;;&lt;br /&gt;&amp;#160; &amp;#160; tail.ctx.fillRect(0, 0, tail.canvas.width, tail.canvas.height);&lt;br /&gt;&amp;#160; &amp;#160; tail.array.forEach((point, i) =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; point.age++;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (point.age &amp;gt; tail.maxAge) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; tail.array.splice(i, 1);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const pos = {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; x: point.x * tail.size,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; y: (1 - point.y) * tail.size&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; };&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let intensity = 1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (point.age &amp;lt; tail.maxAge * 0.3) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; intensity = easeOutSine(point.age / (tail.maxAge * 0.3), 0, 1, 1);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; intensity = easeOutSine(1 - (point.age - tail.maxAge * 0.3) / (tail.maxAge * 0.7), 0, 1, 1);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; intensity *= point.force;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const radius = tail.size * tail.radius * intensity;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const grd = tail.ctx.createRadialGradient(pos.x, pos.y, radius * 0.25, pos.x, pos.y, radius);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; grd.addColorStop(0, &#039;rgba(&#039; + tail.red + &#039;, 255, 255, 0.2)&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; grd.addColorStop(1, &#039;rgba(0, 0, 0, 0.0)&#039;);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; tail.ctx.beginPath();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; tail.ctx.fillStyle = grd;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; tail.ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; tail.ctx.fill();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; });&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;const easeOutSine = (t, b, c, d) =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; return c * Math.sin(t / d * (Math.PI / 2)) + b;&lt;br /&gt;};&lt;/p&gt;
						&lt;p&gt;function resize() {&lt;br /&gt;&amp;#160; &amp;#160; let f = 0.1;&lt;br /&gt;&amp;#160; &amp;#160; webgl.camera.aspect = webgl.container.clientWidth / webgl.container.clientHeight;&lt;br /&gt;&amp;#160; &amp;#160; webgl.camera.updateProjectionMatrix();&lt;br /&gt;&amp;#160; &amp;#160; webgl.renderer.setSize(webgl.container.clientWidth, webgl.container.clientHeight);&lt;br /&gt;&amp;#160; &amp;#160; if (window.innerWidth / window.innerHeight &amp;lt; 2.8) f = -0.2;&lt;br /&gt;&amp;#160; &amp;#160; const fovHeight = 2 * Math.tan((webgl.camera.fov * Math.PI) / 180 / 2) * webgl.camera.position.z;&lt;br /&gt;&amp;#160; &amp;#160; const scale = fovHeight / webgl.height + f;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; webgl.particlesMesh.scale.set(scale, scale, 1);&lt;br /&gt;&amp;#160; &amp;#160; if (webgl.hoverPlate) webgl.hoverPlate.scale.set(scale, scale, 1);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;let fsEnter = document.getElementById(&#039;fullscr&#039;);&lt;br /&gt;fsEnter.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;&amp;#160; &amp;#160; e.preventDefault();&lt;br /&gt;&amp;#160; &amp;#160; if (!webgl.fullscreen) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.fullscreen = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.documentElement.requestFullscreen();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; fsEnter.innerHTML = &amp;quot;Exit Fullscreen&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; webgl.fullscreen = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.exitFullscreen();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; fsEnter.innerHTML = &amp;quot;Go Fullscreen&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;function vertexShader() {&lt;br /&gt;&amp;#160; &amp;#160; return `&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; attribute float pindex;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; attribute vec3 position;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; attribute vec3 offset;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; attribute vec2 uv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; attribute float angle;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform mat4 modelViewMatrix;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform mat4 projectionMatrix;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uTime;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uRandom;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uDepth;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uSize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform vec2 uTextureSize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform sampler2D uTexture;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform sampler2D uTouch;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; varying vec2 vPUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 mod289(vec3 x) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return x - floor(x * (1.0 / 289.0)) * 289.0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 mod289(vec2 x) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return x - floor(x * (1.0 / 289.0)) * 289.0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 permute(vec3 x) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return mod289(((x*34.0)+1.0)*x);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float snoise(vec2 v)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const vec4 C = vec4(0.211324865405187, &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 0.366025403784439, &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; -0.577350269189626,&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 0.024390243902439); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 i&amp;#160; = floor(v + dot(v, C.yy) );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 x0 = v -&amp;#160; &amp;#160;i + dot(i, C.xx);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 i1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; i1 = (x0.x &amp;gt; x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 x12 = x0.xyxy + C.xxzz;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; x12.xy -= i1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; i = mod289(i); // Avoid truncation effects in permutation&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; + i.x + vec3(0.0, i1.x, 1.0 ));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; m = m*m ;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; m = m*m ;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 x = 2.0 * fract(p * C.www) - 1.0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 h = abs(x) - 0.5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 ox = floor(x + 0.5);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 a0 = x - ox;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 g;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; g.x&amp;#160; = a0.x&amp;#160; * x0.x&amp;#160; + h.x&amp;#160; * x0.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; g.yz = a0.yz * x12.xz + h.yz * x12.yw;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return 130.0 * dot(m, g);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float random(float n) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return fract(sin(n) * 43758.5453123);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; void main() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vUv = uv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 puv = offset.xy / uTextureSize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vPUv = puv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 colA = texture2D(uTexture, puv);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float grey = colA.r * 0.21 + colA.g * 0.71 + colA.b * 0.07;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 displaced = offset;&amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.xy += vec2(random(pindex) - 0.5, random(offset.x + pindex) - 0.5) * uRandom;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float rndz = (random(pindex) + snoise(vec2(pindex * 0.1, uTime * 0.1)));&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.z += rndz * (random(pindex) * 2.0 * uDepth);&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.xy -= uTextureSize * 0.5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float t = texture2D(uTouch, puv).r;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.z += t * -40.0 * rndz;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.x += cos(angle) * t * 40.0 * rndz;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; displaced.y += sin(angle) * t * 40.0 * rndz;&amp;#160; &amp;#160; &amp;#160;//20&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float psize = (snoise(vec2(uTime, pindex) * 0.5) + 2.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; psize *= max(grey, 0.2);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; psize *= uSize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 mvPosition = modelViewMatrix * vec4(displaced, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; mvPosition.xyz += position * psize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_Position = projectionMatrix * mvPosition;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; `&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function fragmentShader() {&lt;br /&gt;&amp;#160; &amp;#160; return `&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform sampler2D uTexture;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uAlphaCircle;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uAlphaSquare;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uniform float uCircleORsquare;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; varying vec2 vPUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; void main() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 color = vec4(0.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 uv = vUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 puv = vPUv;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 colA = texture2D(uTexture, puv);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float border = 0.3;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float radius = 0.5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float dist = radius - distance(uv, vec2(0.5));&amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; float t = smoothstep(uCircleORsquare, border, dist);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color = colA;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color.a = t;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; //gl_FragColor = vec4(color.r, color.g, color.b, uAlphaSquare);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(color.r, color.g, color.b, t - uAlphaCircle);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; `&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;[/html]&lt;/p&gt;</description>
			<author>mybb@mybb.ru (ArtTerra)</author>
			<pubDate>Thu, 25 Nov 2021 11:13:59 +0300</pubDate>
			<guid>http://artterra.artbb.me/viewtopic.php?pid=5#p5</guid>
		</item>
		<item>
			<title>Дизайны</title>
			<link>http://artterra.artbb.me/viewtopic.php?pid=4#p4</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/990288.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/990288.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/147682.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/147682.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/794637.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/794637.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/391120.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/391120.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/963697.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/963697.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/861228.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/861228.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/566886.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/566886.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/754178.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/754178.jpg&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://upforme.ru/uploads/001b/19/88/2/417310.jpg&quot; alt=&quot;http://upforme.ru/uploads/001b/19/88/2/417310.jpg&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (ArtTerra)</author>
			<pubDate>Wed, 24 Nov 2021 21:12:10 +0300</pubDate>
			<guid>http://artterra.artbb.me/viewtopic.php?pid=4#p4</guid>
		</item>
		<item>
			<title>Реклама #01</title>
			<link>http://artterra.artbb.me/viewtopic.php?pid=2#p2</link>
			<description>&lt;p&gt;0&lt;/p&gt;</description>
			<author>mybb@mybb.ru (ArtTerra)</author>
			<pubDate>Mon, 29 Mar 2021 23:02:37 +0300</pubDate>
			<guid>http://artterra.artbb.me/viewtopic.php?pid=2#p2</guid>
		</item>
	</channel>
</rss>
