minerender 2.1.0-alpha.3 → 2.1.0-alpha.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,11 @@
1
1
  import * as three from 'three';
2
- import { Vector3, PixelFormat, BoxGeometry, Material, Mesh, Euler, Vector2, BufferAttribute, Float32BufferAttribute, Object3D, Box3, InstancedMesh, PerspectiveCamera, OrthographicCamera, Matrix4, Scene, Texture, Camera, MOUSE, TOUCH, WebGLRenderer, EventDispatcher, Raycaster, Intersection, CanvasTexture, BufferGeometry as BufferGeometry$1, InterleavedBufferAttribute, TrianglesDrawModes, Line, Points } from 'three';
2
+ import { Vector3, PixelFormat, BoxGeometry, Material, Mesh, Euler, Vector2, BufferAttribute, Float32BufferAttribute, BufferGeometry, Object3D, Box3, InstancedMesh, PerspectiveCamera, OrthographicCamera, Matrix4, Scene, Object3DEventMap, Texture, Camera, MOUSE, TOUCH, WebGLRenderer, EventDispatcher, Raycaster, Intersection, MeshBasicMaterial, CanvasTexture, InterleavedBufferAttribute, TrianglesDrawModes, Line, Points } from 'three';
3
3
  import * as nodeCanvas from 'canvas';
4
4
  import { ImageData as ImageData$1, CanvasRenderingContext2D } from 'canvas';
5
- import { AxiosResponse, AxiosRequestConfig } from 'axios';
6
5
  import { Buffer as Buffer$1 } from 'buffer';
7
6
  import { NBT } from 'prismarine-nbt';
8
7
  import { ZipReader } from '@zip.js/zip.js';
9
8
  import { AsyncLoadingCache, SimpleCache } from '@inventivetalent/loading-cache';
10
- import { BufferGeometry } from 'three/src/core/BufferGeometry';
11
- import { Material as Material$1 } from 'three/src/materials/Material';
12
9
  import Stats from 'stats.js';
13
10
  import { EffectComposer } from 'postprocessing';
14
11
 
@@ -17,7 +14,7 @@ interface AnimatorFunction {
17
14
  }
18
15
 
19
16
  declare enum Axis {
20
- X = "X",
17
+ X = "x",
21
18
  Y = "y",
22
19
  Z = "z"
23
20
  }
