@bis-toolkit/p3d 1.0.0

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.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * MLOD (Bohemia Interactive model format) reader library
3
+ */
4
+ export { Mlod } from './Mlod';
5
+ export { MlodLod } from './MlodLod';
6
+ export { Face } from './Face';
7
+ export { Vertex } from './Vertex';
8
+ export { Point } from './Point';
9
+ export { Vector3 } from './Vector3';
10
+ export { FaceFlags } from './FaceFlags';
11
+ export { PointFlags } from './PointFlags';
12
+ export { TaggReader } from './TaggReader';
13
+ export { type Tagg, type AnimationTagg, type LockTagg, type MassTagg, type PropertyTagg, type SelectedTagg, type SharpEdgesTagg, type UVSetTagg, type NamedSelectionTagg, type EndOfFileTagg } from './Tagg';
14
+ export { getLodName } from '../shared/Resolution';
15
+ export { BinaryReader } from '@bis-toolkit/utils';
@@ -0,0 +1,48 @@
1
+ import { Vector3 } from './math';
2
+ import { OdolReader } from './OdolReader';
3
+ export declare enum AnimType {
4
+ Rotation = 0,
5
+ RotationX = 1,
6
+ RotationY = 2,
7
+ RotationZ = 3,
8
+ Translation = 4,
9
+ TranslationX = 5,
10
+ TranslationY = 6,
11
+ TranslationZ = 7,
12
+ Direct = 8,
13
+ Hide = 9
14
+ }
15
+ export declare class Animation {
16
+ kind: AnimType;
17
+ animName: string;
18
+ source: string;
19
+ minValue: number;
20
+ maxValue: number;
21
+ minPhase: number;
22
+ maxPhase: number;
23
+ sourceAddress: number;
24
+ protected read(reader: OdolReader, kind: AnimType): void;
25
+ }
26
+ export declare class AnimationRotation extends Animation {
27
+ angle0: number;
28
+ angle1: number;
29
+ static fromReader(reader: OdolReader, kind: AnimType): AnimationRotation;
30
+ }
31
+ export declare class AnimationTranslation extends Animation {
32
+ offset0: number;
33
+ offset1: number;
34
+ static fromReader(reader: OdolReader, kind: AnimType): AnimationTranslation;
35
+ }
36
+ export declare class AnimationDirect extends Animation {
37
+ axisPos: Vector3;
38
+ axisDir: Vector3;
39
+ angle: number;
40
+ axisOffset: number;
41
+ static fromReader(reader: OdolReader, kind: AnimType): AnimationDirect;
42
+ }
43
+ export declare class AnimationHide extends Animation {
44
+ hideValue: number;
45
+ static fromReader(reader: OdolReader, kind: AnimType): AnimationHide;
46
+ }
47
+ export declare function isAnimationDirect(anim: Animation): anim is AnimationDirect;
48
+ export declare function isAnimationHide(anim: Animation): anim is AnimationHide;
@@ -0,0 +1,12 @@
1
+ import { Animation } from './Animation';
2
+ import { Vector3 } from './math';
3
+ import { OdolReader } from './OdolReader';
4
+ export declare class Animations {
5
+ animations: Animation[];
6
+ bonesToAnims: number[][][];
7
+ animsToBones: {
8
+ boneIdx: number;
9
+ axisData?: [Vector3, Vector3];
10
+ }[][];
11
+ static fromReader(reader: OdolReader): Animations;
12
+ }
@@ -0,0 +1,51 @@
1
+ import { Matrix4 } from './math';
2
+ import { OdolReader } from './OdolReader';
3
+ /**
4
+ * Color with RGBA float components
5
+ */
6
+ export declare class Color {
7
+ r: number;
8
+ g: number;
9
+ b: number;
10
+ a: number;
11
+ static fromReader(reader: OdolReader): Color;
12
+ }
13
+ export declare class StageTexture {
14
+ textureFilter: number;
15
+ texture: string;
16
+ stageId: number;
17
+ useWorldEnvMap: boolean;
18
+ static fromReader(reader: OdolReader): StageTexture;
19
+ }
20
+ export declare class StageTransform {
21
+ uvSource: number;
22
+ transformation: Matrix4;
23
+ static fromReader(reader: OdolReader): StageTransform;
24
+ }
25
+ export declare class EmbeddedMaterial {
26
+ materialName: string;
27
+ version: number;
28
+ emissive: Color;
29
+ ambient: Color;
30
+ diffuse: Color;
31
+ forcedDiffuse: Color;
32
+ specular: Color;
33
+ emissive2: Color;
34
+ specular2: Color;
35
+ unkCol1: Color;
36
+ unkCol2: Color;
37
+ specularPower: number;
38
+ pixelShaderId: number;
39
+ vertexShaderId: number;
40
+ mainLight: number;
41
+ fogMode: number;
42
+ surfaceFile: string;
43
+ nRenderFlags: number;
44
+ renderFlags: number;
45
+ stageTextures: StageTexture[];
46
+ stageTransforms: StageTransform[];
47
+ stageTI: StageTexture | null;
48
+ unk2: number;
49
+ unk3: number;
50
+ static fromReader(reader: OdolReader): EmbeddedMaterial;
51
+ }
@@ -0,0 +1,71 @@
1
+ import { OdolReader } from './OdolReader';
2
+ import { Vector3, Matrix3 } from './math';
3
+ import { PackedColor } from './PackedColor';
4
+ import { ClipFlags, ShadowBufferSource, MapType } from './enums';
5
+ import { Skeleton } from './auxiliaryStructures';
6
+ /**
7
+ * Model information (metadata and properties)
8
+ */
9
+ export declare class ModelInfo {
10
+ special: number;
11
+ boundingSphere: number;
12
+ geometrySphere: number;
13
+ remarks: number;
14
+ andHints: ClipFlags;
15
+ orHints: ClipFlags;
16
+ aimingCenter: Vector3;
17
+ color: PackedColor;
18
+ colorType: PackedColor;
19
+ viewDensity: number;
20
+ bboxMin: Vector3;
21
+ bboxMax: Vector3;
22
+ bboxMinVisual: Vector3;
23
+ bboxMaxVisual: Vector3;
24
+ boundingCenter: Vector3;
25
+ geometryCenter: Vector3;
26
+ centerOfMass: Vector3;
27
+ invInertia: Matrix3;
28
+ autoCenter: boolean;
29
+ lockAutoCenter: boolean;
30
+ canOcclude: boolean;
31
+ canBeOccluded: boolean;
32
+ unknownBool: boolean;
33
+ unknownFloat: number;
34
+ forceNotAlphaModel: boolean;
35
+ sbSource: ShadowBufferSource;
36
+ preferShadowVolume: boolean;
37
+ shadowOffset: number;
38
+ animated: boolean;
39
+ skeleton: Skeleton;
40
+ mapType: MapType;
41
+ massArray: number[];
42
+ mass: number;
43
+ invMass: number;
44
+ armor: number;
45
+ invArmor: number;
46
+ htMin: number;
47
+ htMax: number;
48
+ afMax: number;
49
+ mfMax: number;
50
+ mFact: number;
51
+ tBody: number;
52
+ minShadow: number;
53
+ canBlend: boolean;
54
+ propertyClass: string;
55
+ propertyDamage: string;
56
+ propertyFrequent: boolean;
57
+ memoryIndex: number;
58
+ geometryIndex: number;
59
+ unkLodType1Index: number;
60
+ geometryFireIndex: number;
61
+ geometryViewIndex: number;
62
+ geometryViewPilotIndex: number;
63
+ geometryViewGunnerIndex: number;
64
+ unkLodType2Index: number;
65
+ geometryViewCargoIndex: number;
66
+ landContactIndex: number;
67
+ roadwayIndex: number;
68
+ pathsIndex: number;
69
+ hitpointsIndex: number;
70
+ static fromReader(reader: OdolReader): ModelInfo;
71
+ }
@@ -0,0 +1,47 @@
1
+ import { OdolReader } from './OdolReader';
2
+ import { OdolLod } from './OdolLod';
3
+ import { ModelInfo } from './ModelInfo';
4
+ import { Animations } from './Animations';
5
+ import { Skeleton } from './auxiliaryStructures';
6
+ import { P3D, P3dStats } from '../shared/P3d';
7
+ /**
8
+ * Main ODOL file reader
9
+ * ODOL is the compiled/binary format for Bohemia Interactive 3D models
10
+ */
11
+ export declare class Odol implements P3D {
12
+ version: number;
13
+ modelInfo: ModelInfo | null;
14
+ lods: OdolLod[];
15
+ animations: Animations | null;
16
+ static readonly MIN_SUPPORTED_VERSION = 53;
17
+ static readonly MAX_SUPPORTED_VERSION = 54;
18
+ /**
19
+ * Read ODOL from a buffer
20
+ */
21
+ static fromBuffer(buffer: Buffer | Uint8Array): Odol;
22
+ /**
23
+ * Read ODOL from an OdolReader
24
+ */
25
+ static fromReader(reader: OdolReader): Odol;
26
+ /**
27
+ * Get skeleton from model info
28
+ */
29
+ get skeleton(): Skeleton | null;
30
+ /**
31
+ * Get mass from model info
32
+ */
33
+ get mass(): number;
34
+ /**
35
+ * Check if model has animations
36
+ */
37
+ get hasAnims(): boolean;
38
+ /**
39
+ * Get all unique textures across all LODs
40
+ */
41
+ get allTextures(): string[];
42
+ get allMaterials(): string[];
43
+ /**
44
+ * Get statistics about the model
45
+ */
46
+ getStats(): Partial<P3dStats>;
47
+ }
@@ -0,0 +1,75 @@
1
+ import { OdolReader } from './OdolReader';
2
+ import { Vector3 } from './math';
3
+ import { ClipFlags, SpecialFlags } from './enums';
4
+ import { ProxyObject, SubSkeletonIndexSet, Keyframe, LodMetadata } from './auxiliaryStructures';
5
+ import { EmbeddedMaterial } from './Materials';
6
+ import { Polygons, Section, NamedSelection, Face } from './structures';
7
+ import { VertexData } from './VertexData';
8
+ import { ILod } from '../shared/Lod';
9
+ /**
10
+ * ODOL LOD (Level of Detail)
11
+ */
12
+ export declare class OdolLod implements ILod {
13
+ resolution: number;
14
+ proxyObjects: ProxyObject[];
15
+ subSkeletonsToSkeleton: number[];
16
+ skeletonToSubSkeleton: SubSkeletonIndexSet[];
17
+ vertexCount: number;
18
+ faceArea: number;
19
+ orHints: ClipFlags;
20
+ andHints: ClipFlags;
21
+ bMin: Vector3;
22
+ bMax: Vector3;
23
+ bCenter: Vector3;
24
+ bRadius: number;
25
+ textures: string[];
26
+ materials: EmbeddedMaterial[];
27
+ pointToVertex: number[];
28
+ vertexToPoint: number[];
29
+ polygons: Polygons;
30
+ sections: Section[];
31
+ namedSelections: NamedSelection[];
32
+ namedProperties: [string, string][];
33
+ frames: Keyframe[];
34
+ iconColor: number;
35
+ selectedColor: number;
36
+ special: SpecialFlags;
37
+ vertexData: VertexData;
38
+ lodMetadata: LodMetadata | null;
39
+ static fromReader(reader: OdolReader): OdolLod;
40
+ /**
41
+ * Get resolution name
42
+ */
43
+ get resolutionName(): string;
44
+ /**
45
+ * Get all unique texture paths
46
+ */
47
+ get allTextures(): string[];
48
+ /**
49
+ * Get all material names
50
+ */
51
+ get materialNames(): string[];
52
+ /**
53
+ * Get vertices
54
+ */
55
+ get vertices(): Vector3[];
56
+ get verticesCount(): number;
57
+ get facesCount(): number;
58
+ /**
59
+ * Get face count
60
+ */
61
+ get faces(): Face[];
62
+ /**
63
+ * Get statistics about this LOD
64
+ */
65
+ getStats(): {
66
+ resolution: number;
67
+ vertexCount: number;
68
+ faceCount: number;
69
+ textureCount: number;
70
+ materialCount: number;
71
+ sectionCount: number;
72
+ namedSelectionCount: number;
73
+ proxyCount: number;
74
+ };
75
+ }
@@ -0,0 +1,30 @@
1
+ import { BinaryReader } from '@bis-toolkit/utils';
2
+ import { Vector3 } from './math';
3
+ /**
4
+ * Extended BinaryReader with ODOL-specific functionality
5
+ * Handles compression and compressed arrays
6
+ */
7
+ export declare class OdolReader extends BinaryReader {
8
+ version: number;
9
+ /**
10
+ * Read an array of elements
11
+ */
12
+ readArray<T>(readElement: (reader: OdolReader) => T, size?: number): T[];
13
+ /**
14
+ * Read a compressed array of elements
15
+ */
16
+ readCompressedArray<T>(readElement: (reader: OdolReader) => T, elemSize: number): T[];
17
+ /**
18
+ * Read a compressed fill array (optimized for arrays with many repeated values)
19
+ */
20
+ readCompressedFillArray<T>(readElement: (reader: OdolReader) => T, sizeOfT: number): T[];
21
+ /**
22
+ * Read compressed data
23
+ */
24
+ readCompressed(expectedSize: number): Uint8Array;
25
+ /**
26
+ * Read compressed vertex index array
27
+ */
28
+ readCompressedVertexIndexArray(): number[];
29
+ readCompressedVector3(): Vector3;
30
+ }
@@ -0,0 +1,14 @@
1
+ import { BinaryReader } from '@bis-toolkit/utils';
2
+ /**
3
+ * Packed color (RGBA as a single 32-bit integer)
4
+ */
5
+ export declare class PackedColor {
6
+ value: number;
7
+ constructor(value?: number);
8
+ static fromReader(reader: BinaryReader): PackedColor;
9
+ get r(): number;
10
+ get g(): number;
11
+ get b(): number;
12
+ get a(): number;
13
+ toArray(): [number, number, number, number];
14
+ }
@@ -0,0 +1,52 @@
1
+ import { OdolReader } from './OdolReader';
2
+ import { Vector3 } from './math';
3
+ import { ClipFlags } from './enums';
4
+ import { UVSet } from './structures';
5
+ /**
6
+ * Animation RT pair
7
+ */
8
+ export declare class AnimationRTPair {
9
+ selectionIndex: number;
10
+ weight: number;
11
+ constructor(selectionIndex: number, weight: number);
12
+ }
13
+ /**
14
+ * Animation RT weight
15
+ */
16
+ export declare class AnimationRTWeight {
17
+ private nSmall;
18
+ private smallSpace;
19
+ static fromReader(reader: OdolReader): AnimationRTWeight;
20
+ getAnimationRTPairs(): AnimationRTPair[];
21
+ }
22
+ /**
23
+ * Vertex neighbor info
24
+ */
25
+ export declare class VertexNeighborInfo {
26
+ posA: number;
27
+ private unk1;
28
+ weightA: AnimationRTWeight | null;
29
+ posB: number;
30
+ private unk2;
31
+ weightB: AnimationRTWeight | null;
32
+ static fromReader(reader: OdolReader): VertexNeighborInfo;
33
+ }
34
+ /**
35
+ * ST coordinate pair (tangent/bitangent)
36
+ */
37
+ export declare class STPair {
38
+ s: Vector3;
39
+ t: Vector3;
40
+ static fromReader(reader: OdolReader): STPair;
41
+ }
42
+ export declare class VertexData {
43
+ vertexBoneRefIsSimple: boolean;
44
+ clipFlags: ClipFlags[];
45
+ uvSets: UVSet[];
46
+ vertices: Vector3[];
47
+ normals: Vector3[];
48
+ stCoords: STPair[];
49
+ vertexBoneRef: AnimationRTWeight[];
50
+ neighborBoneRef: VertexNeighborInfo[];
51
+ static fromReader(reader: OdolReader): VertexData;
52
+ }
@@ -0,0 +1,49 @@
1
+ import { OdolReader } from './OdolReader';
2
+ import { PackedColor } from './PackedColor';
3
+ import { ClipFlags, SpecialFlags } from './enums';
4
+ import { Vector3, Matrix4 } from './math';
5
+ /**
6
+ * Skeleton bone structure
7
+ */
8
+ export declare class Skeleton {
9
+ name: string;
10
+ isDiscrete: boolean;
11
+ bones: string[];
12
+ pivotsName: string;
13
+ static fromReader(reader: OdolReader): Skeleton;
14
+ getBonePairs(): [string, string][];
15
+ }
16
+ /**
17
+ * Proxy object (reference to another model)
18
+ */
19
+ export declare class ProxyObject {
20
+ proxyModel: string;
21
+ transformation: Matrix4;
22
+ sequenceId: number;
23
+ namedSelectionIndex: number;
24
+ boneIndex: number;
25
+ sectionIndex: number;
26
+ static fromReader(reader: OdolReader): ProxyObject;
27
+ }
28
+ /**
29
+ * Keyframe for animations
30
+ */
31
+ export declare class Keyframe {
32
+ time: number;
33
+ points: Vector3[];
34
+ static fromReader(reader: OdolReader): Keyframe;
35
+ }
36
+ export declare class SubSkeletonIndexSet {
37
+ subSkeletons: number[];
38
+ static fromReader(reader: OdolReader): SubSkeletonIndexSet;
39
+ }
40
+ export declare class LodMetadata {
41
+ facesCount: number;
42
+ color: PackedColor;
43
+ special: SpecialFlags;
44
+ orHints: ClipFlags;
45
+ hasSkeleton: boolean;
46
+ verticesCount: number;
47
+ faceArea: number;
48
+ static fromReader(reader: OdolReader): LodMetadata;
49
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Clipping flags enum
3
+ */
4
+ export declare enum ClipFlags {
5
+ DecalNone = 0,
6
+ FogNormal = 0,
7
+ LandNone = 0,
8
+ LightNormal = 0,
9
+ None = 0,
10
+ Front = 1,
11
+ Back = 2,
12
+ Left = 4,
13
+ Right = 8,
14
+ Bottom = 16,
15
+ Top = 32,
16
+ All = 63,
17
+ User0 = 64,
18
+ MaxUserValue = 255,
19
+ LandOn = 256,
20
+ LandAbove = 512,
21
+ LandUnder = 1024,
22
+ LandKeep = 2048,
23
+ LandMask = 3328,
24
+ DecalNormal = 4096,
25
+ DecalVertical = 8192,
26
+ DecalMask = 12288,
27
+ FogDisable = 16384,
28
+ FogSky = 32768,
29
+ FogMask = 49152,
30
+ UserStep = 1048576,
31
+ UserMask = 267386880,
32
+ Hints = 268435456,
33
+ Shining = 209715200,
34
+ AlwaysInShadow = 210763776,
35
+ HalfLight = 211812352,
36
+ FullLight = 212860928
37
+ }
38
+ export declare enum SpecialFlags {
39
+ None = 0,
40
+ Unk_2 = 2,
41
+ Unk_16 = 16,
42
+ NoShadows = 32,
43
+ Unk_256 = 256,
44
+ Unk_512 = 512,
45
+ Unk_4096 = 4096,
46
+ SectionSpecial = 8192,
47
+ Unk_16384 = 16384,
48
+ Unk_32768 = 32768,
49
+ Unk_131072 = 131072,
50
+ HiddenVertex = 4202496,
51
+ ZBiasLow = 67108864,
52
+ ZBiasMiddle = 134217728,
53
+ ZBiasHigh = 201326592
54
+ }
55
+ export declare enum ShadowBufferSource {
56
+ Visual = 0,
57
+ ShadowVolume = 1,
58
+ Explicit = 2,
59
+ None = 3,
60
+ VisualEx = 4
61
+ }
62
+ export declare enum MapType {
63
+ Tree = 0,
64
+ SmallTree = 1,
65
+ Bush = 2,
66
+ Building = 3,
67
+ House = 4,
68
+ ForestBorder = 5,
69
+ ForestTriangle = 6,
70
+ ForestSquare = 7,
71
+ Church = 8,
72
+ Chapel = 9,
73
+ Cross = 10,
74
+ Rock = 11,
75
+ Bunker = 12,
76
+ Fortress = 13,
77
+ Fountain = 14,
78
+ ViewTower = 15,
79
+ Lighthouse = 16,
80
+ Quay = 17,
81
+ Fuelstation = 18,
82
+ Hospital = 19,
83
+ Fence = 20,
84
+ Wall = 21,
85
+ Hide = 22,
86
+ BusStop = 23,
87
+ Road = 24,
88
+ Forest = 25,
89
+ Transmitter = 26,
90
+ Stack = 27,
91
+ Ruin = 28,
92
+ Tourism = 29,
93
+ Watertower = 30,
94
+ Track = 31,
95
+ MainRoad = 32,
96
+ Rocks = 33,
97
+ PowerLines = 34,
98
+ RailWay = 35
99
+ }
100
+ export declare enum AnimationType {
101
+ None = 0,
102
+ Software = 1,
103
+ Hardware = 2
104
+ }
@@ -0,0 +1,14 @@
1
+ export { Animation } from './Animation';
2
+ export { Animations } from './Animations';
3
+ export { Odol } from './Odol';
4
+ export { OdolLod } from './OdolLod';
5
+ export { ModelInfo } from './ModelInfo';
6
+ export { OdolReader } from './OdolReader';
7
+ export { getLodName } from '../shared/Resolution';
8
+ export { Vector3, Matrix3, Matrix4 } from './math';
9
+ export { PackedColor } from './PackedColor';
10
+ export { ClipFlags, SpecialFlags, ShadowBufferSource, MapType, AnimationType } from './enums';
11
+ export { Face, Polygons, Section, NamedSelection, UVSet } from './structures';
12
+ export { AnimationRTPair, AnimationRTWeight, VertexNeighborInfo, STPair, VertexData } from './VertexData';
13
+ export { Skeleton, ProxyObject, Keyframe, SubSkeletonIndexSet, LodMetadata } from './auxiliaryStructures';
14
+ export { Color, EmbeddedMaterial, StageTexture, StageTransform } from './Materials';
@@ -0,0 +1,46 @@
1
+ import { BinaryReader } from '@bis-toolkit/utils';
2
+ export declare class Vector3 {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ constructor(x?: number, y?: number, z?: number);
7
+ get length(): number;
8
+ static fromReader(reader: BinaryReader): Vector3;
9
+ static readCompressed(reader: BinaryReader): Vector3;
10
+ static fromInt32(compressed: number): Vector3;
11
+ distance(v: Vector3): number;
12
+ normalize(): Vector3;
13
+ toArray(): [number, number, number];
14
+ }
15
+ export declare class Matrix3 {
16
+ m00: number;
17
+ m01: number;
18
+ m02: number;
19
+ m10: number;
20
+ m11: number;
21
+ m12: number;
22
+ m20: number;
23
+ m21: number;
24
+ m22: number;
25
+ constructor(m00?: number, m01?: number, m02?: number, m10?: number, m11?: number, m12?: number, m20?: number, m21?: number, m22?: number);
26
+ static fromReader(reader: BinaryReader): Matrix3;
27
+ }
28
+ /**
29
+ * Matrix4 (stored as 3x3 orientation + 3D position)
30
+ */
31
+ export declare class Matrix4 {
32
+ m00: number;
33
+ m01: number;
34
+ m02: number;
35
+ m10: number;
36
+ m11: number;
37
+ m12: number;
38
+ m20: number;
39
+ m21: number;
40
+ m22: number;
41
+ px: number;
42
+ py: number;
43
+ pz: number;
44
+ constructor(m00?: number, m01?: number, m02?: number, m10?: number, m11?: number, m12?: number, m20?: number, m21?: number, m22?: number, px?: number, py?: number, pz?: number);
45
+ static fromReader(reader: BinaryReader): Matrix4;
46
+ }