I was reading some discussion about WebGL on github, and one of the links took me to someone’s repository.
The library appears to be a direct copy of the ThreeJS framework.
Every single thing across many repositories on this person’s account are just refactored duplicates of ThreeJS’s library, and it’s claimed as their own. Is this legal?
From ThreeJS examples: three.js webgl - instancing - raycast
<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js webgl - instancing - raycast</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
<!-- Import maps polyfill -->
<!-- Remove this when import maps will be widely supported -->
<script async src="https://unpkg.com/es-module-shims@1.6.3/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "../build/three.module.js",
"three/addons/": "./jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import Stats from 'three/addons/libs/stats.module.js';
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
let camera, scene, renderer, controls, stats;
let mesh;
const amount = parseInt( window.location.search.slice( 1 ) ) || 10;
const count = Math.pow( amount, 3 );
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2( 1, 1 );
const color = new THREE.Color();
const white = new THREE.Color().setHex( 0xffffff );
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.1, 100 );
camera.position.set( amount, amount, amount );
camera.lookAt( 0, 0, 0 );
scene = new THREE.Scene();
const light = new THREE.HemisphereLight( 0xffffff, 0x888888, 3 );
light.position.set( 0, 1, 0 );
scene.add( light );
const geometry = new THREE.IcosahedronGeometry( 0.5, 3 );
const material = new THREE.MeshPhongMaterial( { color: 0xffffff } );
mesh = new THREE.InstancedMesh( geometry, material, count );
let i = 0;
const offset = ( amount - 1 ) / 2;
const matrix = new THREE.Matrix4();
for ( let x = 0; x < amount; x ++ ) {
for ( let y = 0; y < amount; y ++ ) {
for ( let z = 0; z < amount; z ++ ) {
matrix.setPosition( offset - x, offset - y, offset - z );
mesh.setMatrixAt( i, matrix );
mesh.setColorAt( i, color );
i ++;
}
}
}
scene.add( mesh );
//
const gui = new GUI();
gui.add( mesh, 'count', 0, count );
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.useLegacyLights = false;
document.body.appendChild( renderer.domElement );
controls = new OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.enableZoom = false;
controls.enablePan = false;
stats = new Stats();
document.body.appendChild( stats.dom );
window.addEventListener( 'resize', onWindowResize );
document.addEventListener( 'mousemove', onMouseMove );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function onMouseMove( event ) {
event.preventDefault();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}
function animate() {
requestAnimationFrame( animate );
controls.update();
raycaster.setFromCamera( mouse, camera );
const intersection = raycaster.intersectObject( mesh );
if ( intersection.length > 0 ) {
const instanceId = intersection[ 0 ].instanceId;
mesh.getColorAt( instanceId, color );
if ( color.equals( white ) ) {
mesh.setColorAt( instanceId, color.setHex( Math.random() * 0xffffff ) );
mesh.instanceColor.needsUpdate = true;
}
}
render();
stats.update();
}
function render() {
renderer.render( scene, camera );
}
</script>
</body>
</html>
This person’s code at https://github.com/Soft8Soft/verge3d-code-examples/blob/02e56932cb2a69bab8d85226dc91fe9372f2a8e7/webgl_instancing_raycast.html:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Verge3D webgl - instancing - raycast</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
<!-- Import maps polyfill -->
<!-- Remove this when import maps will be widely supported -->
<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"v3d": "../build/v3d.module.js",
"v3d/addons/": "./jsm/"
}
}
</script>
<script type="module">
import * as v3d from 'v3d';
import Stats from 'v3d/addons/libs/stats.module.js';
import { GUI } from 'v3d/addons/libs/lil-gui.module.min.js';
import { OrbitControls } from 'v3d/addons/controls/OrbitControls.js';
let camera, scene, renderer, controls, stats;
let mesh;
const amount = parseInt(window.location.search.slice(1)) || 10;
const count = Math.pow(amount, 3);
const raycaster = new v3d.Raycaster();
const mouse = new v3d.Vector2(1, 1);
const color = new v3d.Color();
const white = new v3d.Color().setHex(0xffffff);
init();
animate();
function init() {
camera = new v3d.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 100);
camera.position.set(amount, amount, amount);
camera.lookAt(0, 0, 0);
scene = new v3d.Scene();
const light = new v3d.HemisphereLight(0xffffff, 0x888888);
light.position.set(0, 1, 0);
scene.add(light);
const geometry = new v3d.IcosahedronGeometry(0.5, 3);
const material = new v3d.MeshPhongMaterial({ color: 0xffffff });
mesh = new v3d.InstancedMesh(geometry, material, count);
let i = 0;
const offset = (amount - 1) / 2;
const matrix = new v3d.Matrix4();
for (let x = 0; x < amount; x ++) {
for (let y = 0; y < amount; y ++) {
for (let z = 0; z < amount; z ++) {
matrix.setPosition(offset - x, offset - y, offset - z);
mesh.setMatrixAt(i, matrix);
mesh.setColorAt(i, color);
i++;
}
}
}
scene.add(mesh);
//
const gui = new GUI();
gui.add(mesh, 'count', 0, count);
renderer = new v3d.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.enableZoom = false;
controls.enablePan = false;
stats = new Stats();
document.body.appendChild(stats.dom);
window.addEventListener('resize', onWindowResize);
document.addEventListener('mousemove', onMouseMove);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function onMouseMove(event) {
event.preventDefault();
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
}
function animate() {
requestAnimationFrame(animate);
controls.update();
raycaster.setFromCamera(mouse, camera);
const intersection = raycaster.intersectObject(mesh);
if (intersection.length > 0) {
const instanceId = intersection[0].instanceId;
mesh.getColorAt(instanceId, color);
if (color.equals(white)) {
mesh.setColorAt(instanceId, color.setHex(Math.random() * 0xffffff));
mesh.instanceColor.needsUpdate = true;
}
}
render();
stats.update();
}
function render() {
renderer.render(scene, camera);
}
</script>
</body>
</html>
You can read the ThreeJS license agreement here : (https://github.com/mrdoob/three.js/blob/6710c984785a9f53e9910cfb109797239daa1966/LICENSE)
This just seems like plain copyright infringement.
Also, not sure what “keymanager.py” does (verge3d repo), it is very obviously intentionally obfuscated and reads/writes/executes things on the user’s computer, I would probably avoid downloading this repository.
For instance, what is the activate function writing?
def activate(path, key, l1ll_opy_=True):
if l1ll_opy_ and not l111l_opy_(key):
return False
l1ll1_opy_ = l1_opy_ (u"ࠨࡡࡢ࡚࠸ࡊࡌࡠࡡࠪࠄ") + key[0:10]
file = None
with open(path, l1_opy_ (u"ࠩࡵࠫࠅ"), encoding=l1_opy_ (u"ࠪࡹࡹ࠭࠹ࠩࠆ")) as l1llll_opy_:
file = l1llll_opy_.read()
with open(path, l1_opy_ (u"ࠫࡼ࠭ࠇ"), encoding=l1_opy_ (u"ࠬࡻࡴࡧ࠻ࠫࠈ")) as l1l1l_opy_:
l1l1l_opy_.write(l1lll_opy_.sub(l1ll1_opy_, file))
return True
I almost downloaded the library thinking it’s from a legitimate company, but I honestly cannot tell if it’s malicious or not, but the obfuscation made me cautious.