@@ -62,10 +59,11 @@ declare function createCanvas(width: number, height: number): CompatCanvas;
62
59
  declare abstract class PersistentCache<B = unknown> {
63
60
  readonly backing: B;
64
61
  /** Bump to invalidate every persisted entry. */
65
- static readonly VERSION = 1;
62
+ static readonly VERSION = 2;
66
63
  static open(name: string): PersistentCache;
67
64
  protected constructor(backing: B);
68
65
  abstract get<T>(key: string): Promise<T>;
66
+ /** Loads a missing entry and stores only non-nullish results. */
69
67
  getOrLoad<T>(key: string, loader: (key: string) => Promise<T>): Promise<T>;
70
68
  abstract put<T>(key: string, value: T): Promise<T>;
71
69
  abstract delete<T>(key: string): Promise<void>;
@@ -175,6 +173,7 @@ declare class AssetKey extends BasicAssetKey {
175
173
  rootType: "assets" | "data" | string;
176
174
  extension: ".json" | ".png" | string;
177
175
  root?: string | undefined;
176
+ readonly isAssetKey: true;
178
177
  constructor(namespace: string, path: string, assetType?: AssetType | undefined, type?: string | undefined, rootType?: "assets" | "data" | string, extension?: ".json" | ".png" | string, root?: string | undefined);
179
178
  static parse(assetType: AssetType, str: string, origin?: AssetKey): AssetKey;
180
179
  toString(): string;
@@ -247,7 +246,8 @@ declare enum DisplayPosition {
247
246
  GUI = "gui",
248
247
  HEAD = "head",
249
248
  GROUND = "ground",
250
- FIXED = "fixed"
249
+ FIXED = "fixed",
250
+ ON_SHELF = "on_shelf"
251
251
  }
252
252
  declare const DISPLAY_POSITIONS: DisplayPosition[];
253
253
 
@@ -256,6 +256,46 @@ declare enum GuiLight {
256
256
  SIDE = "side"
257
257
  }
258
258
 
259
+ interface RequestConfig extends RequestInit {
260
+ url: string;
261
+ /** Prepended to relative URLs, preserving any path in the base URL. */
262
+ baseURL?: string;
263
+ /** Timeout per attempt in milliseconds, including body reading. Defaults to 5000; 0 disables it. */
264
+ timeout?: number;
265
+ responseType?: "json" | "arraybuffer";
266
+ }
267
+ interface RequestResponse<T = any> {
268
+ data: T;
269
+ status: number;
270
+ statusText: string;
271
+ headers: Headers;
272
+ /** Final URL after redirects. */
273
+ url: string;
274
+ }
275
+ declare class RequestError extends Error {
276
+ readonly response?: RequestResponse<undefined> | undefined;
277
+ readonly cause?: unknown;
278
+ constructor(message: string, response?: RequestResponse<undefined> | undefined, cause?: unknown);
279
+ }
280
+ declare class Requests {
281
+ private static genericQueue;
282
+ private static mcAssetRequestQueue;
283
+ static genericRequest(request: RequestConfig): Promise<RequestResponse>;
284
+ static mcAssetRequest(request: RequestConfig): Promise<RequestResponse>;
285
+ static setMcAssetRoot(root: string): void;
286
+ /** Counts unsettled calls, including retry delays and requests still running after shutdown. */
287
+ static get queueSizes(): {
288
+ generic: number;
289
+ mcAsset: number;
290
+ };
291
+ /**
292
+ * Permanently stops both queues and rejects waiting, retrying, and future requests.
293
+ * Requests already running can finish. Idle queues hold no timer, so Node can exit without
294
+ * this cleanup. See {@link shutdown}.
295
+ */
296
+ static end(): void;
297
+ }
298
+
259
299
  declare class WrappedImage {
260
300
  readonly dta: ExtractableImageData;
261
301
  constructor(dta: ExtractableImageData);
@@ -291,7 +331,7 @@ declare class ImageLoader {
291
331
  static infoToData(info: ImageInfo): Promise<ImageData>;
292
332
  static getData(src: string): Promise<ImageData>;
293
333
  static getCanvasData(src: string): Promise<ExtractableImageData>;
294
- static processResponse(response: Partial<AxiosResponse>): Promise<ImageInfo>;
334
+ static processResponse(response: Pick<RequestResponse<ArrayBuffer>, "data" | "url">): Promise<ImageInfo>;
295
335
  static loadInfo(src: string): Promise<ImageInfo>;
296
336
  static getInfo(src: string): Promise<ImageInfo>;
297
337
  static loadWrapped(src: string): Promise<WrappedImage>;
@@ -305,7 +345,7 @@ declare const DEFAULT_ELEMENTS: ModelElement[];
305
345
  interface Model extends MinecraftAsset {
306
346
  textures?: IModelTextures;
307
347
  parent?: string;
308
- display?: ModelDisplay;
348
+ display?: Partial<Record<DisplayPosition, ModelDisplay>>;
309
349
  elements?: ModelElement[];
310
350
  hierarchy?: string[];
311
351
  }
@@ -320,7 +360,6 @@ interface ItemModel extends Model {
320
360
  interface TextureAsset extends MinecraftAsset, ImageInfo {
321
361
  }
322
362
  interface ModelDisplay {
323
- position?: DisplayPosition;
324
363
  translation?: TripleArray;
325
364
  rotation?: TripleArray;
326
365
  scale?: TripleArray;
@@ -340,13 +379,7 @@ declare function isDoubleArray(obj: any): obj is DoubleArray;
340
379
  declare function isTripleArray(obj: any): obj is TripleArray;
341
380
  declare function isQuadArray(obj: any): obj is QuadArray;
342
381
 
343
- /**
344
- * down up
345
- * east north west south
346
- *
347
- * bottom-left to top-right
348
- * [bl, br, tl, tr]
349
- */
382
+ /** Vanilla Minecraft cube UVs in Three.js BoxGeometry face and vertex order. */
350
383
  declare class MinecraftCubeTexture {
351
384
  readonly u: number;
352
385
  readonly v: number;
@@ -362,7 +395,7 @@ declare class MinecraftCubeTexture {
362
395
  getUvSouth(w: number, h: number, l: number): QuadArray<DoubleArray>;
363
396
  getUvNorth(w: number, h: number, l: number): QuadArray<DoubleArray>;
364
397
  getFaceUv(face: CubeFace, w: number, h: number, l: number): QuadArray<DoubleArray>;
365
- toUvArray(w: number, h: number, l: number): number[];
398
+ toUvArray(w: number, h: number, l: number, mirror?: boolean): number[];
366
399
  }
367
400
 
368
401
  interface MinecraftTextureMeta extends MinecraftAsset {
@@ -431,7 +464,7 @@ interface Transformable {
431
464
  declare function isTransformable(obj: any): obj is Transformable;
432
465
 
433
466
  declare const changeEvent: {
434
- type: string;
467
+ type: "change";
435
468
  };
436
469
  type Maybe<T> = T | undefined;
437
470
  declare function md5(str: string): string;
@@ -515,6 +548,7 @@ declare class UVMapper {
515
548
  static setCubeUvs(geometry: BoxGeometry, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, faces: ModelFaces): void;
516
549
  static facesToUvArray(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): number[];
517
550
  static facesToUv(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): Float32BufferAttribute;
551
+ static lockUvs(geometry: BoxGeometry, faces: ModelFaces, atlas: TextureAtlas, rotation: Euler): void;
518
552
  static getAtlas(model: Model): Promise<Maybe<TextureAtlas>>;
519
553
  static fillMissingTextureKeys<T>(textures: ModelTextures, target: {
520
554
  [k: string]: T;
@@ -536,14 +570,13 @@ declare class MinecraftFaceUV {
536
570
  }
537
571
 
538
572
  /**
539
- * Releases every long-lived timer MineRender holds, so a Node process can exit.
573
+ * Stops the shared Ticker and request queues, and clears the in-memory caches.
540
574
  *
541
- * Both `@inventivetalent/loading-cache` (cache expiry) and `jobqu` (request queue draining) use
542
- * self-rescheduling timers that are not unref'd, which keeps the event loop alive for as long as
543
- * the library is loaded. Browsers don't care, but anything headless - a render server, a CLI, a
544
- * test run - has to call this when it's done.
575
+ * Idle Node processes can exit without calling this: cache and Ticker timers are unref'd,
576
+ * and idle request queues hold no timer. Pending requests keep their normal timer references.
545
577
  *
546
- * The library stays usable afterwards; the caches and queues simply start over.
578
+ * Call this only when finished with MineRender. Queued, retrying, and future requests reject;
579
+ * HTTP requests already running can finish. Queue shutdown is permanent, and cache expiry timers do not restart.
547
580
  */
548
581
  declare function shutdown(): void;
549
582
 
@@ -561,32 +594,7 @@ type Task = () => any | Promise<any>;
561
594
 
562
595
  declare function prefix(prefix?: string): string;
563
596
 
564
- interface ModelPart {
565
- textureWidth: number;
566
- textureHeight: number;
567
- textureOffsetU: number;
568
- textureOffsetV: number;
569
- pivotX: number;
570
- pivotY: number;
571
- pivotZ: number;
572
- pitch: number;
573
- yaw: number;
574
- roll: number;
575
- mirror: boolean;
576
- cubes: Cube[];
577
- children: ModelPart[];
578
- }
579
- interface Cube {
580
- minX: number;
581
- minY: number;
582
- minZ: number;
583
- maxX: number;
584
- maxY: number;
585
- maxZ: number;
586
- }
587
-
588
597
  declare function applyElementRotation(rotation: ElementRotation, geometry: BufferGeometry): void;
589
- declare function applyModelPartRotation(modelPart: ModelPart, geometry: BufferGeometry): void;
590
598
  declare function applyGenericRotation(axis: Axis, rotation: number, obj: Object3D): void;
591
599
  declare function addBox3WireframeToObject(box: Box3, obj: Object3D, color?: number, w?: number): void;
592
600
  declare function addWireframeToObject(obj: Object3D, color?: number, w?: number): void;
@@ -615,15 +623,47 @@ declare enum AssetParser {
615
623
  declare abstract class AssetSource {
616
624
  protected constructor();
617
625
  abstract get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;
626
+ /**
627
+ * Identifies this source's content across sessions for persistent caching. Sources that
628
+ * cannot tell whether their content changed (an unnamed archive, for example) return
629
+ * undefined, which keeps their results out of long-lived caches.
630
+ */
631
+ get cacheId(): Maybe<string>;
632
+ }
633
+ /** A source failed to load or parse an asset; cause retains the original failure. */
634
+ declare class AssetLoadError extends Error {
635
+ readonly source: AssetSource;
636
+ readonly key: AssetKey;
637
+ readonly path: string;
638
+ readonly cause: unknown;
639
+ constructor(source: AssetSource, key: AssetKey, path: string, cause: unknown);
618
640
  }
619
641
 
620
642
  declare class AssetLoader {
621
643
  static ROOT: string;
622
644
  private static _SOURCES;
645
+ /** Used when a registered source cannot identify its content, so nothing persists past this session. */
646
+ private static readonly SESSION_SCOPE;
647
+ static get version(): string;
648
+ static setVersion(version: string): void;
649
+ /**
650
+ * Scope for persistent cache keys. Empty with only the default vanilla sources, so their
651
+ * entries stay valid across sessions; otherwise it names every added source (resource packs,
652
+ * mirrors) so their results never masquerade as vanilla assets after a reload.
653
+ */
654
+ static get persistentScope(): string;
655
+ /** Prefixes a persistent cache key with the current source scope. */
656
+ static persistentKey(key: string): string;
623
657
  static addSource(key: string, source: AssetSource, override?: boolean): void;
624
658
  static removeSource(key: string): Maybe<AssetSource>;
625
659
  static getAll<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<T[]>;
660
+ /** Returns the first defined result in source-priority order, without merging assets. */
626
661
  static get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;
662
+ /** Tries each path within a source before considering lower-priority sources. */
663
+ static getFirst<T extends MinecraftAsset>(keys: readonly AssetKey[], parser: AssetParser | string): Promise<Maybe<{
664
+ key: AssetKey;
665
+ asset: T;
666
+ }>>;
627
667
  }
628
668
 
629
669
  interface BlockState extends MinecraftAsset {
@@ -638,18 +678,19 @@ interface BlockStateVariant {
638
678
  y?: number;
639
679
  x?: number;
640
680
  uvlock?: boolean;
681
+ weight?: number;
641
682
  }
642
683
  interface BlockStateMultipart {
643
- when?: MultipartCondition | {
644
- OR: MultipartCondition[];
645
- };
646
- apply?: BlockStateVariant;
647
- }
648
- interface MultipartCondition {
649
- [key: string]: string;
684
+ when?: MultipartCondition;
685
+ apply?: BlockStateVariant | BlockStateVariant[];
650
686
  }
687
+ type MultipartCondition = Record<string, string> | {
688
+ OR: MultipartCondition[];
689
+ } | {
690
+ AND: MultipartCondition[];
691
+ };
651
692
 
652
- declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.17.1";
693
+ declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
653
694
  declare const DEFAULT_NAMESPACE = "minecraft";
654
695
  declare class Assets {
655
696
  /**
@@ -688,25 +729,50 @@ declare class DefaultBlockStates implements MinecraftAsset {
688
729
  [k: string]: BlockStatePropertyDefaults;
689
730
  }
690
731
 
691
- interface EntityModel extends BasicMinecraftAsset {
692
- parts?: {
693
- [p: string]: ModelPart;
732
+ interface EntityModel {
733
+ key: BasicAssetKey;
734
+ texture?: AssetKey;
735
+ layer: EntityModelLayer;
736
+ id: string;
737
+ }
738
+ interface EntityModelFile extends MinecraftAsset {
739
+ id: string;
740
+ layers: Record<string, EntityModelLayer>;
741
+ }
742
+ interface EntityModelLayer {
743
+ texture: [number, number];
744
+ textureLocation?: string;
745
+ root: EntityModelPart;
746
+ }
747
+ interface EntityModelPart {
748
+ pose: {
749
+ offset: [number, number, number];
750
+ rotation: [number, number, number];
751
+ scale?: [number, number, number];
694
752
  };
753
+ texture?: [number, number];
754
+ cubes: EntityModelCube[];
755
+ children: Record<string, EntityModelPart>;
756
+ }
757
+ interface EntityModelCube {
758
+ origin: [number, number, number];
759
+ size: [number, number, number];
760
+ uv: [number, number];
761
+ grow?: [number, number, number];
762
+ mirror?: boolean;
695
763
  }
696
764
 
697
765
  declare class Entities {
698
- static getBlockEntityModels(): Promise<Maybe<BlockEntityModels>>;
699
- static getEntityModels(): Promise<Maybe<EntityModels>>;
700
- static getBlockList(): Promise<string[]>;
701
766
  static getEntityList(): Promise<string[]>;
702
- static getBlock(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>>;
703
- static getEntity(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>>;
704
- }
705
- declare class EntityModels implements MinecraftAsset {
706
- [k: string]: any;
767
+ static getEntity(modelKey: BasicAssetKey, textureKey?: BasicAssetKey, options?: EntityModelOptions): Promise<Maybe<EntityModel>>;
768
+ static resolveTexture(modelKey: BasicAssetKey): Promise<Maybe<AssetKey>>;
769
+ /** @deprecated Use getEntityList(); block entities share the entity dataset. */
770
+ static getBlockList(): Promise<string[]>;
771
+ /** @deprecated Use getEntity(); block entities share the entity dataset. */
772
+ static getBlock(modelKey: BasicAssetKey, textureKey?: BasicAssetKey, options?: EntityModelOptions): Promise<Maybe<EntityModel>>;
707
773
  }
708
- declare class BlockEntityModels implements MinecraftAsset {
709
- [k: string]: any;
774
+ interface EntityModelOptions {
775
+ layer?: string;
710
776
  }
711
777
 
712
778
  declare class Models {
@@ -714,12 +780,22 @@ declare class Models {
714
780
  private static get PERSISTENT_CACHE();
715
781
  static getItemList(): Promise<string[]>;
716
782
  static loadAndMerge(key: AssetKey): Promise<Maybe<Model>>;
783
+ private static getItemModel;
784
+ private static defaultItemModel;
717
785
  static getRaw(key: AssetKey): Promise<Maybe<Model>>;
718
786
  static getMerged(key: AssetKey): Promise<Maybe<Model>>;
719
787
  static get(key: AssetKey): Promise<Maybe<Model>>;
720
788
  static clearCache(): Promise<void>;
721
789
  }
722
790
 
791
+ declare class DisplayTransforms {
792
+ /** Resolve hand fallbacks within one model, before inheriting parent display entries. */
793
+ static withHandFallbacks(display: Model["display"]): Model["display"];
794
+ /** Build a display pose for geometry already centered at the model's [8, 8, 8] pivot. */
795
+ static getMatrix(display: Model["display"], position: DisplayPosition): Matrix4;
796
+ static apply(geometry: BufferGeometry, matrix: Matrix4): void;
797
+ }
798
+
723
799
  declare class ModelGenerator {
724
800
  static readonly ITEM_LAYERS: string[];
725
801
  static generateItemModel(imageData: ImageData$1, layer: string): ModelElement[];
@@ -736,6 +812,12 @@ interface Block {
736
812
  nbt?: any;
737
813
  }
738
814
 
815
+ declare class BlockTints {
816
+ /** Resolves block preview colors without biome context; explicit tints take precedence. */
817
+ static get(key: AssetKey | undefined, state: BlockStateProperties, model: Model, tints?: Record<number, number>): Promise<Record<number, number> | undefined>;
818
+ private static grassColor;
819
+ }
820
+
739
821
  interface Instanceable {
740
822
  nextInstance(): InstanceReference<SceneObject>;
741
823
  getMatrixAt(index: number, matrix?: Matrix4): Matrix4;
@@ -792,6 +874,12 @@ declare class ModelObject extends SceneObject {
792
874
  protected applyTextures(): void;
793
875
  }
794
876
  interface ModelObjectOptions extends SceneObjectOptions {
877
+ /** Minecraft display pose applied around the model center, before scene transforms. */
878
+ displayPosition?: DisplayPosition;
879
+ /** Quarter-turn block rotation in radians to compensate when locking UVs. */
880
+ uvLockRotation?: TripleArray;
881
+ /** sRGB 0xRRGGBB colors by face tint index; omitted indices stay white. */
882
+ tints?: Record<number, number>;
795
883
  }
796
884
  declare function isModelObject(obj: any): obj is ModelObject;
797
885
 
@@ -824,24 +912,35 @@ declare enum SkinPart {
824
912
  }
825
913
  declare const SKIN_PARTS: SkinPart[];
826
914
 
915
+ type CapeLayout = "minecraft" | "optifine" | "labymod";
916
+ declare const capeTextureSizes: Record<CapeLayout, DoubleArray>;
917
+
827
918
  declare class SkinObject extends SceneObject {
828
919
  readonly options: SkinObjectOptions;
829
920
  private slim;
830
- private legacy;
921
+ private detectedSlim;
831
922
  private skinTextureSrc?;
832
- private skinTextureWidth;
833
- private skinTextureHeight;
834
- private capeTextureSrc?;
923
+ private skinMaterial?;
924
+ private skinLoad;
925
+ private capeLoad;
835
926
  constructor(options?: DeepPartial<SkinObjectOptions>);
836
927
  init(): Promise<void>;
837
928
  protected removeMeshes(): void;
838
929
  protected createMeshes(): void;
839
- setSkinTexture(src: string): void;
840
- setSlim(slim: boolean): void;
841
- setLegacy(legacy: boolean): void;
930
+ setSkinTexture(src: string): Promise<void>;
931
+ /** Load a cape texture in the selected layout, or pass undefined to remove the cape. */
932
+ setCapeTexture(src?: string, layout?: CapeLayout): Promise<void>;
933
+ /** Select the arm model, or pass undefined to use texture detection. */
934
+ setSlim(slim?: boolean): void;
935
+ private updateSlim;
936
+ /** Select the texture layout, or pass undefined to detect it from image dimensions. */
937
+ setLegacy(legacy?: boolean): Promise<void>;
938
+ dispose(): void;
842
939
  protected getBoxGeometry(part: SkinPart): BoxGeometry;
843
940
  }
844
941
  interface SkinObjectOptions extends SceneObjectOptions {
942
+ slim?: boolean;
943
+ legacy?: boolean;
845
944
  }
846
945
 
847
946
  declare class EntityObject extends SceneObject {
@@ -854,11 +953,14 @@ declare class EntityObject extends SceneObject {
854
953
  constructor(entity: EntityModel, options?: Partial<EntityObjectOptions>);
855
954
  init(): Promise<void>;
856
955
  dispose(): void;
956
+ private get textureKey();
857
957
  protected loadTextures(): Promise<void>;
858
958
  protected createMeshes(force?: boolean): void;
959
+ private createPart;
859
960
  protected applyTextures(): Promise<void>;
860
961
  }
861
962
  interface EntityObjectOptions extends SceneObjectOptions {
963
+ flip?: boolean;
862
964
  }
863
965
  declare function isEntityObject(obj: any): obj is EntityObject;
864
966
 
@@ -886,7 +988,9 @@ interface MineRenderSceneOptions {
886
988
  }
887
989
  declare function isMineRenderScene(obj: any): obj is MineRenderScene;
888
990
 
889
- declare class SceneObject extends Object3D implements Disposable, Instanceable, Transformable {
991
+ declare class SceneObject extends Object3D<Object3DEventMap & {
992
+ change: {};
993
+ }> implements Disposable, Instanceable, Transformable {
890
994
  readonly isSceneObject: true;
891
995
  static readonly DEFAULT_OPTIONS: SceneObjectOptions;
892
996
  readonly options: SceneObjectOptions;
@@ -912,9 +1016,9 @@ declare class SceneObject extends Object3D implements Disposable, Instanceable,
912
1016
  */
913
1017
  toggleGroupVisibility(name: string, visible?: boolean): boolean;
914
1018
  protected addOrReplaceMesh(mesh: Mesh, parent: Object3D, name?: string): void;
915
- protected createAndAddMesh(name?: string, group?: Object3D, geometry?: BufferGeometry, material?: Material$1 | Material$1[], offsetAxis?: Axis, offset?: number): Mesh;
916
- protected createMesh(name?: string, geometry?: BufferGeometry, material?: Material$1 | Material$1[], offsetAxis?: Axis, offset?: number): Mesh;
917
- protected createInstancedMesh(name: Maybe<string>, geometry: BufferGeometry, material: Material$1 | Material$1[], count: number): InstancedMesh;
1019
+ protected createAndAddMesh(name?: string, group?: Object3D, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset?: number): Mesh;
1020
+ protected createMesh(name?: string, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset?: number): Mesh;
1021
+ protected createInstancedMesh(name: Maybe<string>, geometry: BufferGeometry, material: Material | Material[], count: number): InstancedMesh;
918
1022
  /**
919
1023
  * Get a mesh by its name
920
1024
  */
@@ -1083,8 +1187,8 @@ interface NBTAsset extends MinecraftAsset, NBT {
1083
1187
  }
1084
1188
 
1085
1189
  interface ResponseParser<T extends MinecraftAsset> {
1086
- config(request: AxiosRequestConfig): any;
1087
- parse(response: AxiosResponse): Maybe<T> | Promise<Maybe<T>>;
1190
+ config(request: RequestConfig): any;
1191
+ parse(response: RequestResponse): Maybe<T> | Promise<Maybe<T>>;
1088
1192
  }
1089
1193
 
1090
1194
  declare class HostedAssetSource extends AssetSource {
@@ -1103,6 +1207,7 @@ declare class HostedAssetSource extends AssetSource {
1103
1207
  private readonly _options;
1104
1208
  constructor(root: string, options?: Partial<HostedAssetSourceOptions>);
1105
1209
  get root(): string;
1210
+ get cacheId(): string;
1106
1211
  get options(): HostedAssetSourceOptions;
1107
1212
  get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser): Promise<Maybe<T>>;
1108
1213
  }
@@ -1117,6 +1222,8 @@ interface ArchiveEntry {
1117
1222
  }
1118
1223
 
1119
1224
  interface ArchiveProxy {
1225
+ /** Identifies the archive's content across sessions; undefined when it cannot be identified. */
1226
+ readonly id?: string;
1120
1227
  getEntries(): Promise<ArchiveEntry[]>;
1121
1228
  }
1122
1229
 
@@ -1124,6 +1231,7 @@ declare class ArchiveAssetSource extends AssetSource implements ArchiveProxy {
1124
1231
  readonly _archiveProxy: ArchiveProxy;
1125
1232
  constructor(archiveProxy: ArchiveProxy);
1126
1233
  static blob(blob: Blob): ArchiveAssetSource;
1234
+ get cacheId(): Maybe<string>;
1127
1235
  getEntries(): Promise<ArchiveEntry[]>;
1128
1236
  getEntry(path: string): Promise<Maybe<ArchiveEntry>>;
1129
1237
  get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;
@@ -1134,7 +1242,8 @@ declare class ArchiveAssetSource extends AssetSource implements ArchiveProxy {
1134
1242
  declare class BrowserArchiveProxy implements ArchiveProxy {
1135
1243
  readonly _blob: Blob;
1136
1244
  readonly _reader: ZipReader<Blob>;
1137
- constructor(blob: Blob);
1245
+ readonly id?: string;
1246
+ constructor(blob: Blob, id?: string);
1138
1247
  getEntries(): Promise<ArchiveEntry[]>;
1139
1248
  }
1140
1249
 
@@ -1212,14 +1321,20 @@ declare class Caching {
1212
1321
  static readonly mergedModelCache: AsyncLoadingCache<CacheKey, Model>;
1213
1322
  static readonly modelTextureAtlasCache: AsyncLoadingCache<CacheKey, TextureAtlas>;
1214
1323
  static readonly blockStateCache: AsyncLoadingCache<CacheKey, BlockState>;
1324
+ static readonly listAssetCache: AsyncLoadingCache<CacheKey, ListAsset>;
1325
+ static readonly defaultBlockStatesCache: AsyncLoadingCache<CacheKey, DefaultBlockStates>;
1326
+ static readonly blockTintCache: AsyncLoadingCache<CacheKey, number>;
1327
+ static readonly entityModelCache: AsyncLoadingCache<CacheKey, EntityModelFile>;
1328
+ static readonly entityTextureCache: AsyncLoadingCache<CacheKey, AssetKey>;
1329
+ private static createAssetCache;
1215
1330
  /** Every cache above, so clear()/end() can never fall out of sync with the field list again. */
1216
1331
  private static get all();
1217
1332
  static clear(): void;
1218
1333
  /**
1219
1334
  * Clears every cache and stops its expiry timer.
1220
1335
  *
1221
- * loading-cache reschedules that timer indefinitely, so a Node process will not exit until
1222
- * this is called - see {@link shutdown}.
1336
+ * Expiry timers are unref'd in Node, so idle processes can exit without this cleanup.
1337
+ * Use {@link shutdown} to also stop requests and the shared Ticker.
1223
1338
  */
1224
1339
  static end(): void;
1225
1340
  static get cacheSizes(): {};
@@ -1319,15 +1434,14 @@ declare class Renderer implements Disposable {
1319
1434
  protected _scene: MineRenderScene;
1320
1435
  protected _camera: Camera;
1321
1436
  protected _renderer: WebGLRenderer;
1322
- protected _composer: EffectComposer;
1437
+ protected _composer?: EffectComposer;
1323
1438
  protected _controls?: OrbitControls;
1324
1439
  protected _stats?: Stats;
1325
1440
  protected _dirty: boolean;
1326
1441
  protected _animationLoop: any;
1327
- protected _fpsTimer: any;
1328
- protected _animationTimer?: NodeJS.Timeout;
1329
- protected _animationFrame?: number;
1442
+ protected _frameInterval?: number;
1330
1443
  protected _resizeListener?: () => void;
1444
+ private _nextFrameTime?;
1331
1445
  private _disposed;
1332
1446
  private readonly _debugHelpers;
1333
1447
  private readonly _eventDispatchers;
@@ -1336,7 +1450,7 @@ declare class Renderer implements Disposable {
1336
1450
  protected createScene(): MineRenderScene;
1337
1451
  protected createCamera(): Camera;
1338
1452
  protected createRenderer(): WebGLRenderer;
1339
- protected createComposer(): EffectComposer;
1453
+ protected createComposer(): Maybe<EffectComposer>;
1340
1454
  protected createControls(): Maybe<OrbitControls>;
1341
1455
  init(): void;
1342
1456
  get element(): Maybe<HTMLElement>;
@@ -1345,7 +1459,7 @@ declare class Renderer implements Disposable {
1345
1459
  * Redraws when the dispatcher emits the selected event. Registering the same pair twice has no effect.
1346
1460
  * The renderer removes its listener on disposal; the caller retains ownership of the dispatcher.
1347
1461
  */
1348
- registerEventDispatcher(dispatcher: EventDispatcher, changeEvent?: string): void;
1462
+ registerEventDispatcher(dispatcher: EventDispatcher<any>, changeEvent?: string): void;
1349
1463
  resize(width: number, height: number): void;
1350
1464
  get dirty(): boolean;
1351
1465
  set dirty(dirty: boolean);
@@ -1365,7 +1479,7 @@ declare class Renderer implements Disposable {
1365
1479
  get scene(): MineRenderScene;
1366
1480
  get camera(): Camera;
1367
1481
  get renderer(): WebGLRenderer;
1368
- get composer(): EffectComposer;
1482
+ get composer(): Maybe<EffectComposer>;
1369
1483
  /** Renderer-owned controls, or undefined when disabled at construction or after disposal. */
1370
1484
  get controls(): Maybe<OrbitControls>;
1371
1485
  }
@@ -1394,6 +1508,7 @@ interface CameraOptions {
1394
1508
  lookingAt: Vector3 | TripleArray;
1395
1509
  }
1396
1510
  interface RenderOptions {
1511
+ /** Maximum draw rate (60 by default); zero or a negative value disables the limit. */
1397
1512
  fpsLimit: number;
1398
1513
  stats: boolean;
1399
1514
  antialias: boolean;
@@ -1421,7 +1536,7 @@ declare class SceneInspector {
1421
1536
  private selectedObject?;
1422
1537
  constructor(renderer: Renderer);
1423
1538
  protected init(): void;
1424
- findMeshChildren(from: Object3D, out?: Mesh[]): Mesh<three.BufferGeometry, three.Material | three.Material[]>[];
1539
+ findMeshChildren(from: Object3D, out?: Mesh[]): Mesh<three.BufferGeometry<three.NormalBufferAttributes>, three.Material | three.Material[], three.Object3DEventMap>[];
1425
1540
  onClick(event: any): void;
1426
1541
  appendTo(el: HTMLElement): void;
1427
1542
  protected handleRaycasterObjects(intersections: Intersection[]): void;
@@ -1458,34 +1573,33 @@ declare class StatLine {
1458
1573
  update(): void;
1459
1574
  }
1460
1575
 
1461
- declare class Requests {
1462
- private static axiosInstance;
1463
- private static mcAssetInstance;
1464
- private static genericQueue;
1465
- private static mcAssetRequestQueue;
1466
- static genericRequest(request: AxiosRequestConfig): Promise<AxiosResponse>;
1467
- static mcAssetRequest(request: AxiosRequestConfig): Promise<AxiosResponse>;
1468
- private static shouldRetry;
1469
- static setMcAssetRoot(root: string): void;
1470
- static get queueSizes(): {
1471
- generic: number;
1472
- mcAsset: number;
1473
- };
1474
- /**
1475
- * Stops both queue timers. jobqu reschedules itself indefinitely, so a Node process will not
1476
- * exit until this is called - see {@link shutdown}.
1477
- */
1478
- static end(): void;
1479
- }
1480
-
1481
1576
  type SkinGeometries = Record<SkinPart, TripleArray>;
1482
1577
  declare const classicSkinGeometries: SkinGeometries;
1483
1578
  declare const slimSkinGeometries: SkinGeometries;
1484
1579
 
1580
+ declare class SkinImage {
1581
+ static getData(src: string): Promise<ImageData>;
1582
+ private static decodePng;
1583
+ }
1584
+
1485
1585
  type SkinTextureCoordinates = Record<SkinPart, ModelFaces>;
1486
1586
  declare const classicSkinTextureCoordinates: Readonly<SkinTextureCoordinates>;
1487
1587
  declare const slimSkinTextureCoordinates: Readonly<SkinTextureCoordinates>;
1488
1588
 
1589
+ interface SkinTexture {
1590
+ material: MeshBasicMaterial;
1591
+ slim: boolean;
1592
+ legacy: boolean;
1593
+ }
1594
+ declare class SkinTextures {
1595
+ static get(src: string, legacy?: boolean): Promise<SkinTexture>;
1596
+ static getCape(src: string, layout?: CapeLayout): Promise<MeshBasicMaterial>;
1597
+ private static createMaterial;
1598
+ private static isSlim;
1599
+ private static normalizeLegacy;
1600
+ private static makeBaseOpaque;
1601
+ }
1602
+
1489
1603
  declare class Skins {
1490
1604
  static fromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>>;
1491
1605
  static fromUuid(uuid: string): Promise<Maybe<string>>;
@@ -1494,8 +1608,11 @@ declare class Skins {
1494
1608
  static capeFromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>>;
1495
1609
  static capeFromUuid(uuid: string): Promise<Maybe<string>>;
1496
1610
  static capeFromUsername(username: string): Promise<Maybe<string>>;
1497
- static capeFromCapesDev(uuid: string, capeType?: string): Promise<Maybe<string>>;
1611
+ /** Returns a full static cape texture for a username or UUID. */
1612
+ static capeFromCapesDev(player: string, capeType?: string): Promise<Maybe<string>>;
1498
1613
  private static usernameToUuid;
1614
+ private static usernameToUuidMcProxy;
1615
+ /** @deprecated **/
1499
1616
  private static usernameToUuidSkinProxy;
1500
1617
  private static usernameToUuidMineTools;
1501
1618
  private static getProfileFromMinetools;
@@ -1505,11 +1622,18 @@ declare class Skins {
1505
1622
  private static getCrafatarCapeUrl;
1506
1623
  private static getMcHeadsSkinUrl;
1507
1624
  private static getMineSkinPlayerSkinUrl;
1625
+ /** @deprecated **/
1508
1626
  private static getSkinProxySkinUrl;
1627
+ /** @deprecated **/
1509
1628
  private static getSkinProxyCapeUrl;
1629
+ private static getMcProxySkinUrl;
1630
+ private static getMcProxyCapeUrl;
1510
1631
  }
1511
1632
 
1512
1633
  declare class TextureLoader {
1634
+ private static readonly failedTextures;
1635
+ /** Reports whether image loading failed, so cached textures can be retried. */
1636
+ static hasFailed(texture: Texture): boolean;
1513
1637
  protected static createTexture(): Texture;
1514
1638
  static loadInBackground(src: string, format?: PixelFormat, rotation?: number): Texture;
1515
1639
  static load(src: string, format?: PixelFormat, rotation?: number): Texture;
@@ -1523,12 +1647,12 @@ declare class Textures {
1523
1647
  static getImage(key: TextureKey): Texture;
1524
1648
  }
1525
1649
 
1526
- declare function mergeBufferGeometries(geometries: BufferGeometry$1[], useGroups?: boolean): BufferGeometry$1;
1650
+ declare function mergeBufferGeometries(geometries: BufferGeometry[], useGroups?: boolean): BufferGeometry;
1527
1651
  declare function mergeBufferAttributes(attributes: BufferAttribute[]): BufferAttribute;
1528
1652
  declare function interleaveAttributes(attributes: BufferAttribute[]): InterleavedBufferAttribute;
1529
- declare function estimateBytesUsed(geometry: BufferGeometry$1): number;
1530
- declare function mergeVertices(geometry: BufferGeometry$1, tolerance?: number): BufferGeometry$1;
1531
- declare function toTrianglesDrawMode(geometry: BufferGeometry$1, drawMode: TrianglesDrawModes): BufferGeometry$1;
1653
+ declare function estimateBytesUsed(geometry: BufferGeometry): number;
1654
+ declare function mergeVertices(geometry: BufferGeometry, tolerance?: number): BufferGeometry;
1655
+ declare function toTrianglesDrawMode(geometry: BufferGeometry, drawMode: TrianglesDrawModes): BufferGeometry;
1532
1656
  declare function computeMorphedAttributes(object: Mesh | Line | Points): object;
1533
1657
 
1534
1658
  interface BlockInfo {
@@ -1619,8 +1743,8 @@ declare class BrowserCache extends PersistentCache<LocalForage> {
1619
1743
  *
1620
1744
  * `image-size` pulls in `fs`/`path` at module scope, so it can only live in the Node build.
1621
1745
  * Everything MineRender loads is a PNG in practice; GIF and JPEG are handled as a courtesy and
1622
- * anything else falls through to an empty result (callers treat that as 0x0).
1746
+ * anything else falls through to an empty result, which ImageLoader rejects.
1623
1747
  */
1624
1748
  declare function probeImageSize(data: Uint8Array): ImageSizeInfo;
1625
1749
 
1626
- export { AXES, type AnimationFrame, type AnimationMeta, type AnimatorFunction, ArchiveAssetSource, type ArchiveEntry, type ArchiveProxy, AssetKey, AssetLoader, AssetParser, AssetSource, type AssetType, Assets, Axis, BUILTIN_ENTITY, BUILTIN_GENERATED, BasicAssetKey, type BasicMinecraftAsset, BatchedExecutor, type BedrockBone, type BedrockCube, type BedrockEntityDescription, type BedrockEntityFile, type BedrockGeometry, type BedrockGeometryFile, type Block, BlockEntityModels, type BlockInfo, type BlockModel, type BlockModelTextures, BlockObject, type BlockObjectOptions, type BlockState, type BlockStateMultipart, type BlockStateProperties, type BlockStateProperty, type BlockStatePropertyDefaults, type BlockStatePropertyValue, type BlockStateVariant, type BlockStateVariants, BlockStates, type BoxGeometryKey, BrowserArchiveProxy, BrowserCache, BrowserEnv, CUBE_FACES, type CacheKey, Caching, type CameraOptions, CanvasImage, Chunk, type CompatCanvas, type CompatImage, type ComposerOptions, type ControlsOptions, type Cube, CubeFace, CubeFaceIndex, DEFAULT_ELEMENTS, DEFAULT_NAMESPACE, DEFAULT_ROOT, DEFAULT_UV, DISPLAY_POSITIONS, type DebugOptions, type DeepPartial, DefaultBlockStates, DisplayPosition, type Disposable, type DoubleArray, type ElementFace, type ElementRotation, Entities, type EntityModel, EntityModels, EntityObject, type EntityObjectOptions, Env, type EnvProvider, type ExtractableImageData, type FromTo, Geometries, GuiLight, GuiObject, type GuiObjectOptions, HostedAssetSource, type IModelTextures, ITEM_GENERATED, type ImageInfo, ImageLoader, type ImageSizeInfo, InstanceManager, InstanceReference, type Instanceable, type ItemModel, type ItemModelTextures, type ListAsset, MapControls, type MaterialKey, Materials, type Maybe, type MeshKey, Meshes, MineRenderError, MineRenderScene, type MineRenderSceneOptions, MineRenderWorld, type MinecraftAsset, MinecraftCubeTexture, MinecraftFaceUV, type MinecraftTextureMeta, type Model, type ModelDisplay, type ModelElement, type ModelFaces, ModelGenerator, ModelMerger, ModelObject, type ModelObjectOptions, type ModelPart, ModelTextures, Models, type MultiBlockBlock, type MultiBlockStructure, type MultipartCondition, type NBTAsset, NBTHelper, OrbitControls, PersistentCache, type QuadArray, type RawImageKey, type RenderOptions, Renderer, type RendererOptions, Requests, type ResponseParser, SKIN_PARTS, SceneInspector, SceneObject, type SceneObjectOptions, SceneStats, SceneStatsDisplay, SchematicParser, type Serializable, type SkinGeometries, SkinObject, type SkinObjectOptions, SkinPart, type SkinTextureCoordinates, Skins, type StructureNBT, StructureParser, type TextureAsset, TextureAtlas, type TextureKey, TextureLoader, Textures, Ticker, type TickerFunction, TintColors, type Transformable, type TripleArray, UVMapper, WrappedImage, addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation, applyGenericRotation, applyModelPartRotation, axisToVec3, base64decode, base64encode, captureException, changeEvent, clampRotationDegrees, classicSkinGeometries, classicSkinTextureCoordinates, computeMorphedAttributes, createCanvas, createImage, estimateBytesUsed, interleaveAttributes, isAssetKey, isBasicAssetKey, isBlockObject, isDisposable, isDoubleArray, isEntityObject, isInstanceManager, isInstanceReference, isInstanceable, isInstancedMesh, isMesh, isMineRenderScene, isModelObject, isObject3D, isOrthographicCamera, isPerspectiveCamera, isQuadArray, isSceneObject, isTransformable, isTripleArray, isVector3, md5, mergeBufferAttributes, mergeBufferGeometries, mergeVertices, prefix, probeImageSize, registerBrowserEnv, serializeBoxGeometryKey, serializeImageKey, serializeMaterialKey, serializeMeshKey, serializeTextureKey, sha1, sha256, sha512, shutdown, sleep, slimSkinGeometries, slimSkinTextureCoordinates, timingEnd, timingStart, toDegrees, toRadians, toTrianglesDrawMode };
1750
+ export { AXES, type AnimationFrame, type AnimationMeta, type AnimatorFunction, ArchiveAssetSource, type ArchiveEntry, type ArchiveProxy, AssetKey, AssetLoadError, AssetLoader, AssetParser, AssetSource, type AssetType, Assets, Axis, BUILTIN_ENTITY, BUILTIN_GENERATED, BasicAssetKey, type BasicMinecraftAsset, BatchedExecutor, type BedrockBone, type BedrockCube, type BedrockEntityDescription, type BedrockEntityFile, type BedrockGeometry, type BedrockGeometryFile, type Block, type BlockInfo, type BlockModel, type BlockModelTextures, BlockObject, type BlockObjectOptions, type BlockState, type BlockStateMultipart, type BlockStateProperties, type BlockStateProperty, type BlockStatePropertyDefaults, type BlockStatePropertyValue, type BlockStateVariant, type BlockStateVariants, BlockStates, BlockTints, type BoxGeometryKey, BrowserArchiveProxy, BrowserCache, BrowserEnv, CUBE_FACES, type CacheKey, Caching, type CameraOptions, CanvasImage, type CapeLayout, Chunk, type CompatCanvas, type CompatImage, type ComposerOptions, type ControlsOptions, CubeFace, CubeFaceIndex, DEFAULT_ELEMENTS, DEFAULT_NAMESPACE, DEFAULT_ROOT, DEFAULT_UV, DISPLAY_POSITIONS, type DebugOptions, type DeepPartial, DefaultBlockStates, DisplayPosition, DisplayTransforms, type Disposable, type DoubleArray, type ElementFace, type ElementRotation, Entities, type EntityModel, type EntityModelCube, type EntityModelFile, type EntityModelLayer, type EntityModelOptions, type EntityModelPart, EntityObject, type EntityObjectOptions, Env, type EnvProvider, type ExtractableImageData, type FromTo, Geometries, GuiLight, GuiObject, type GuiObjectOptions, HostedAssetSource, type IModelTextures, ITEM_GENERATED, type ImageInfo, ImageLoader, type ImageSizeInfo, InstanceManager, InstanceReference, type Instanceable, type ItemModel, type ItemModelTextures, type ListAsset, MapControls, type MaterialKey, Materials, type Maybe, type MeshKey, Meshes, MineRenderError, MineRenderScene, type MineRenderSceneOptions, MineRenderWorld, type MinecraftAsset, MinecraftCubeTexture, MinecraftFaceUV, type MinecraftTextureMeta, type Model, type ModelDisplay, type ModelElement, type ModelFaces, ModelGenerator, ModelMerger, ModelObject, type ModelObjectOptions, ModelTextures, Models, type MultiBlockBlock, type MultiBlockStructure, type MultipartCondition, type NBTAsset, NBTHelper, OrbitControls, PersistentCache, type QuadArray, type RawImageKey, type RenderOptions, Renderer, type RendererOptions, type RequestConfig, RequestError, type RequestResponse, Requests, type ResponseParser, SKIN_PARTS, SceneInspector, SceneObject, type SceneObjectOptions, SceneStats, SceneStatsDisplay, SchematicParser, type Serializable, type SkinGeometries, SkinImage, SkinObject, type SkinObjectOptions, SkinPart, type SkinTexture, type SkinTextureCoordinates, SkinTextures, Skins, type StructureNBT, StructureParser, type TextureAsset, TextureAtlas, type TextureKey, TextureLoader, Textures, Ticker, type TickerFunction, TintColors, type Transformable, type TripleArray, UVMapper, WrappedImage, addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation, applyGenericRotation, axisToVec3, base64decode, base64encode, capeTextureSizes, captureException, changeEvent, clampRotationDegrees, classicSkinGeometries, classicSkinTextureCoordinates, computeMorphedAttributes, createCanvas, createImage, estimateBytesUsed, interleaveAttributes, isAssetKey, isBasicAssetKey, isBlockObject, isDisposable, isDoubleArray, isEntityObject, isInstanceManager, isInstanceReference, isInstanceable, isInstancedMesh, isMesh, isMineRenderScene, isModelObject, isObject3D, isOrthographicCamera, isPerspectiveCamera, isQuadArray, isSceneObject, isTransformable, isTripleArray, isVector3, md5, mergeBufferAttributes, mergeBufferGeometries, mergeVertices, prefix, probeImageSize, registerBrowserEnv, serializeBoxGeometryKey, serializeImageKey, serializeMaterialKey, serializeMeshKey, serializeTextureKey, sha1, sha256, sha512, shutdown, sleep, slimSkinGeometries, slimSkinTextureCoordinates, timingEnd, timingStart, toDegrees, toRadians, toTrianglesDrawMode };