@babylonjs/loaders 9.28.0 → 9.29.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.
- package/BVH/bvhLoader.js +1 -3
- package/BVH/bvhLoader.js.map +1 -1
- package/OBJ/mtlFileLoader.js +9 -35
- package/OBJ/mtlFileLoader.js.map +1 -1
- package/OBJ/objFileLoader.pure.js +18 -23
- package/OBJ/objFileLoader.pure.js.map +1 -1
- package/OBJ/solidParser.js +11 -25
- package/OBJ/solidParser.js.map +1 -1
- package/SPLAT/splatFileLoader.pure.js +86 -82
- package/SPLAT/splatFileLoader.pure.js.map +1 -1
- package/STL/stlFileLoader.pure.d.ts +1 -0
- package/STL/stlFileLoader.pure.js +18 -16
- package/STL/stlFileLoader.pure.js.map +1 -1
- package/glTF/1.0/glTFLoader.pure.js +30 -37
- package/glTF/1.0/glTFLoader.pure.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js +16 -23
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js +1 -3
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.js +1 -3
- package/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.d.ts +7 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.js +17 -3
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.d.ts +13 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.js +16 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js +18 -25
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js +3 -10
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js +2 -5
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js.map +1 -1
- package/glTF/2.0/glTFLoader.pure.js +15 -37
- package/glTF/2.0/glTFLoader.pure.js.map +1 -1
- package/package.json +3 -3
package/BVH/bvhLoader.js
CHANGED
|
@@ -260,10 +260,8 @@ function ReadNode(lines, firstLine, parent, context) {
|
|
|
260
260
|
export function ReadBvh(text, scene, assetContainer, loadingOptions) {
|
|
261
261
|
const lines = text.split("\n");
|
|
262
262
|
const { loopMode } = loadingOptions;
|
|
263
|
-
|
|
264
|
-
const skeleton = new Skeleton("", "", scene);
|
|
263
|
+
const skeleton = scene._executeWithBlockedEntityCollection(!!assetContainer, () => new Skeleton("", "", scene));
|
|
265
264
|
skeleton._parentContainer = assetContainer;
|
|
266
|
-
scene._blockEntityCollection = false;
|
|
267
265
|
const context = new LoaderContext(skeleton);
|
|
268
266
|
context.loopMode = loopMode;
|
|
269
267
|
// read model structure
|
package/BVH/bvhLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bvhLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/BVH/bvhLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IAnimationKey } from \"core/Animations\";\nimport { Animation } from \"core/Animations/animation\";\nimport { Bone } from \"core/Bones/bone\";\nimport { Skeleton } from \"core/Bones/skeleton\";\nimport { Matrix, Quaternion, Vector3 } from \"core/Maths/math.vector\";\nimport { type Scene } from \"core/scene\";\nimport { type Nullable } from \"core/types\";\nimport { type BVHLoadingOptions } from \"./bvhLoadingOptions\";\nimport { Tools } from \"core/Misc/tools\";\nimport { type AssetContainer } from \"core/assetContainer\";\n\nconst _XPosition = \"Xposition\";\nconst _YPosition = \"Yposition\";\nconst _ZPosition = \"Zposition\";\nconst _XRotation = \"Xrotation\";\nconst _YRotation = \"Yrotation\";\nconst _ZRotation = \"Zrotation\";\n\nconst _HierarchyNode = \"HIERARCHY\";\nconst _MotionNode = \"MOTION\";\n\nclass LoaderContext {\n loopMode: number = Animation.ANIMATIONLOOPMODE_CYCLE;\n list: IBVHNode[] = [];\n root: IBVHNode = CreateBVHNode();\n numFrames: number = 0;\n frameRate: number = 0;\n skeleton: Skeleton;\n\n constructor(skeleton: Skeleton) {\n this.skeleton = skeleton;\n }\n}\n\ninterface IBVHNode {\n name: string;\n type: string;\n offset: Vector3;\n channels: string[];\n children: IBVHNode[];\n frames: IBVHKeyFrame[];\n parent: Nullable<IBVHNode>;\n}\n\ninterface IBVHKeyFrame {\n frame: number;\n position: Vector3;\n rotation: Quaternion;\n}\n\nfunction CreateBVHNode(): IBVHNode {\n return {\n name: \"\",\n type: \"\",\n offset: new Vector3(),\n channels: [],\n children: [],\n frames: [],\n parent: null,\n };\n}\n\nfunction CreateBVHKeyFrame(): IBVHKeyFrame {\n return {\n frame: 0,\n position: new Vector3(),\n rotation: new Quaternion(),\n };\n}\n\n/**\n * Converts the BVH node's offset to a Babylon matrix\n * @param node - The BVH node to convert\n * @returns The converted matrix\n */\nfunction BoneOffset(node: IBVHNode): Matrix {\n const x = node.offset.x;\n const y = node.offset.y;\n const z = node.offset.z;\n return Matrix.Translation(x, y, z);\n}\n\n/**\n * Creates animations for the BVH node\n * @param node - The BVH node to create animations for\n * @param context - The loader context\n * @returns The created animations\n */\nfunction CreateAnimations(node: IBVHNode, context: LoaderContext): Animation[] {\n if (node.frames.length === 0) {\n return [];\n }\n\n const animations: Animation[] = [];\n\n // Create position animation if there are position channels\n const hasPosition = node.channels.some((c) => c === _XPosition || c === _YPosition || c === _ZPosition);\n\n // Create rotation animation if there are rotation channels\n const hasRotation = node.channels.some((c) => c === _XRotation || c === _YRotation || c === _ZRotation);\n\n const posAnim = new Animation(`${node.name}_pos`, \"position\", context.frameRate, Animation.ANIMATIONTYPE_VECTOR3, context.loopMode);\n\n const rotAnim = new Animation(`${node.name}_rot`, \"rotationQuaternion\", context.frameRate, Animation.ANIMATIONTYPE_QUATERNION, context.loopMode);\n\n const posKeys: IAnimationKey[] = [];\n const rotKeys: IAnimationKey[] = [];\n\n for (let i = 0; i < node.frames.length; i++) {\n const frame = node.frames[i];\n\n if (hasPosition && frame.position) {\n posKeys.push({\n frame: frame.frame,\n value: frame.position.clone(),\n });\n }\n\n if (hasRotation) {\n rotKeys.push({\n frame: frame.frame,\n value: frame.rotation.clone(),\n });\n }\n }\n\n if (posKeys.length > 0) {\n posAnim.setKeys(posKeys);\n animations.push(posAnim);\n }\n\n if (rotKeys.length > 0) {\n rotAnim.setKeys(rotKeys);\n animations.push(rotAnim);\n }\n\n return animations;\n}\n\n/**\n * Converts a BVH node to a Babylon bone\n * @param node - The BVH node to convert\n * @param parent - The parent bone\n * @param context - The loader context\n */\nfunction ConvertNode(node: IBVHNode, parent: Nullable<Bone>, context: LoaderContext) {\n const matrix = BoneOffset(node);\n const bone = new Bone(node.name, context.skeleton, parent, matrix);\n\n // Create animation for this bone\n const animations = CreateAnimations(node, context);\n for (const animation of animations) {\n if (animation.getKeys() && animation.getKeys().length > 0) {\n bone.animations.push(animation);\n }\n }\n\n for (const child of node.children) {\n ConvertNode(child, bone, context);\n }\n}\n\n/**\n * Recursively reads data from a single frame into the bone hierarchy.\n * The bone hierarchy has to be structured in the same order as the BVH file.\n * keyframe data is stored in bone.frames.\n * @param data - splitted string array (frame values), values are shift()ed\n * @param frameNumber - playback time for this keyframe\n * @param bone - the bone to read frame data from\n * @param tokenIndex - the index of the token to read\n */\nfunction ReadFrameData(data: string[], frameNumber: number, bone: IBVHNode, tokenIndex: { i: number }) {\n if (bone.type === \"ENDSITE\") {\n // end sites have no motion data\n return;\n }\n\n // add keyframe\n const keyframe = CreateBVHKeyFrame();\n keyframe.frame = frameNumber;\n keyframe.position = new Vector3();\n keyframe.rotation = new Quaternion();\n\n bone.frames.push(keyframe);\n\n let combinedRotation = Matrix.Identity();\n\n // parse values for each channel in node\n for (let i = 0; i < bone.channels.length; ++i) {\n const channel = bone.channels[i];\n const value = data[tokenIndex.i++];\n if (!value) {\n continue;\n }\n const parsedValue = parseFloat(value.trim());\n if (channel.endsWith(\"position\")) {\n switch (channel) {\n case _XPosition:\n keyframe.position.x = parsedValue;\n break;\n case _YPosition:\n keyframe.position.y = parsedValue;\n break;\n case _ZPosition:\n keyframe.position.z = parsedValue;\n break;\n }\n } else if (channel.endsWith(\"rotation\")) {\n const angle = Tools.ToRadians(parsedValue);\n let rotationMatrix: Matrix;\n switch (channel) {\n case _XRotation:\n rotationMatrix = Matrix.RotationX(angle);\n break;\n case _YRotation:\n rotationMatrix = Matrix.RotationY(angle);\n break;\n case _ZRotation:\n rotationMatrix = Matrix.RotationZ(angle);\n break;\n }\n combinedRotation = rotationMatrix!.multiply(combinedRotation);\n }\n }\n\n Quaternion.FromRotationMatrixToRef(combinedRotation, keyframe.rotation);\n\n // parse child nodes\n for (const child of bone.children) {\n ReadFrameData(data, frameNumber, child, tokenIndex);\n }\n}\n\n/**\n * Recursively parses the HIERARCHY section of the BVH file\n * @param lines - all lines of the file. lines are consumed as we go along\n * @param firstLine - line containing the node type and name e.g. \"JOINT hip\"\n * @param parent - the parent node for hierarchy\n * @param context - the loader context containing the list of nodes and other data\n * @returns a BVH node including children\n */\nfunction ReadNode(lines: string[], firstLine: string, parent: Nullable<IBVHNode>, context: LoaderContext): IBVHNode {\n const node = CreateBVHNode();\n node.parent = parent;\n context.list.push(node);\n\n // parse node type and name.\n let tokens: string[] | undefined = firstLine.trim().split(/\\s+/);\n\n if (tokens[0].toUpperCase() === \"END\" && tokens[1].toUpperCase() === \"SITE\") {\n node.type = \"ENDSITE\";\n node.name = \"ENDSITE\"; // bvh end sites have no name\n } else {\n node.name = tokens[1];\n node.type = tokens[0].toUpperCase();\n }\n\n // opening bracket\n if (lines.shift()?.trim() != \"{\") {\n throw new Error(\"Expected opening { after type & name\");\n }\n\n // parse OFFSET\n const tokensSplit = lines.shift()?.trim().split(/\\s+/);\n if (!tokensSplit) {\n throw new Error(\"Unexpected end of file: missing OFFSET\");\n }\n tokens = tokensSplit;\n\n if (tokens[0].toUpperCase() != \"OFFSET\") {\n throw new Error(\"Expected OFFSET, but got: \" + tokens[0]);\n }\n if (tokens.length != 4) {\n throw new Error(\"OFFSET: Invalid number of values\");\n }\n\n const offset = new Vector3(parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3]));\n\n if (isNaN(offset.x) || isNaN(offset.y) || isNaN(offset.z)) {\n throw new Error(\"OFFSET: Invalid values\");\n }\n\n node.offset = offset;\n\n // parse CHANNELS definitions\n if (node.type != \"ENDSITE\") {\n tokens = lines.shift()?.trim().split(/\\s+/);\n if (!tokens) {\n throw new Error(\"Unexpected end of file: missing CHANNELS\");\n }\n\n if (tokens[0].toUpperCase() != \"CHANNELS\") {\n throw new Error(\"Expected CHANNELS definition\");\n }\n\n const numChannels = parseInt(tokens[1]);\n // Skip CHANNELS and the number of channels\n node.channels = tokens.splice(2, numChannels);\n node.children = [];\n }\n\n // read children\n while (lines.length > 0) {\n const line = lines.shift()?.trim();\n\n if (line === \"}\") {\n // Finish reading the node\n return node;\n } else if (line) {\n node.children.push(ReadNode(lines, line, node, context));\n }\n }\n\n throw new Error(\"Unexpected end of file: missing closing brace\");\n}\n\n/**\n * Reads a BVH file, returns a skeleton\n * @param text - The BVH file content\n * @param scene - The scene to add the skeleton to\n * @param assetContainer - The asset container to add the skeleton to\n * @param loadingOptions - The loading options\n * @returns The skeleton\n */\nexport function ReadBvh(text: string, scene: Scene, assetContainer: Nullable<AssetContainer>, loadingOptions: BVHLoadingOptions): Skeleton {\n const lines = text.split(\"\\n\");\n\n const { loopMode } = loadingOptions;\n\n scene._blockEntityCollection = !!assetContainer;\n const skeleton = new Skeleton(\"\", \"\", scene);\n skeleton._parentContainer = assetContainer;\n scene._blockEntityCollection = false;\n\n const context = new LoaderContext(skeleton);\n context.loopMode = loopMode;\n\n // read model structure\n const firstLine = lines.shift();\n if (!firstLine || firstLine.trim().toUpperCase() !== _HierarchyNode) {\n throw new Error(\"HIERARCHY expected\");\n }\n\n const nodeLine = lines.shift();\n if (!nodeLine) {\n throw new Error(\"Unexpected end of file after HIERARCHY\");\n }\n const root = ReadNode(lines, nodeLine.trim(), null, context);\n\n // read motion data\n const motionLine = lines.shift();\n if (!motionLine || motionLine.trim().toUpperCase() !== _MotionNode) {\n throw new Error(\"MOTION expected\");\n }\n\n const framesLine = lines.shift();\n if (!framesLine) {\n throw new Error(\"Unexpected end of file before frame count\");\n }\n const framesTokens = framesLine.trim().split(/[\\s]+/);\n if (framesTokens.length < 2) {\n throw new Error(\"Invalid frame count line\");\n }\n\n // number of frames\n const numFrames = parseInt(framesTokens[1]);\n if (isNaN(numFrames)) {\n throw new Error(\"Failed to read number of frames.\");\n }\n context.numFrames = numFrames;\n\n // frame time\n const frameTimeLine = lines.shift();\n if (!frameTimeLine) {\n throw new Error(\"Unexpected end of file before frame time\");\n }\n const frameTimeTokens = frameTimeLine.trim().split(/[\\s]+/);\n if (frameTimeTokens.length < 3) {\n throw new Error(\"Invalid frame time line\");\n }\n const frameTime = parseFloat(frameTimeTokens[2]);\n if (isNaN(frameTime)) {\n throw new Error(\"Failed to read frame time.\");\n }\n if (frameTime <= 0) {\n throw new Error(\"Failed to read frame time. Invalid value \" + frameTime);\n }\n\n context.frameRate = 1 / frameTime;\n\n // read frame data line by line\n for (let i = 0; i < numFrames; ++i) {\n const frameLine = lines.shift();\n if (!frameLine) {\n continue;\n }\n const tokens = frameLine.trim().split(/[\\s]+/) || [];\n ReadFrameData(tokens, i, root, { i: 0 });\n }\n\n context.root = root;\n\n ConvertNode(context.root, null, context);\n\n context.skeleton.returnToRest();\n return context.skeleton;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bvhLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/BVH/bvhLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IAnimationKey } from \"core/Animations\";\nimport { Animation } from \"core/Animations/animation\";\nimport { Bone } from \"core/Bones/bone\";\nimport { Skeleton } from \"core/Bones/skeleton\";\nimport { Matrix, Quaternion, Vector3 } from \"core/Maths/math.vector\";\nimport { type Scene } from \"core/scene\";\nimport { type Nullable } from \"core/types\";\nimport { type BVHLoadingOptions } from \"./bvhLoadingOptions\";\nimport { Tools } from \"core/Misc/tools\";\nimport { type AssetContainer } from \"core/assetContainer\";\n\nconst _XPosition = \"Xposition\";\nconst _YPosition = \"Yposition\";\nconst _ZPosition = \"Zposition\";\nconst _XRotation = \"Xrotation\";\nconst _YRotation = \"Yrotation\";\nconst _ZRotation = \"Zrotation\";\n\nconst _HierarchyNode = \"HIERARCHY\";\nconst _MotionNode = \"MOTION\";\n\nclass LoaderContext {\n loopMode: number = Animation.ANIMATIONLOOPMODE_CYCLE;\n list: IBVHNode[] = [];\n root: IBVHNode = CreateBVHNode();\n numFrames: number = 0;\n frameRate: number = 0;\n skeleton: Skeleton;\n\n constructor(skeleton: Skeleton) {\n this.skeleton = skeleton;\n }\n}\n\ninterface IBVHNode {\n name: string;\n type: string;\n offset: Vector3;\n channels: string[];\n children: IBVHNode[];\n frames: IBVHKeyFrame[];\n parent: Nullable<IBVHNode>;\n}\n\ninterface IBVHKeyFrame {\n frame: number;\n position: Vector3;\n rotation: Quaternion;\n}\n\nfunction CreateBVHNode(): IBVHNode {\n return {\n name: \"\",\n type: \"\",\n offset: new Vector3(),\n channels: [],\n children: [],\n frames: [],\n parent: null,\n };\n}\n\nfunction CreateBVHKeyFrame(): IBVHKeyFrame {\n return {\n frame: 0,\n position: new Vector3(),\n rotation: new Quaternion(),\n };\n}\n\n/**\n * Converts the BVH node's offset to a Babylon matrix\n * @param node - The BVH node to convert\n * @returns The converted matrix\n */\nfunction BoneOffset(node: IBVHNode): Matrix {\n const x = node.offset.x;\n const y = node.offset.y;\n const z = node.offset.z;\n return Matrix.Translation(x, y, z);\n}\n\n/**\n * Creates animations for the BVH node\n * @param node - The BVH node to create animations for\n * @param context - The loader context\n * @returns The created animations\n */\nfunction CreateAnimations(node: IBVHNode, context: LoaderContext): Animation[] {\n if (node.frames.length === 0) {\n return [];\n }\n\n const animations: Animation[] = [];\n\n // Create position animation if there are position channels\n const hasPosition = node.channels.some((c) => c === _XPosition || c === _YPosition || c === _ZPosition);\n\n // Create rotation animation if there are rotation channels\n const hasRotation = node.channels.some((c) => c === _XRotation || c === _YRotation || c === _ZRotation);\n\n const posAnim = new Animation(`${node.name}_pos`, \"position\", context.frameRate, Animation.ANIMATIONTYPE_VECTOR3, context.loopMode);\n\n const rotAnim = new Animation(`${node.name}_rot`, \"rotationQuaternion\", context.frameRate, Animation.ANIMATIONTYPE_QUATERNION, context.loopMode);\n\n const posKeys: IAnimationKey[] = [];\n const rotKeys: IAnimationKey[] = [];\n\n for (let i = 0; i < node.frames.length; i++) {\n const frame = node.frames[i];\n\n if (hasPosition && frame.position) {\n posKeys.push({\n frame: frame.frame,\n value: frame.position.clone(),\n });\n }\n\n if (hasRotation) {\n rotKeys.push({\n frame: frame.frame,\n value: frame.rotation.clone(),\n });\n }\n }\n\n if (posKeys.length > 0) {\n posAnim.setKeys(posKeys);\n animations.push(posAnim);\n }\n\n if (rotKeys.length > 0) {\n rotAnim.setKeys(rotKeys);\n animations.push(rotAnim);\n }\n\n return animations;\n}\n\n/**\n * Converts a BVH node to a Babylon bone\n * @param node - The BVH node to convert\n * @param parent - The parent bone\n * @param context - The loader context\n */\nfunction ConvertNode(node: IBVHNode, parent: Nullable<Bone>, context: LoaderContext) {\n const matrix = BoneOffset(node);\n const bone = new Bone(node.name, context.skeleton, parent, matrix);\n\n // Create animation for this bone\n const animations = CreateAnimations(node, context);\n for (const animation of animations) {\n if (animation.getKeys() && animation.getKeys().length > 0) {\n bone.animations.push(animation);\n }\n }\n\n for (const child of node.children) {\n ConvertNode(child, bone, context);\n }\n}\n\n/**\n * Recursively reads data from a single frame into the bone hierarchy.\n * The bone hierarchy has to be structured in the same order as the BVH file.\n * keyframe data is stored in bone.frames.\n * @param data - splitted string array (frame values), values are shift()ed\n * @param frameNumber - playback time for this keyframe\n * @param bone - the bone to read frame data from\n * @param tokenIndex - the index of the token to read\n */\nfunction ReadFrameData(data: string[], frameNumber: number, bone: IBVHNode, tokenIndex: { i: number }) {\n if (bone.type === \"ENDSITE\") {\n // end sites have no motion data\n return;\n }\n\n // add keyframe\n const keyframe = CreateBVHKeyFrame();\n keyframe.frame = frameNumber;\n keyframe.position = new Vector3();\n keyframe.rotation = new Quaternion();\n\n bone.frames.push(keyframe);\n\n let combinedRotation = Matrix.Identity();\n\n // parse values for each channel in node\n for (let i = 0; i < bone.channels.length; ++i) {\n const channel = bone.channels[i];\n const value = data[tokenIndex.i++];\n if (!value) {\n continue;\n }\n const parsedValue = parseFloat(value.trim());\n if (channel.endsWith(\"position\")) {\n switch (channel) {\n case _XPosition:\n keyframe.position.x = parsedValue;\n break;\n case _YPosition:\n keyframe.position.y = parsedValue;\n break;\n case _ZPosition:\n keyframe.position.z = parsedValue;\n break;\n }\n } else if (channel.endsWith(\"rotation\")) {\n const angle = Tools.ToRadians(parsedValue);\n let rotationMatrix: Matrix;\n switch (channel) {\n case _XRotation:\n rotationMatrix = Matrix.RotationX(angle);\n break;\n case _YRotation:\n rotationMatrix = Matrix.RotationY(angle);\n break;\n case _ZRotation:\n rotationMatrix = Matrix.RotationZ(angle);\n break;\n }\n combinedRotation = rotationMatrix!.multiply(combinedRotation);\n }\n }\n\n Quaternion.FromRotationMatrixToRef(combinedRotation, keyframe.rotation);\n\n // parse child nodes\n for (const child of bone.children) {\n ReadFrameData(data, frameNumber, child, tokenIndex);\n }\n}\n\n/**\n * Recursively parses the HIERARCHY section of the BVH file\n * @param lines - all lines of the file. lines are consumed as we go along\n * @param firstLine - line containing the node type and name e.g. \"JOINT hip\"\n * @param parent - the parent node for hierarchy\n * @param context - the loader context containing the list of nodes and other data\n * @returns a BVH node including children\n */\nfunction ReadNode(lines: string[], firstLine: string, parent: Nullable<IBVHNode>, context: LoaderContext): IBVHNode {\n const node = CreateBVHNode();\n node.parent = parent;\n context.list.push(node);\n\n // parse node type and name.\n let tokens: string[] | undefined = firstLine.trim().split(/\\s+/);\n\n if (tokens[0].toUpperCase() === \"END\" && tokens[1].toUpperCase() === \"SITE\") {\n node.type = \"ENDSITE\";\n node.name = \"ENDSITE\"; // bvh end sites have no name\n } else {\n node.name = tokens[1];\n node.type = tokens[0].toUpperCase();\n }\n\n // opening bracket\n if (lines.shift()?.trim() != \"{\") {\n throw new Error(\"Expected opening { after type & name\");\n }\n\n // parse OFFSET\n const tokensSplit = lines.shift()?.trim().split(/\\s+/);\n if (!tokensSplit) {\n throw new Error(\"Unexpected end of file: missing OFFSET\");\n }\n tokens = tokensSplit;\n\n if (tokens[0].toUpperCase() != \"OFFSET\") {\n throw new Error(\"Expected OFFSET, but got: \" + tokens[0]);\n }\n if (tokens.length != 4) {\n throw new Error(\"OFFSET: Invalid number of values\");\n }\n\n const offset = new Vector3(parseFloat(tokens[1]), parseFloat(tokens[2]), parseFloat(tokens[3]));\n\n if (isNaN(offset.x) || isNaN(offset.y) || isNaN(offset.z)) {\n throw new Error(\"OFFSET: Invalid values\");\n }\n\n node.offset = offset;\n\n // parse CHANNELS definitions\n if (node.type != \"ENDSITE\") {\n tokens = lines.shift()?.trim().split(/\\s+/);\n if (!tokens) {\n throw new Error(\"Unexpected end of file: missing CHANNELS\");\n }\n\n if (tokens[0].toUpperCase() != \"CHANNELS\") {\n throw new Error(\"Expected CHANNELS definition\");\n }\n\n const numChannels = parseInt(tokens[1]);\n // Skip CHANNELS and the number of channels\n node.channels = tokens.splice(2, numChannels);\n node.children = [];\n }\n\n // read children\n while (lines.length > 0) {\n const line = lines.shift()?.trim();\n\n if (line === \"}\") {\n // Finish reading the node\n return node;\n } else if (line) {\n node.children.push(ReadNode(lines, line, node, context));\n }\n }\n\n throw new Error(\"Unexpected end of file: missing closing brace\");\n}\n\n/**\n * Reads a BVH file, returns a skeleton\n * @param text - The BVH file content\n * @param scene - The scene to add the skeleton to\n * @param assetContainer - The asset container to add the skeleton to\n * @param loadingOptions - The loading options\n * @returns The skeleton\n */\nexport function ReadBvh(text: string, scene: Scene, assetContainer: Nullable<AssetContainer>, loadingOptions: BVHLoadingOptions): Skeleton {\n const lines = text.split(\"\\n\");\n\n const { loopMode } = loadingOptions;\n\n const skeleton = scene._executeWithBlockedEntityCollection(!!assetContainer, () => new Skeleton(\"\", \"\", scene));\n skeleton._parentContainer = assetContainer;\n\n const context = new LoaderContext(skeleton);\n context.loopMode = loopMode;\n\n // read model structure\n const firstLine = lines.shift();\n if (!firstLine || firstLine.trim().toUpperCase() !== _HierarchyNode) {\n throw new Error(\"HIERARCHY expected\");\n }\n\n const nodeLine = lines.shift();\n if (!nodeLine) {\n throw new Error(\"Unexpected end of file after HIERARCHY\");\n }\n const root = ReadNode(lines, nodeLine.trim(), null, context);\n\n // read motion data\n const motionLine = lines.shift();\n if (!motionLine || motionLine.trim().toUpperCase() !== _MotionNode) {\n throw new Error(\"MOTION expected\");\n }\n\n const framesLine = lines.shift();\n if (!framesLine) {\n throw new Error(\"Unexpected end of file before frame count\");\n }\n const framesTokens = framesLine.trim().split(/[\\s]+/);\n if (framesTokens.length < 2) {\n throw new Error(\"Invalid frame count line\");\n }\n\n // number of frames\n const numFrames = parseInt(framesTokens[1]);\n if (isNaN(numFrames)) {\n throw new Error(\"Failed to read number of frames.\");\n }\n context.numFrames = numFrames;\n\n // frame time\n const frameTimeLine = lines.shift();\n if (!frameTimeLine) {\n throw new Error(\"Unexpected end of file before frame time\");\n }\n const frameTimeTokens = frameTimeLine.trim().split(/[\\s]+/);\n if (frameTimeTokens.length < 3) {\n throw new Error(\"Invalid frame time line\");\n }\n const frameTime = parseFloat(frameTimeTokens[2]);\n if (isNaN(frameTime)) {\n throw new Error(\"Failed to read frame time.\");\n }\n if (frameTime <= 0) {\n throw new Error(\"Failed to read frame time. Invalid value \" + frameTime);\n }\n\n context.frameRate = 1 / frameTime;\n\n // read frame data line by line\n for (let i = 0; i < numFrames; ++i) {\n const frameLine = lines.shift();\n if (!frameLine) {\n continue;\n }\n const tokens = frameLine.trim().split(/[\\s]+/) || [];\n ReadFrameData(tokens, i, root, { i: 0 });\n }\n\n context.root = root;\n\n ConvertNode(context.root, null, context);\n\n context.skeleton.returnToRest();\n return context.skeleton;\n}\n"]}
|
package/OBJ/mtlFileLoader.js
CHANGED
|
@@ -68,16 +68,12 @@ export class MTLFileLoader {
|
|
|
68
68
|
}
|
|
69
69
|
//Create a new material.
|
|
70
70
|
// value is the name of the material read in the mtl file
|
|
71
|
-
|
|
72
|
-
scene._blockEntityCollection = !!assetContainer;
|
|
73
|
-
try {
|
|
71
|
+
material = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {
|
|
74
72
|
material = new StandardMaterial(value, scene);
|
|
75
73
|
material._parentContainer = assetContainer;
|
|
76
74
|
assetContainer?.materials.push(material);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
scene._blockEntityCollection = blockEntityCollection;
|
|
80
|
-
}
|
|
75
|
+
return material;
|
|
76
|
+
});
|
|
81
77
|
}
|
|
82
78
|
else if (key === "kd" && material) {
|
|
83
79
|
// Diffuse color (color under white light) using RGB values
|
|
@@ -249,42 +245,20 @@ export class MTLFileLoader {
|
|
|
249
245
|
void deferred.promise.catch(() => undefined);
|
|
250
246
|
textureLoadPromises.push(deferred.promise);
|
|
251
247
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
const internalTexture = texture?.getInternalTexture();
|
|
255
|
-
if (!internalTexture) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
const texturesCache = scene.getEngine().getLoadedTexturesCache();
|
|
259
|
-
const cacheIndex = texturesCache.indexOf(internalTexture);
|
|
260
|
-
if (cacheIndex !== -1) {
|
|
261
|
-
texturesCache.splice(cacheIndex, 1);
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
const blockEntityCollection = scene._blockEntityCollection;
|
|
265
|
-
scene._blockEntityCollection = !!assetContainer;
|
|
266
|
-
try {
|
|
267
|
-
texture = new Texture(url, scene, {
|
|
248
|
+
const texture = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {
|
|
249
|
+
const result = new Texture(url, scene, {
|
|
268
250
|
invertY: invertTextureY,
|
|
269
251
|
onLoad: deferred?.resolve,
|
|
270
252
|
onError: (message, exception) => {
|
|
271
|
-
if (texture) {
|
|
272
|
-
removeFailedTextureFromCache();
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
queueMicrotask(removeFailedTextureFromCache);
|
|
276
|
-
}
|
|
277
253
|
if (deferred) {
|
|
278
254
|
deferred.reject(new Error(`${url}: ${exception?.message || message || "Failed to load texture"}`));
|
|
279
255
|
}
|
|
280
256
|
},
|
|
281
257
|
});
|
|
282
|
-
|
|
283
|
-
assetContainer?.textures.push(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
scene._blockEntityCollection = blockEntityCollection;
|
|
287
|
-
}
|
|
258
|
+
result._parentContainer = assetContainer;
|
|
259
|
+
assetContainer?.textures.push(result);
|
|
260
|
+
return result;
|
|
261
|
+
});
|
|
288
262
|
// A container is not rendered yet, so delayed loading cannot wait for a material bind.
|
|
289
263
|
if (deferred && texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {
|
|
290
264
|
texture.delayLoad();
|
package/OBJ/mtlFileLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mtlFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/OBJ/mtlFileLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9C;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QAMI;;WAEG;QACI,cAAS,GAAuB,EAAE,CAAC;IAkS9C,CAAC;IAhSG;;;;;;;;;;;;;;OAcG;IACI,QAAQ,CACX,KAAY,EACZ,IAA0B,EAC1B,OAAe,EACf,cAAwC,EACxC,cAAc,GAAG,aAAa,CAAC,gBAAgB,EAC/C,aAAmC,EACnC,mBAAmB,GAAG,KAAK;QAE3B,MAAM,mBAAmB,GAA8B,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvF,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;YAC9B,OAAO,mBAAmB,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,KAAK,CAAC;QAC/B,uBAAuB;QACvB,IAAI,KAAe,CAAC;QACpB,cAAc;QACd,IAAI,QAAQ,GAA+B,IAAI,CAAC;QAEhD,mBAAmB;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7B,wBAAwB;YACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC9C,SAAS;YACb,CAAC;YAED,mCAAmC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,gCAAgC;YAChC,MAAM,KAAK,GAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAErE,+CAA+C;YAC/C,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACnB,oCAAoC;gBACpC,6DAA6D;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACX,kDAAkD;oBAClD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,QAAQ,GAAG,IAAI,CAAC;oBAChB,SAAS;gBACb,CAAC;gBACD,wBAAwB;gBACxB,yDAAyD;gBAEzD,MAAM,qBAAqB,GAAG,KAAK,CAAC,sBAAsB,CAAC;gBAC3D,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,cAAc,CAAC;gBAChD,IAAI,CAAC;oBACD,QAAQ,GAAG,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBAC9C,QAAQ,CAAC,gBAAgB,GAAG,cAAc,CAAC;oBAC3C,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC;wBAAS,CAAC;oBACP,KAAK,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;gBACzD,CAAC;YACL,CAAC;iBAAM,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAClC,2DAA2D;gBAE3D,kBAAkB;gBAClB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACzD,iBAAiB;gBACjB,kCAAkC;gBAClC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAClC,sDAAsD;gBAEtD,iBAAiB;gBACjB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACzD,iBAAiB;gBACjB,kCAAkC;gBAClC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAClC,qFAAqF;gBAErF,iBAAiB;gBACjB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACzD,iBAAiB;gBACjB,iCAAiC;gBACjC,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAClC,kCAAkC;gBAClC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACzD,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAClC,mBAAmB;gBACnB,QAAQ,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,GAAG,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;gBACjC,+DAA+D;gBAC/D,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEnC,SAAS;gBACT,qEAAqE;YACzE,CAAC;iBAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACtC,0CAA0C;gBAC1C,2CAA2C;gBAC3C,QAAQ,CAAC,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACpI,CAAC;iBAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACtC,0CAA0C;gBAC1C,QAAQ,CAAC,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACpI,CAAC;iBAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACtC,2CAA2C;gBAC3C,2CAA2C;gBAC3C,QAAQ,CAAC,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACrI,CAAC;iBAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC1B,UAAU;gBACV,8BAA8B;gBAC9B,2CAA2C;gBAC3C,EAAE;gBACF,0BAA0B;gBAC1B,EAAE;gBACF,eAAe;YACnB,CAAC;iBAAM,IAAI,GAAG,KAAK,UAAU,IAAI,QAAQ,EAAE,CAAC;gBACxC,kBAAkB;gBAClB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC7C,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAClD,IAAI,cAAc,GAAqB,IAAI,CAAC;gBAE5C,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;oBAC3B,cAAc,GAAG,MAAM,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;oBACjD,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpD,CAAC;gBAED,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;gBACxI,IAAI,QAAQ,CAAC,WAAW,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;oBAClD,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC;iBAAM,IAAI,GAAG,KAAK,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACrC,+BAA+B;gBAC/B,QAAQ,CAAC,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;gBAEhI,0BAA0B;YAC9B,CAAC;iBAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACzB,cAAc;gBACd,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBAChB,oBAAoB;gBACxB,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,yBAAyB;gBAC7B,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,cAAc;gBAClB,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,gCAAgC;gBACpC,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,kDAAkD;gBACtD,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,yCAAyC;gBAC7C,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,uEAAuE;gBAC3E,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,sEAAsE;gBAC1E,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,iCAAiC;gBACrC,CAAC;qBAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACvB,mDAAmD;gBACvD,CAAC;qBAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACxB,uCAAuC;gBAC3C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,qFAAqF;YACzF,CAAC;QACL,CAAC;QACD,+CAA+C;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,mBAAmB,IAAI,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,MAAM,CAAC,WAAW,CACtB,OAAe,EACf,KAAa,EACb,KAAY,EACZ,cAAwC,EACxC,cAAuB,EACvB,mBAA+C;QAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,GAAG,GAAG,OAAO,CAAC;QAClB,wBAAwB;QACxB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACtB,IAAI,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvB,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;gBACrB,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACJ,GAAG,IAAI,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,uBAAuB;aAClB,CAAC;YACF,GAAG,IAAI,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,IAAI,QAAQ,EAAE,CAAC;YACX,gIAAgI;YAChI,0CAA0C;YAC1C,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,mBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,OAA4B,CAAC;QACjC,MAAM,4BAA4B,GAAG,GAAG,EAAE;YACtC,MAAM,eAAe,GAAG,OAAO,EAAE,kBAAkB,EAAE,CAAC;YACtD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO;YACX,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,sBAAsB,EAAE,CAAC;YACjE,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC1D,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpB,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,sBAAsB,CAAC;QAC3D,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,cAAc,CAAC;QAChD,IAAI,CAAC;YACD,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE;gBAC9B,OAAO,EAAE,cAAc;gBACvB,MAAM,EAAE,QAAQ,EAAE,OAAO;gBACzB,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE;oBAC5B,IAAI,OAAO,EAAE,CAAC;wBACV,4BAA4B,EAAE,CAAC;oBACnC,CAAC;yBAAM,CAAC;wBACJ,cAAc,CAAC,4BAA4B,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,QAAQ,EAAE,CAAC;wBACX,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,SAAS,EAAE,OAAO,IAAI,OAAO,IAAI,wBAAwB,EAAE,CAAC,CAAC,CAAC;oBACvG,CAAC;gBACL,CAAC;aACJ,CAAC,CAAC;YACH,OAAO,CAAC,gBAAgB,GAAG,cAAc,CAAC;YAC1C,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACP,KAAK,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QACzD,CAAC;QAED,uFAAuF;QACvF,IAAI,QAAQ,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,wBAAwB,EAAE,CAAC;YAC5E,OAAO,CAAC,SAAS,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;;AAzSD;;GAEG;AACW,8BAAgB,GAAG,IAAI,AAAP,CAAQ","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\n\r\nimport { type Scene } from \"core/scene\";\r\nimport { type AssetContainer } from \"core/assetContainer\";\r\n/**\r\n * Class reading and parsing the MTL file bundled with the obj file.\r\n */\r\nexport class MTLFileLoader {\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static INVERT_TEXTURE_Y = true;\r\n\r\n /**\r\n * All material loaded from the mtl will be set here\r\n */\r\n public materials: StandardMaterial[] = [];\r\n\r\n /**\r\n * This function will read the mtl file and create each material described inside\r\n * This function could be improve by adding :\r\n * -some component missing (Ni, Tf...)\r\n * -including the specific options available\r\n *\r\n * @param scene defines the scene the material will be created in\r\n * @param data defines the mtl data to parse\r\n * @param rootUrl defines the rooturl to use in order to load relative dependencies\r\n * @param assetContainer defines the asset container to store the material in (can be null)\r\n * @param invertTextureY defines whether referenced textures are inverted on the Y axis\r\n * @param materialNames defines which materials to load, or all materials if omitted\r\n * @param trackTextureLoading collects texture loading promises and starts delayed textures when true; defaults to false\r\n * @returns the texture loading promises, or an empty array when trackTextureLoading is false\r\n */\r\n public parseMTL(\r\n scene: Scene,\r\n data: string | ArrayBuffer,\r\n rootUrl: string,\r\n assetContainer: Nullable<AssetContainer>,\r\n invertTextureY = MTLFileLoader.INVERT_TEXTURE_Y,\r\n materialNames?: ReadonlySet<string>,\r\n trackTextureLoading = false\r\n ): Promise<void>[] {\r\n const textureLoadPromises: Nullable<Promise<void>[]> = trackTextureLoading ? [] : null;\r\n if (data instanceof ArrayBuffer) {\r\n return textureLoadPromises ?? [];\r\n }\r\n\r\n //Split the lines from the file\r\n const lines = data.split(\"\\n\");\r\n // whitespace char ie: [ \\t\\r\\n\\f]\r\n const delimiterPattern = /\\s+/;\r\n //Array with RGB colors\r\n let color: number[];\r\n //New material\r\n let material: Nullable<StandardMaterial> = null;\r\n\r\n //Look at each line\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // Blank line or comment\r\n if (line.length === 0 || line.charAt(0) === \"#\") {\r\n continue;\r\n }\r\n\r\n //Get the first parameter (keyword)\r\n const pos = line.indexOf(\" \");\r\n let key = pos >= 0 ? line.substring(0, pos) : line;\r\n key = key.toLowerCase();\r\n\r\n //Get the data following the key\r\n const value: string = pos >= 0 ? line.substring(pos + 1).trim() : \"\";\r\n\r\n //This mtl keyword will create the new material\r\n if (key === \"newmtl\") {\r\n //Check if it is the first material.\r\n // Materials specifications are described after this keyword.\r\n if (material) {\r\n //Add the previous material in the material array.\r\n this.materials.push(material);\r\n }\r\n if (materialNames && !materialNames.has(value)) {\r\n material = null;\r\n continue;\r\n }\r\n //Create a new material.\r\n // value is the name of the material read in the mtl file\r\n\r\n const blockEntityCollection = scene._blockEntityCollection;\r\n scene._blockEntityCollection = !!assetContainer;\r\n try {\r\n material = new StandardMaterial(value, scene);\r\n material._parentContainer = assetContainer;\r\n assetContainer?.materials.push(material);\r\n } finally {\r\n scene._blockEntityCollection = blockEntityCollection;\r\n }\r\n } else if (key === \"kd\" && material) {\r\n // Diffuse color (color under white light) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set tghe color into the material\r\n material.diffuseColor = Color3.FromArray(color);\r\n } else if (key === \"ka\" && material) {\r\n // Ambient color (color under shadow) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set tghe color into the material\r\n material.ambientColor = Color3.FromArray(color);\r\n } else if (key === \"ks\" && material) {\r\n // Specular color (color when light is reflected from shiny surface) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set the color into the material\r\n material.specularColor = Color3.FromArray(color);\r\n } else if (key === \"ke\" && material) {\r\n // Emissive color using RGB values\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n material.emissiveColor = Color3.FromArray(color);\r\n } else if (key === \"ns\" && material) {\r\n //value = \"Integer\"\r\n material.specularPower = parseFloat(value);\r\n } else if (key === \"d\" && material) {\r\n //d is dissolve for current material. It mean alpha for BABYLON\r\n material.alpha = parseFloat(value);\r\n\r\n //Texture\r\n //This part can be improved by adding the possible options of texture\r\n } else if (key === \"map_ka\" && material) {\r\n // ambient texture map with a loaded image\r\n //We must first get the folder of the image\r\n material.ambientTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_kd\" && material) {\r\n // Diffuse texture map with a loaded image\r\n material.diffuseTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_ks\" && material) {\r\n // Specular texture map with a loaded image\r\n //We must first get the folder of the image\r\n material.specularTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_ns\") {\r\n //Specular\r\n //Specular highlight component\r\n //We must first get the folder of the image\r\n //\r\n //Not supported by BABYLON\r\n //\r\n // continue;\r\n } else if (key === \"map_bump\" && material) {\r\n //The bump texture\r\n const values = value.split(delimiterPattern);\r\n const bumpMultiplierIndex = values.indexOf(\"-bm\");\r\n let bumpMultiplier: Nullable<string> = null;\r\n\r\n if (bumpMultiplierIndex >= 0) {\r\n bumpMultiplier = values[bumpMultiplierIndex + 1];\r\n values.splice(bumpMultiplierIndex, 2); // remove\r\n }\r\n\r\n material.bumpTexture = MTLFileLoader._GetTexture(rootUrl, values.join(\" \"), scene, assetContainer, invertTextureY, textureLoadPromises);\r\n if (material.bumpTexture && bumpMultiplier !== null) {\r\n material.bumpTexture.level = parseFloat(bumpMultiplier);\r\n }\r\n } else if (key === \"map_d\" && material) {\r\n // The dissolve of the material\r\n material.opacityTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n\r\n //Options for illumination\r\n } else if (key === \"illum\") {\r\n //Illumination\r\n if (value === \"0\") {\r\n //That mean Kd == Kd\r\n } else if (value === \"1\") {\r\n //Color on and Ambient on\r\n } else if (value === \"2\") {\r\n //Highlight on\r\n } else if (value === \"3\") {\r\n //Reflection on and Ray trace on\r\n } else if (value === \"4\") {\r\n //Transparency: Glass on, Reflection: Ray trace on\r\n } else if (value === \"5\") {\r\n //Reflection: Fresnel on and Ray trace on\r\n } else if (value === \"6\") {\r\n //Transparency: Refraction on, Reflection: Fresnel off and Ray trace on\r\n } else if (value === \"7\") {\r\n //Transparency: Refraction on, Reflection: Fresnel on and Ray trace on\r\n } else if (value === \"8\") {\r\n //Reflection on and Ray trace off\r\n } else if (value === \"9\") {\r\n //Transparency: Glass on, Reflection: Ray trace off\r\n } else if (value === \"10\") {\r\n //Casts shadows onto invisible surfaces\r\n }\r\n } else {\r\n // console.log(\"Unhandled expression at line : \" + i +'\\n' + \"with value : \" + line);\r\n }\r\n }\r\n //At the end of the file, add the last material\r\n if (material) {\r\n this.materials.push(material);\r\n }\r\n\r\n return textureLoadPromises ?? [];\r\n }\r\n\r\n /**\r\n * Gets the texture for the material.\r\n *\r\n * If the material is imported from input file,\r\n * We sanitize the url to ensure it takes the texture from aside the material.\r\n *\r\n * @param rootUrl The root url to load from\r\n * @param value The value stored in the mtl\r\n * @param scene\r\n * @param assetContainer The asset container to store the texture in\r\n * @param invertTextureY Whether to invert the texture on the Y axis\r\n * @param textureLoadPromises The promises to wait for when loading asynchronously\r\n * @returns The Texture\r\n */\r\n private static _GetTexture(\r\n rootUrl: string,\r\n value: string,\r\n scene: Scene,\r\n assetContainer: Nullable<AssetContainer>,\r\n invertTextureY: boolean,\r\n textureLoadPromises?: Nullable<Promise<void>[]>\r\n ): Nullable<Texture> {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n let url = rootUrl;\r\n // Load from input file.\r\n if (rootUrl === \"file:\") {\r\n let lastDelimiter = value.lastIndexOf(\"\\\\\");\r\n if (lastDelimiter === -1) {\r\n lastDelimiter = value.lastIndexOf(\"/\");\r\n }\r\n\r\n if (lastDelimiter > -1) {\r\n url += value.substring(lastDelimiter + 1);\r\n } else {\r\n url += value;\r\n }\r\n }\r\n // Not from input file.\r\n else {\r\n url += value;\r\n }\r\n\r\n const deferred = textureLoadPromises ? new Deferred<void>() : null;\r\n if (deferred) {\r\n // Parsing may throw before returning the array. Observe rejection without changing the original promise returned to the caller.\r\n // eslint-disable-next-line github/no-then\r\n void deferred.promise.catch(() => undefined);\r\n textureLoadPromises!.push(deferred.promise);\r\n }\r\n\r\n let texture: Texture | undefined;\r\n const removeFailedTextureFromCache = () => {\r\n const internalTexture = texture?.getInternalTexture();\r\n if (!internalTexture) {\r\n return;\r\n }\r\n\r\n const texturesCache = scene.getEngine().getLoadedTexturesCache();\r\n const cacheIndex = texturesCache.indexOf(internalTexture);\r\n if (cacheIndex !== -1) {\r\n texturesCache.splice(cacheIndex, 1);\r\n }\r\n };\r\n\r\n const blockEntityCollection = scene._blockEntityCollection;\r\n scene._blockEntityCollection = !!assetContainer;\r\n try {\r\n texture = new Texture(url, scene, {\r\n invertY: invertTextureY,\r\n onLoad: deferred?.resolve,\r\n onError: (message, exception) => {\r\n if (texture) {\r\n removeFailedTextureFromCache();\r\n } else {\r\n queueMicrotask(removeFailedTextureFromCache);\r\n }\r\n if (deferred) {\r\n deferred.reject(new Error(`${url}: ${exception?.message || message || \"Failed to load texture\"}`));\r\n }\r\n },\r\n });\r\n texture._parentContainer = assetContainer;\r\n assetContainer?.textures.push(texture);\r\n } finally {\r\n scene._blockEntityCollection = blockEntityCollection;\r\n }\r\n\r\n // A container is not rendered yet, so delayed loading cannot wait for a material bind.\r\n if (deferred && texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n texture.delayLoad();\r\n }\r\n return texture;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"mtlFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/OBJ/mtlFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\n\r\nimport { type Scene } from \"core/scene\";\r\nimport { type AssetContainer } from \"core/assetContainer\";\r\n/**\r\n * Class reading and parsing the MTL file bundled with the obj file.\r\n */\r\nexport class MTLFileLoader {\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static INVERT_TEXTURE_Y = true;\r\n\r\n /**\r\n * All material loaded from the mtl will be set here\r\n */\r\n public materials: StandardMaterial[] = [];\r\n\r\n /**\r\n * This function will read the mtl file and create each material described inside\r\n * This function could be improve by adding :\r\n * -some component missing (Ni, Tf...)\r\n * -including the specific options available\r\n *\r\n * @param scene defines the scene the material will be created in\r\n * @param data defines the mtl data to parse\r\n * @param rootUrl defines the rooturl to use in order to load relative dependencies\r\n * @param assetContainer defines the asset container to store the material in (can be null)\r\n * @param invertTextureY defines whether referenced textures are inverted on the Y axis\r\n * @param materialNames defines which materials to load, or all materials if omitted\r\n * @param trackTextureLoading collects texture loading promises and starts delayed textures when true; defaults to false\r\n * @returns the texture loading promises, or an empty array when trackTextureLoading is false\r\n */\r\n public parseMTL(\r\n scene: Scene,\r\n data: string | ArrayBuffer,\r\n rootUrl: string,\r\n assetContainer: Nullable<AssetContainer>,\r\n invertTextureY = MTLFileLoader.INVERT_TEXTURE_Y,\r\n materialNames?: ReadonlySet<string>,\r\n trackTextureLoading = false\r\n ): Promise<void>[] {\r\n const textureLoadPromises: Nullable<Promise<void>[]> = trackTextureLoading ? [] : null;\r\n if (data instanceof ArrayBuffer) {\r\n return textureLoadPromises ?? [];\r\n }\r\n\r\n //Split the lines from the file\r\n const lines = data.split(\"\\n\");\r\n // whitespace char ie: [ \\t\\r\\n\\f]\r\n const delimiterPattern = /\\s+/;\r\n //Array with RGB colors\r\n let color: number[];\r\n //New material\r\n let material: Nullable<StandardMaterial> = null;\r\n\r\n //Look at each line\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // Blank line or comment\r\n if (line.length === 0 || line.charAt(0) === \"#\") {\r\n continue;\r\n }\r\n\r\n //Get the first parameter (keyword)\r\n const pos = line.indexOf(\" \");\r\n let key = pos >= 0 ? line.substring(0, pos) : line;\r\n key = key.toLowerCase();\r\n\r\n //Get the data following the key\r\n const value: string = pos >= 0 ? line.substring(pos + 1).trim() : \"\";\r\n\r\n //This mtl keyword will create the new material\r\n if (key === \"newmtl\") {\r\n //Check if it is the first material.\r\n // Materials specifications are described after this keyword.\r\n if (material) {\r\n //Add the previous material in the material array.\r\n this.materials.push(material);\r\n }\r\n if (materialNames && !materialNames.has(value)) {\r\n material = null;\r\n continue;\r\n }\r\n //Create a new material.\r\n // value is the name of the material read in the mtl file\r\n\r\n material = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {\r\n material = new StandardMaterial(value, scene);\r\n material._parentContainer = assetContainer;\r\n assetContainer?.materials.push(material);\r\n return material;\r\n });\r\n } else if (key === \"kd\" && material) {\r\n // Diffuse color (color under white light) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set tghe color into the material\r\n material.diffuseColor = Color3.FromArray(color);\r\n } else if (key === \"ka\" && material) {\r\n // Ambient color (color under shadow) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set tghe color into the material\r\n material.ambientColor = Color3.FromArray(color);\r\n } else if (key === \"ks\" && material) {\r\n // Specular color (color when light is reflected from shiny surface) using RGB values\r\n\r\n //value = \"r g b\"\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n //color = [r,g,b]\r\n //Set the color into the material\r\n material.specularColor = Color3.FromArray(color);\r\n } else if (key === \"ke\" && material) {\r\n // Emissive color using RGB values\r\n color = value.split(delimiterPattern, 3).map(parseFloat);\r\n material.emissiveColor = Color3.FromArray(color);\r\n } else if (key === \"ns\" && material) {\r\n //value = \"Integer\"\r\n material.specularPower = parseFloat(value);\r\n } else if (key === \"d\" && material) {\r\n //d is dissolve for current material. It mean alpha for BABYLON\r\n material.alpha = parseFloat(value);\r\n\r\n //Texture\r\n //This part can be improved by adding the possible options of texture\r\n } else if (key === \"map_ka\" && material) {\r\n // ambient texture map with a loaded image\r\n //We must first get the folder of the image\r\n material.ambientTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_kd\" && material) {\r\n // Diffuse texture map with a loaded image\r\n material.diffuseTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_ks\" && material) {\r\n // Specular texture map with a loaded image\r\n //We must first get the folder of the image\r\n material.specularTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n } else if (key === \"map_ns\") {\r\n //Specular\r\n //Specular highlight component\r\n //We must first get the folder of the image\r\n //\r\n //Not supported by BABYLON\r\n //\r\n // continue;\r\n } else if (key === \"map_bump\" && material) {\r\n //The bump texture\r\n const values = value.split(delimiterPattern);\r\n const bumpMultiplierIndex = values.indexOf(\"-bm\");\r\n let bumpMultiplier: Nullable<string> = null;\r\n\r\n if (bumpMultiplierIndex >= 0) {\r\n bumpMultiplier = values[bumpMultiplierIndex + 1];\r\n values.splice(bumpMultiplierIndex, 2); // remove\r\n }\r\n\r\n material.bumpTexture = MTLFileLoader._GetTexture(rootUrl, values.join(\" \"), scene, assetContainer, invertTextureY, textureLoadPromises);\r\n if (material.bumpTexture && bumpMultiplier !== null) {\r\n material.bumpTexture.level = parseFloat(bumpMultiplier);\r\n }\r\n } else if (key === \"map_d\" && material) {\r\n // The dissolve of the material\r\n material.opacityTexture = MTLFileLoader._GetTexture(rootUrl, value, scene, assetContainer, invertTextureY, textureLoadPromises);\r\n\r\n //Options for illumination\r\n } else if (key === \"illum\") {\r\n //Illumination\r\n if (value === \"0\") {\r\n //That mean Kd == Kd\r\n } else if (value === \"1\") {\r\n //Color on and Ambient on\r\n } else if (value === \"2\") {\r\n //Highlight on\r\n } else if (value === \"3\") {\r\n //Reflection on and Ray trace on\r\n } else if (value === \"4\") {\r\n //Transparency: Glass on, Reflection: Ray trace on\r\n } else if (value === \"5\") {\r\n //Reflection: Fresnel on and Ray trace on\r\n } else if (value === \"6\") {\r\n //Transparency: Refraction on, Reflection: Fresnel off and Ray trace on\r\n } else if (value === \"7\") {\r\n //Transparency: Refraction on, Reflection: Fresnel on and Ray trace on\r\n } else if (value === \"8\") {\r\n //Reflection on and Ray trace off\r\n } else if (value === \"9\") {\r\n //Transparency: Glass on, Reflection: Ray trace off\r\n } else if (value === \"10\") {\r\n //Casts shadows onto invisible surfaces\r\n }\r\n } else {\r\n // console.log(\"Unhandled expression at line : \" + i +'\\n' + \"with value : \" + line);\r\n }\r\n }\r\n //At the end of the file, add the last material\r\n if (material) {\r\n this.materials.push(material);\r\n }\r\n\r\n return textureLoadPromises ?? [];\r\n }\r\n\r\n /**\r\n * Gets the texture for the material.\r\n *\r\n * If the material is imported from input file,\r\n * We sanitize the url to ensure it takes the texture from aside the material.\r\n *\r\n * @param rootUrl The root url to load from\r\n * @param value The value stored in the mtl\r\n * @param scene\r\n * @param assetContainer The asset container to store the texture in\r\n * @param invertTextureY Whether to invert the texture on the Y axis\r\n * @param textureLoadPromises The promises to wait for when loading asynchronously\r\n * @returns The Texture\r\n */\r\n private static _GetTexture(\r\n rootUrl: string,\r\n value: string,\r\n scene: Scene,\r\n assetContainer: Nullable<AssetContainer>,\r\n invertTextureY: boolean,\r\n textureLoadPromises?: Nullable<Promise<void>[]>\r\n ): Nullable<Texture> {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n let url = rootUrl;\r\n // Load from input file.\r\n if (rootUrl === \"file:\") {\r\n let lastDelimiter = value.lastIndexOf(\"\\\\\");\r\n if (lastDelimiter === -1) {\r\n lastDelimiter = value.lastIndexOf(\"/\");\r\n }\r\n\r\n if (lastDelimiter > -1) {\r\n url += value.substring(lastDelimiter + 1);\r\n } else {\r\n url += value;\r\n }\r\n }\r\n // Not from input file.\r\n else {\r\n url += value;\r\n }\r\n\r\n const deferred = textureLoadPromises ? new Deferred<void>() : null;\r\n if (deferred) {\r\n // Parsing may throw before returning the array. Observe rejection without changing the original promise returned to the caller.\r\n // eslint-disable-next-line github/no-then\r\n void deferred.promise.catch(() => undefined);\r\n textureLoadPromises!.push(deferred.promise);\r\n }\r\n\r\n const texture = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {\r\n const result = new Texture(url, scene, {\r\n invertY: invertTextureY,\r\n onLoad: deferred?.resolve,\r\n onError: (message, exception) => {\r\n if (deferred) {\r\n deferred.reject(new Error(`${url}: ${exception?.message || message || \"Failed to load texture\"}`));\r\n }\r\n },\r\n });\r\n result._parentContainer = assetContainer;\r\n assetContainer?.textures.push(result);\r\n return result;\r\n });\r\n\r\n // A container is not rendered yet, so delayed loading cannot wait for a material bind.\r\n if (deferred && texture.delayLoadState === Constants.DELAYLOADSTATE_NOTLOADED) {\r\n texture.delayLoad();\r\n }\r\n return texture;\r\n }\r\n}\r\n"]}
|
|
@@ -262,16 +262,12 @@ export class OBJFileLoader {
|
|
|
262
262
|
if (isLine(mesh)) {
|
|
263
263
|
let mat = mesh.material;
|
|
264
264
|
if (!mat) {
|
|
265
|
-
|
|
266
|
-
scene._blockEntityCollection = !!this._assetContainer;
|
|
267
|
-
try {
|
|
265
|
+
mat = scene._executeWithBlockedEntityCollection(!!this._assetContainer, () => {
|
|
268
266
|
mat = new StandardMaterial(mesh.name + "_line", scene);
|
|
269
267
|
mat._parentContainer = this._assetContainer;
|
|
270
268
|
this._assetContainer?.materials.push(mat);
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
scene._blockEntityCollection = blockEntityCollection;
|
|
274
|
-
}
|
|
269
|
+
return mat;
|
|
270
|
+
});
|
|
275
271
|
}
|
|
276
272
|
// If another mesh is using this material and it is not a line then we need to clone it.
|
|
277
273
|
const needClone = mat.getBindedMeshes().filter((e) => !isLine(e)).length > 0;
|
|
@@ -279,27 +275,26 @@ export class OBJFileLoader {
|
|
|
279
275
|
// Clone only the material; keep the MTL texture objects shared.
|
|
280
276
|
const sourceMaterial = mat;
|
|
281
277
|
const { ambientTexture, diffuseTexture, specularTexture, bumpTexture, opacityTexture } = sourceMaterial;
|
|
282
|
-
const
|
|
283
|
-
let lineMaterial;
|
|
284
|
-
try {
|
|
278
|
+
const lineMaterial = scene._executeWithBlockedEntityCollection(!!this._assetContainer, () => {
|
|
285
279
|
sourceMaterial.ambientTexture = null;
|
|
286
280
|
sourceMaterial.diffuseTexture = null;
|
|
287
281
|
sourceMaterial.specularTexture = null;
|
|
288
282
|
sourceMaterial.bumpTexture = null;
|
|
289
283
|
sourceMaterial.opacityTexture = null;
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
284
|
+
try {
|
|
285
|
+
const result = sourceMaterial.clone(sourceMaterial.name + "_line");
|
|
286
|
+
result._parentContainer = this._assetContainer;
|
|
287
|
+
this._assetContainer?.materials.push(result);
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
sourceMaterial.ambientTexture = ambientTexture;
|
|
292
|
+
sourceMaterial.diffuseTexture = diffuseTexture;
|
|
293
|
+
sourceMaterial.specularTexture = specularTexture;
|
|
294
|
+
sourceMaterial.bumpTexture = bumpTexture;
|
|
295
|
+
sourceMaterial.opacityTexture = opacityTexture;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
303
298
|
lineMaterial.ambientTexture = ambientTexture;
|
|
304
299
|
lineMaterial.diffuseTexture = diffuseTexture;
|
|
305
300
|
lineMaterial.specularTexture = specularTexture;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objFileLoader.pure.js","sourceRoot":"","sources":["../../../../dev/loaders/src/OBJ/objFileLoader.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector.pure\";\r\nimport { Tools } from \"core/Misc/tools.pure\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport {\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderPlugin,\r\n type ISceneLoaderAsyncResult,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type WebRequest } from \"core/Misc/webRequest\";\r\nimport { OBJFileLoaderMetadata } from \"./objFileLoader.metadata\";\r\nimport { MTLFileLoader } from \"./mtlFileLoader\";\r\nimport { type OBJLoadingOptions } from \"./objLoadingOptions\";\r\nimport { SolidParser } from \"./solidParser\";\r\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial.pure\";\r\nimport { type Geometry } from \"core/Meshes/geometry\";\r\n\r\n/**\r\n * OBJ file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the character encoding used to decode OBJ and MTL files.\r\n */\r\n public static ENCODING = \"auto\";\r\n /**\r\n * Defines if UVs are optimized by default during load.\r\n */\r\n public static OPTIMIZE_WITH_UV = true;\r\n /**\r\n * Invert model on y-axis (does a model scaling inversion)\r\n */\r\n public static INVERT_Y = false;\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static get INVERT_TEXTURE_Y() {\r\n return MTLFileLoader.INVERT_TEXTURE_Y;\r\n }\r\n\r\n public static set INVERT_TEXTURE_Y(value: boolean) {\r\n MTLFileLoader.INVERT_TEXTURE_Y = value;\r\n }\r\n\r\n /**\r\n * Wait for referenced textures to finish loading before completing the OBJ load.\r\n * Defaults to false for backwards compatibility.\r\n */\r\n public static WAIT_FOR_TEXTURES = false;\r\n\r\n /**\r\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\r\n */\r\n public static IMPORT_VERTEX_COLORS = false;\r\n /**\r\n * Compute the normals for the model, even if normals are present in the file.\r\n */\r\n public static COMPUTE_NORMALS = false;\r\n /**\r\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\r\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\r\n */\r\n public static OPTIMIZE_NORMALS = false;\r\n /**\r\n * Defines custom scaling of UV coordinates of loaded meshes.\r\n */\r\n public static UV_SCALING = /*#__PURE__*/ new Vector2(1, 1);\r\n /**\r\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\r\n */\r\n public static SKIP_MATERIALS = false;\r\n\r\n /**\r\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\r\n *\r\n * Defaults to true for backwards compatibility.\r\n */\r\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\r\n\r\n /**\r\n * Loads assets without handedness conversions. This flag is for compatibility. Use it only if absolutely required. Defaults to false.\r\n */\r\n public static USE_LEGACY_BEHAVIOR = false;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public readonly name = OBJFileLoaderMetadata.name;\r\n /**\r\n * Defines the extension the plugin is able to load.\r\n */\r\n public readonly extensions = OBJFileLoaderMetadata.extensions;\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private _loadingOptions: OBJLoadingOptions;\r\n\r\n /**\r\n * Creates loader for .OBJ files\r\n *\r\n * @param loadingOptions options for loading and parsing OBJ/MTL files.\r\n */\r\n constructor(loadingOptions?: Partial<Readonly<OBJLoadingOptions>>) {\r\n this._loadingOptions = { ...OBJFileLoader._DefaultLoadingOptions, ...(loadingOptions ?? {}) };\r\n }\r\n\r\n private static get _DefaultLoadingOptions(): OBJLoadingOptions {\r\n return {\r\n encoding: OBJFileLoader.ENCODING,\r\n computeNormals: OBJFileLoader.COMPUTE_NORMALS,\r\n optimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\r\n importVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\r\n invertY: OBJFileLoader.INVERT_Y,\r\n invertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\r\n waitForTextures: OBJFileLoader.WAIT_FOR_TEXTURES,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n UVScaling: OBJFileLoader.UV_SCALING,\r\n materialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\r\n optimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\r\n skipMaterials: OBJFileLoader.SKIP_MATERIALS,\r\n useLegacyBehavior: OBJFileLoader.USE_LEGACY_BEHAVIOR,\r\n };\r\n }\r\n\r\n /**\r\n * Calls synchronously the MTL file attached to this obj.\r\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\r\n * Without this function materials are not displayed in the first frame (but displayed after).\r\n * In consequence it is impossible to get material information in your HTML file\r\n *\r\n * @param url The URL of the MTL file\r\n * @param rootUrl defines where to load data from\r\n * @param onSuccess Callback function to be called when the MTL file is loaded\r\n * @param onFailure\r\n */\r\n private _loadMTL(\r\n url: string,\r\n rootUrl: string,\r\n onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any,\r\n onFailure: (pathOfFile: string, exception?: any) => void\r\n ) {\r\n //The complete path to the mtl file\r\n const pathOfFile = rootUrl + url;\r\n\r\n // Loads through the babylon tools to allow fileInput search.\r\n Tools.LoadFile(pathOfFile, onSuccess, undefined, undefined, true, (request?: WebRequest, exception?: any) => {\r\n onFailure(pathOfFile, exception);\r\n });\r\n }\r\n\r\n private _decode(data: string | ArrayBuffer): string {\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n const bytes = new Uint8Array(data);\r\n const encoding = this._loadingOptions.encoding ?? \"auto\";\r\n if (encoding !== \"auto\") {\r\n return new TextDecoder(encoding).decode(bytes);\r\n }\r\n\r\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\r\n return new TextDecoder(\"utf-16le\").decode(bytes);\r\n }\r\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\r\n return new TextDecoder(\"utf-16be\").decode(bytes);\r\n }\r\n\r\n try {\r\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\r\n } catch {\r\n return new TextDecoder(\"gb18030\").decode(bytes);\r\n }\r\n }\r\n\r\n /** @internal */\r\n createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\r\n return new OBJFileLoader(options[OBJFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * If the data string can be loaded directly.\r\n * @returns if the data can be loaded directly\r\n */\r\n public canDirectLoad(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<ISceneLoaderAsyncResult> {\r\n //get the meshes from OBJ file\r\n // eslint-disable-next-line github/no-then\r\n return this._parseSolidAsync(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n const geometries: Geometry[] = [];\r\n for (let i = 0; i < meshes.length; ++i) {\r\n const geometry = (meshes[i] as Mesh).geometry;\r\n if (geometry) {\r\n geometries.push(geometry);\r\n }\r\n }\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: geometries,\r\n lights: [],\r\n spriteManagers: [],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n // eslint-disable-next-line github/no-then\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n public async loadAssetContainerAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n try {\r\n // Resources are collected as they are created, including before texture loading settles.\r\n await this.importMeshAsync(null, scene, data, rootUrl);\r\n return container;\r\n } catch (ex) {\r\n container.dispose();\r\n throw ex;\r\n } finally {\r\n this._assetContainer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Read the OBJ file and create an Array of meshes.\r\n * Each mesh contains all information given by the OBJ and the MTL file.\r\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\r\n * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene defines the scene where are displayed the data\r\n * @param data defines the content of the obj file\r\n * @param rootUrl defines the path to the folder\r\n * @returns the list of loaded meshes\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _parseSolidAsync(meshesNames: any, scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n let fileToLoad: string = \"\"; //The name of the mtlFile to load\r\n const materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\r\n const materialToUse: string[] = [];\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n data = this._decode(data);\r\n\r\n // Sanitize data\r\n data = data.replace(/#.*$/gm, \"\").trim();\r\n\r\n // Main function\r\n const solidParser = new SolidParser(materialToUse, babylonMeshesArray, this._loadingOptions);\r\n\r\n solidParser.parse(meshesNames, data, scene, this._assetContainer, (fileName: string) => {\r\n fileToLoad = fileName;\r\n });\r\n\r\n // load the materials\r\n const mtlPromises: Array<Promise<void>> = [];\r\n // Check if we have a file to load\r\n if (fileToLoad !== \"\" && !this._loadingOptions.skipMaterials) {\r\n // Load the MTL and optionally wait for the textures used by the selected meshes.\r\n mtlPromises.push(\r\n new Promise((resolve, reject) => {\r\n this._loadMTL(\r\n fileToLoad,\r\n rootUrl,\r\n async (dataLoaded) => {\r\n try {\r\n //Create materials thanks MTLLoader function\r\n const textureLoadPromises = materialsFromMTLFile.parseMTL(\r\n scene,\r\n this._decode(dataLoaded),\r\n rootUrl,\r\n this._assetContainer,\r\n this._loadingOptions.invertTextureY,\r\n new Set(materialToUse),\r\n this._loadingOptions.waitForTextures\r\n );\r\n // Parsing creates the selected materials synchronously; only their textures are pending.\r\n for (let n = 0; n < materialsFromMTLFile.materials.length; ++n) {\r\n const material = materialsFromMTLFile.materials[n];\r\n for (let index = materialToUse.indexOf(material.name); index !== -1; index = materialToUse.indexOf(material.name, index + 1)) {\r\n const mesh = babylonMeshesArray[index];\r\n mesh.material = material;\r\n\r\n if (!mesh.getTotalIndices()) {\r\n // No indices, we need to turn on point cloud\r\n material.pointsCloud = true;\r\n }\r\n }\r\n }\r\n if (this._loadingOptions.waitForTextures) {\r\n const results = await Promise.allSettled(textureLoadPromises);\r\n const rejected = results.find((result) => result.status === \"rejected\");\r\n if (rejected) {\r\n throw rejected.reason;\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(e);\r\n }\r\n }\r\n },\r\n (pathOfFile: string, exception?: any) => {\r\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(exception);\r\n }\r\n }\r\n );\r\n })\r\n );\r\n }\r\n //Return an array with all Mesh\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(mtlPromises).then(() => {\r\n const isLine = (mesh: AbstractMesh) => Boolean(mesh._internalMetadata?.[\"_isLine\"] ?? false);\r\n\r\n // Iterate over the mesh, determine if it is a line mesh, clone or modify the material to line rendering.\r\n babylonMeshesArray.forEach((mesh) => {\r\n if (isLine(mesh)) {\r\n let mat = mesh.material;\r\n if (!mat) {\r\n const blockEntityCollection = scene._blockEntityCollection;\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n try {\r\n mat = new StandardMaterial(mesh.name + \"_line\", scene);\r\n mat._parentContainer = this._assetContainer;\r\n this._assetContainer?.materials.push(mat);\r\n } finally {\r\n scene._blockEntityCollection = blockEntityCollection;\r\n }\r\n }\r\n // If another mesh is using this material and it is not a line then we need to clone it.\r\n const needClone = mat.getBindedMeshes().filter((e) => !isLine(e)).length > 0;\r\n if (needClone) {\r\n // Clone only the material; keep the MTL texture objects shared.\r\n const sourceMaterial = mat as StandardMaterial;\r\n const { ambientTexture, diffuseTexture, specularTexture, bumpTexture, opacityTexture } = sourceMaterial;\r\n const blockEntityCollection = scene._blockEntityCollection;\r\n let lineMaterial: StandardMaterial;\r\n try {\r\n sourceMaterial.ambientTexture = null;\r\n sourceMaterial.diffuseTexture = null;\r\n sourceMaterial.specularTexture = null;\r\n sourceMaterial.bumpTexture = null;\r\n sourceMaterial.opacityTexture = null;\r\n scene._blockEntityCollection = !!this._assetContainer;\r\n lineMaterial = sourceMaterial.clone(sourceMaterial.name + \"_line\");\r\n lineMaterial._parentContainer = this._assetContainer;\r\n this._assetContainer?.materials.push(lineMaterial);\r\n } finally {\r\n scene._blockEntityCollection = blockEntityCollection;\r\n sourceMaterial.ambientTexture = ambientTexture;\r\n sourceMaterial.diffuseTexture = diffuseTexture;\r\n sourceMaterial.specularTexture = specularTexture;\r\n sourceMaterial.bumpTexture = bumpTexture;\r\n sourceMaterial.opacityTexture = opacityTexture;\r\n }\r\n lineMaterial.ambientTexture = ambientTexture;\r\n lineMaterial.diffuseTexture = diffuseTexture;\r\n lineMaterial.specularTexture = specularTexture;\r\n lineMaterial.bumpTexture = bumpTexture;\r\n lineMaterial.opacityTexture = opacityTexture;\r\n mat = lineMaterial;\r\n }\r\n mat.wireframe = true;\r\n mesh.material = mat;\r\n }\r\n });\r\n babylonMeshesArray.forEach((mesh) => {\r\n if (mesh._internalMetadata) {\r\n mesh._internalMetadata[\"_isLine\"] = undefined;\r\n }\r\n });\r\n\r\n return babylonMeshesArray;\r\n });\r\n }\r\n}\r\n\r\n//Add this loader into the register plugin\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the OBJFileLoader scene loader plugin.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterOBJFileLoader(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterSceneLoaderPlugin(new OBJFileLoader());\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"objFileLoader.pure.js","sourceRoot":"","sources":["../../../../dev/loaders/src/OBJ/objFileLoader.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/promise-function-async */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector.pure\";\r\nimport { Tools } from \"core/Misc/tools.pure\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport {\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderPlugin,\r\n type ISceneLoaderAsyncResult,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type WebRequest } from \"core/Misc/webRequest\";\r\nimport { OBJFileLoaderMetadata } from \"./objFileLoader.metadata\";\r\nimport { MTLFileLoader } from \"./mtlFileLoader\";\r\nimport { type OBJLoadingOptions } from \"./objLoadingOptions\";\r\nimport { SolidParser } from \"./solidParser\";\r\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial.pure\";\r\nimport { type Geometry } from \"core/Meshes/geometry\";\r\n\r\n/**\r\n * OBJ file type loader.\r\n * This is a babylon scene loader plugin.\r\n */\r\nexport class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the character encoding used to decode OBJ and MTL files.\r\n */\r\n public static ENCODING = \"auto\";\r\n /**\r\n * Defines if UVs are optimized by default during load.\r\n */\r\n public static OPTIMIZE_WITH_UV = true;\r\n /**\r\n * Invert model on y-axis (does a model scaling inversion)\r\n */\r\n public static INVERT_Y = false;\r\n /**\r\n * Invert Y-Axis of referenced textures on load\r\n */\r\n public static get INVERT_TEXTURE_Y() {\r\n return MTLFileLoader.INVERT_TEXTURE_Y;\r\n }\r\n\r\n public static set INVERT_TEXTURE_Y(value: boolean) {\r\n MTLFileLoader.INVERT_TEXTURE_Y = value;\r\n }\r\n\r\n /**\r\n * Wait for referenced textures to finish loading before completing the OBJ load.\r\n * Defaults to false for backwards compatibility.\r\n */\r\n public static WAIT_FOR_TEXTURES = false;\r\n\r\n /**\r\n * Include in meshes the vertex colors available in some OBJ files. This is not part of OBJ standard.\r\n */\r\n public static IMPORT_VERTEX_COLORS = false;\r\n /**\r\n * Compute the normals for the model, even if normals are present in the file.\r\n */\r\n public static COMPUTE_NORMALS = false;\r\n /**\r\n * Optimize the normals for the model. Lighting can be uneven if you use OptimizeWithUV = true because new vertices can be created for the same location if they pertain to different faces.\r\n * Using OptimizehNormals = true will help smoothing the lighting by averaging the normals of those vertices.\r\n */\r\n public static OPTIMIZE_NORMALS = false;\r\n /**\r\n * Defines custom scaling of UV coordinates of loaded meshes.\r\n */\r\n public static UV_SCALING = /*#__PURE__*/ new Vector2(1, 1);\r\n /**\r\n * Skip loading the materials even if defined in the OBJ file (materials are ignored).\r\n */\r\n public static SKIP_MATERIALS = false;\r\n\r\n /**\r\n * When a material fails to load OBJ loader will silently fail and onSuccess() callback will be triggered.\r\n *\r\n * Defaults to true for backwards compatibility.\r\n */\r\n public static MATERIAL_LOADING_FAILS_SILENTLY = true;\r\n\r\n /**\r\n * Loads assets without handedness conversions. This flag is for compatibility. Use it only if absolutely required. Defaults to false.\r\n */\r\n public static USE_LEGACY_BEHAVIOR = false;\r\n\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public readonly name = OBJFileLoaderMetadata.name;\r\n /**\r\n * Defines the extension the plugin is able to load.\r\n */\r\n public readonly extensions = OBJFileLoaderMetadata.extensions;\r\n\r\n private _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n private _loadingOptions: OBJLoadingOptions;\r\n\r\n /**\r\n * Creates loader for .OBJ files\r\n *\r\n * @param loadingOptions options for loading and parsing OBJ/MTL files.\r\n */\r\n constructor(loadingOptions?: Partial<Readonly<OBJLoadingOptions>>) {\r\n this._loadingOptions = { ...OBJFileLoader._DefaultLoadingOptions, ...(loadingOptions ?? {}) };\r\n }\r\n\r\n private static get _DefaultLoadingOptions(): OBJLoadingOptions {\r\n return {\r\n encoding: OBJFileLoader.ENCODING,\r\n computeNormals: OBJFileLoader.COMPUTE_NORMALS,\r\n optimizeNormals: OBJFileLoader.OPTIMIZE_NORMALS,\r\n importVertexColors: OBJFileLoader.IMPORT_VERTEX_COLORS,\r\n invertY: OBJFileLoader.INVERT_Y,\r\n invertTextureY: OBJFileLoader.INVERT_TEXTURE_Y,\r\n waitForTextures: OBJFileLoader.WAIT_FOR_TEXTURES,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n UVScaling: OBJFileLoader.UV_SCALING,\r\n materialLoadingFailsSilently: OBJFileLoader.MATERIAL_LOADING_FAILS_SILENTLY,\r\n optimizeWithUV: OBJFileLoader.OPTIMIZE_WITH_UV,\r\n skipMaterials: OBJFileLoader.SKIP_MATERIALS,\r\n useLegacyBehavior: OBJFileLoader.USE_LEGACY_BEHAVIOR,\r\n };\r\n }\r\n\r\n /**\r\n * Calls synchronously the MTL file attached to this obj.\r\n * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.\r\n * Without this function materials are not displayed in the first frame (but displayed after).\r\n * In consequence it is impossible to get material information in your HTML file\r\n *\r\n * @param url The URL of the MTL file\r\n * @param rootUrl defines where to load data from\r\n * @param onSuccess Callback function to be called when the MTL file is loaded\r\n * @param onFailure\r\n */\r\n private _loadMTL(\r\n url: string,\r\n rootUrl: string,\r\n onSuccess: (response: string | ArrayBuffer, responseUrl?: string) => any,\r\n onFailure: (pathOfFile: string, exception?: any) => void\r\n ) {\r\n //The complete path to the mtl file\r\n const pathOfFile = rootUrl + url;\r\n\r\n // Loads through the babylon tools to allow fileInput search.\r\n Tools.LoadFile(pathOfFile, onSuccess, undefined, undefined, true, (request?: WebRequest, exception?: any) => {\r\n onFailure(pathOfFile, exception);\r\n });\r\n }\r\n\r\n private _decode(data: string | ArrayBuffer): string {\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n const bytes = new Uint8Array(data);\r\n const encoding = this._loadingOptions.encoding ?? \"auto\";\r\n if (encoding !== \"auto\") {\r\n return new TextDecoder(encoding).decode(bytes);\r\n }\r\n\r\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\r\n return new TextDecoder(\"utf-16le\").decode(bytes);\r\n }\r\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\r\n return new TextDecoder(\"utf-16be\").decode(bytes);\r\n }\r\n\r\n try {\r\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\r\n } catch {\r\n return new TextDecoder(\"gb18030\").decode(bytes);\r\n }\r\n }\r\n\r\n /** @internal */\r\n createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync | ISceneLoaderPlugin {\r\n return new OBJFileLoader(options[OBJFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * If the data string can be loaded directly.\r\n * @returns if the data can be loaded directly\r\n */\r\n public canDirectLoad(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Imports one or more meshes from the loaded OBJ data and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise containing the loaded meshes, particles, skeletons and animations\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise<ISceneLoaderAsyncResult> {\r\n //get the meshes from OBJ file\r\n // eslint-disable-next-line github/no-then\r\n return this._parseSolidAsync(meshesNames, scene, data, rootUrl).then((meshes) => {\r\n const geometries: Geometry[] = [];\r\n for (let i = 0; i < meshes.length; ++i) {\r\n const geometry = (meshes[i] as Mesh).geometry;\r\n if (geometry) {\r\n geometries.push(geometry);\r\n }\r\n }\r\n return {\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: [],\r\n animationGroups: [],\r\n transformNodes: [],\r\n geometries: geometries,\r\n lights: [],\r\n spriteManagers: [],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Imports all objects from the loaded OBJ data and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data the OBJ data to load\r\n * @param rootUrl root url to load from\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<void> {\r\n //Get the 3D model\r\n // eslint-disable-next-line github/no-then\r\n return this.importMeshAsync(null, scene, data, rootUrl).then(() => {\r\n // return void\r\n });\r\n }\r\n\r\n /**\r\n * Load into an asset container.\r\n * @param scene The scene to load into\r\n * @param data The data to import\r\n * @param rootUrl The root url for scene and resources\r\n * @returns The loaded asset container\r\n */\r\n public async loadAssetContainerAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<AssetContainer> {\r\n const container = new AssetContainer(scene);\r\n this._assetContainer = container;\r\n\r\n try {\r\n // Resources are collected as they are created, including before texture loading settles.\r\n await this.importMeshAsync(null, scene, data, rootUrl);\r\n return container;\r\n } catch (ex) {\r\n container.dispose();\r\n throw ex;\r\n } finally {\r\n this._assetContainer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Read the OBJ file and create an Array of meshes.\r\n * Each mesh contains all information given by the OBJ and the MTL file.\r\n * i.e. vertices positions and indices, optional normals values, optional UV values, optional material\r\n * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene defines the scene where are displayed the data\r\n * @param data defines the content of the obj file\r\n * @param rootUrl defines the path to the folder\r\n * @returns the list of loaded meshes\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _parseSolidAsync(meshesNames: any, scene: Scene, data: string | ArrayBuffer, rootUrl: string): Promise<Array<AbstractMesh>> {\r\n let fileToLoad: string = \"\"; //The name of the mtlFile to load\r\n const materialsFromMTLFile: MTLFileLoader = new MTLFileLoader();\r\n const materialToUse: string[] = [];\r\n const babylonMeshesArray: Array<Mesh> = []; //The mesh for babylon\r\n\r\n data = this._decode(data);\r\n\r\n // Sanitize data\r\n data = data.replace(/#.*$/gm, \"\").trim();\r\n\r\n // Main function\r\n const solidParser = new SolidParser(materialToUse, babylonMeshesArray, this._loadingOptions);\r\n\r\n solidParser.parse(meshesNames, data, scene, this._assetContainer, (fileName: string) => {\r\n fileToLoad = fileName;\r\n });\r\n\r\n // load the materials\r\n const mtlPromises: Array<Promise<void>> = [];\r\n // Check if we have a file to load\r\n if (fileToLoad !== \"\" && !this._loadingOptions.skipMaterials) {\r\n // Load the MTL and optionally wait for the textures used by the selected meshes.\r\n mtlPromises.push(\r\n new Promise((resolve, reject) => {\r\n this._loadMTL(\r\n fileToLoad,\r\n rootUrl,\r\n async (dataLoaded) => {\r\n try {\r\n //Create materials thanks MTLLoader function\r\n const textureLoadPromises = materialsFromMTLFile.parseMTL(\r\n scene,\r\n this._decode(dataLoaded),\r\n rootUrl,\r\n this._assetContainer,\r\n this._loadingOptions.invertTextureY,\r\n new Set(materialToUse),\r\n this._loadingOptions.waitForTextures\r\n );\r\n // Parsing creates the selected materials synchronously; only their textures are pending.\r\n for (let n = 0; n < materialsFromMTLFile.materials.length; ++n) {\r\n const material = materialsFromMTLFile.materials[n];\r\n for (let index = materialToUse.indexOf(material.name); index !== -1; index = materialToUse.indexOf(material.name, index + 1)) {\r\n const mesh = babylonMeshesArray[index];\r\n mesh.material = material;\r\n\r\n if (!mesh.getTotalIndices()) {\r\n // No indices, we need to turn on point cloud\r\n material.pointsCloud = true;\r\n }\r\n }\r\n }\r\n if (this._loadingOptions.waitForTextures) {\r\n const results = await Promise.allSettled(textureLoadPromises);\r\n const rejected = results.find((result) => result.status === \"rejected\");\r\n if (rejected) {\r\n throw rejected.reason;\r\n }\r\n }\r\n resolve();\r\n } catch (e) {\r\n Tools.Warn(`Error processing MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(e);\r\n }\r\n }\r\n },\r\n (pathOfFile: string, exception?: any) => {\r\n Tools.Warn(`Error downloading MTL file: '${fileToLoad}'`);\r\n if (this._loadingOptions.materialLoadingFailsSilently) {\r\n resolve();\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(exception);\r\n }\r\n }\r\n );\r\n })\r\n );\r\n }\r\n //Return an array with all Mesh\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(mtlPromises).then(() => {\r\n const isLine = (mesh: AbstractMesh) => Boolean(mesh._internalMetadata?.[\"_isLine\"] ?? false);\r\n\r\n // Iterate over the mesh, determine if it is a line mesh, clone or modify the material to line rendering.\r\n babylonMeshesArray.forEach((mesh) => {\r\n if (isLine(mesh)) {\r\n let mat = mesh.material;\r\n if (!mat) {\r\n mat = scene._executeWithBlockedEntityCollection(!!this._assetContainer, () => {\r\n mat = new StandardMaterial(mesh.name + \"_line\", scene);\r\n mat._parentContainer = this._assetContainer;\r\n this._assetContainer?.materials.push(mat);\r\n return mat;\r\n });\r\n }\r\n // If another mesh is using this material and it is not a line then we need to clone it.\r\n const needClone = mat.getBindedMeshes().filter((e) => !isLine(e)).length > 0;\r\n if (needClone) {\r\n // Clone only the material; keep the MTL texture objects shared.\r\n const sourceMaterial = mat as StandardMaterial;\r\n const { ambientTexture, diffuseTexture, specularTexture, bumpTexture, opacityTexture } = sourceMaterial;\r\n const lineMaterial = scene._executeWithBlockedEntityCollection(!!this._assetContainer, () => {\r\n sourceMaterial.ambientTexture = null;\r\n sourceMaterial.diffuseTexture = null;\r\n sourceMaterial.specularTexture = null;\r\n sourceMaterial.bumpTexture = null;\r\n sourceMaterial.opacityTexture = null;\r\n try {\r\n const result = sourceMaterial.clone(sourceMaterial.name + \"_line\");\r\n result._parentContainer = this._assetContainer;\r\n this._assetContainer?.materials.push(result);\r\n return result;\r\n } finally {\r\n sourceMaterial.ambientTexture = ambientTexture;\r\n sourceMaterial.diffuseTexture = diffuseTexture;\r\n sourceMaterial.specularTexture = specularTexture;\r\n sourceMaterial.bumpTexture = bumpTexture;\r\n sourceMaterial.opacityTexture = opacityTexture;\r\n }\r\n });\r\n lineMaterial.ambientTexture = ambientTexture;\r\n lineMaterial.diffuseTexture = diffuseTexture;\r\n lineMaterial.specularTexture = specularTexture;\r\n lineMaterial.bumpTexture = bumpTexture;\r\n lineMaterial.opacityTexture = opacityTexture;\r\n mat = lineMaterial;\r\n }\r\n mat.wireframe = true;\r\n mesh.material = mat;\r\n }\r\n });\r\n babylonMeshesArray.forEach((mesh) => {\r\n if (mesh._internalMetadata) {\r\n mesh._internalMetadata[\"_isLine\"] = undefined;\r\n }\r\n });\r\n\r\n return babylonMeshesArray;\r\n });\r\n }\r\n}\r\n\r\n//Add this loader into the register plugin\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the OBJFileLoader scene loader plugin.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterOBJFileLoader(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterSceneLoaderPlugin(new OBJFileLoader());\r\n}\r\n"]}
|
package/OBJ/solidParser.js
CHANGED
|
@@ -763,16 +763,12 @@ export class SolidParser {
|
|
|
763
763
|
}
|
|
764
764
|
if (!this._materialNameFromObj) {
|
|
765
765
|
// Create a material with point cloud on
|
|
766
|
-
|
|
767
|
-
scene._blockEntityCollection = !!assetContainer;
|
|
768
|
-
try {
|
|
766
|
+
newMaterial = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {
|
|
769
767
|
newMaterial = new StandardMaterial(Geometry.RandomId(), scene);
|
|
770
768
|
newMaterial._parentContainer = assetContainer;
|
|
771
769
|
assetContainer?.materials.push(newMaterial);
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
scene._blockEntityCollection = blockEntityCollection;
|
|
775
|
-
}
|
|
770
|
+
return newMaterial;
|
|
771
|
+
});
|
|
776
772
|
newMaterial.pointsCloud = true;
|
|
777
773
|
this._materialNameFromObj = newMaterial.name;
|
|
778
774
|
if (!this._normals.length) {
|
|
@@ -814,17 +810,12 @@ export class SolidParser {
|
|
|
814
810
|
//Set the data with VertexBuffer for each mesh
|
|
815
811
|
this._handledMesh = this._meshesFromObj[j];
|
|
816
812
|
//Create a Mesh with the name of the obj mesh
|
|
817
|
-
const
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
assetContainer?.meshes.push(babylonMesh);
|
|
824
|
-
}
|
|
825
|
-
finally {
|
|
826
|
-
scene._blockEntityCollection = blockEntityCollection;
|
|
827
|
-
}
|
|
813
|
+
const babylonMesh = scene._executeWithBlockedEntityCollection(!!assetContainer, () => {
|
|
814
|
+
const mesh = new Mesh(this._meshesFromObj[j].name, scene);
|
|
815
|
+
mesh._parentContainer = assetContainer;
|
|
816
|
+
assetContainer?.meshes.push(mesh);
|
|
817
|
+
return mesh;
|
|
818
|
+
});
|
|
828
819
|
this._handledMesh._babylonMesh = babylonMesh;
|
|
829
820
|
// If this is a group mesh, it should have an object mesh as a parent. So look for the first object mesh that appears before it.
|
|
830
821
|
if (!this._handledMesh.isObject) {
|
|
@@ -869,16 +860,11 @@ export class SolidParser {
|
|
|
869
860
|
vertexData.colors = this._handledMesh.colors;
|
|
870
861
|
}
|
|
871
862
|
//Set the data from the VertexBuffer to the current Mesh
|
|
872
|
-
|
|
873
|
-
scene._blockEntityCollection = !!assetContainer;
|
|
874
|
-
try {
|
|
863
|
+
scene._executeWithBlockedEntityCollection(!!assetContainer, () => {
|
|
875
864
|
vertexData.applyToMesh(babylonMesh);
|
|
876
865
|
babylonMesh.geometry._parentContainer = assetContainer;
|
|
877
866
|
assetContainer?.geometries.push(babylonMesh.geometry);
|
|
878
|
-
}
|
|
879
|
-
finally {
|
|
880
|
-
scene._blockEntityCollection = blockEntityCollectionBeforeGeometry;
|
|
881
|
-
}
|
|
867
|
+
});
|
|
882
868
|
if (this._loadingOptions.invertY) {
|
|
883
869
|
babylonMesh.scaling.y *= -1;
|
|
884
870
|
}
|