declare module "three" {
	export class Object3D {
		add(...objects: Object3D[]): this;
		position: Vector3;
		rotation: Euler;
		scale: Vector3;
		visible: boolean;
		userData: Record<string, any>;
		[key: string]: any;
	}

	export class Vector3 {
		constructor(x?: number, y?: number, z?: number);
		x: number;
		y: number;
		z: number;
		set(x: number, y: number, z: number): this;
		[key: string]: any;
	}

	export class Euler {
		constructor(x?: number, y?: number, z?: number, order?: string);
		x: number;
		y: number;
		z: number;
		[key: string]: any;
	}

	export class Mesh extends Object3D {
		constructor(geometry?: BufferGeometry, material?: Material);
		geometry: BufferGeometry;
		material: Material;
	}

	export class Group extends Object3D {}

	export class Sprite extends Object3D {
		constructor(material?: SpriteMaterial);
		material: SpriteMaterial;
	}

	export class SphereGeometry extends BufferGeometry {
		constructor(radius?: number, widthSegments?: number, heightSegments?: number);
	}

	export class RingGeometry extends BufferGeometry {
		constructor(innerRadius?: number, outerRadius?: number, thetaSegments?: number);
	}

	export class BufferGeometry {
		dispose(): void;
		[key: string]: any;
	}

	export class Material {
		dispose(): void;
		transparent: boolean;
		opacity: number;
		[key: string]: any;
	}

	export class MeshBasicMaterial extends Material {
		constructor(params?: Record<string, any>);
		color: Color;
	}

	export class MeshLambertMaterial extends Material {
		constructor(params?: Record<string, any>);
		color: Color;
	}

	export class SpriteMaterial extends Material {
		constructor(params?: Record<string, any>);
		map: Texture | null;
	}

	export class Color {
		constructor(color?: string | number);
		set(color: string | number): this;
		[key: string]: any;
	}

	export class Texture {
		needsUpdate: boolean;
		dispose(): void;
		[key: string]: any;
	}

	export class CanvasTexture extends Texture {
		constructor(canvas: HTMLCanvasElement);
	}

	export class TextureLoader {
		load(url: string, onLoad?: (tex: Texture) => void): Texture;
	}

	export default Object3D;
}
