Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
车家大少爷
three.js
提交
90ee258d
T
three.js
项目概览
车家大少爷
/
three.js
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
three.js
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
90ee258d
编写于
7月 03, 2019
作者:
M
Mugen87
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
JSM: Added TS files for OBJLoader2 and fix style issues.
上级
5b4b5a2d
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
449 addition
and
49 deletion
+449
-49
examples/jsm/loaders/OBJLoader2.d.ts
examples/jsm/loaders/OBJLoader2.d.ts
+45
-0
examples/jsm/loaders/OBJLoader2.js
examples/jsm/loaders/OBJLoader2.js
+48
-2
examples/jsm/loaders/OBJLoader2Parallel.d.ts
examples/jsm/loaders/OBJLoader2Parallel.d.ts
+17
-0
examples/jsm/loaders/OBJLoader2Parallel.js
examples/jsm/loaders/OBJLoader2Parallel.js
+28
-4
examples/jsm/loaders/obj2/bridge/MtlObjBridge.d.ts
examples/jsm/loaders/obj2/bridge/MtlObjBridge.d.ts
+4
-0
examples/jsm/loaders/obj2/bridge/MtlObjBridge.js
examples/jsm/loaders/obj2/bridge/MtlObjBridge.js
+6
-2
examples/jsm/loaders/obj2/shared/MaterialHandler.d.ts
examples/jsm/loaders/obj2/shared/MaterialHandler.d.ts
+22
-0
examples/jsm/loaders/obj2/shared/MaterialHandler.js
examples/jsm/loaders/obj2/shared/MaterialHandler.js
+23
-2
examples/jsm/loaders/obj2/shared/MeshReceiver.d.ts
examples/jsm/loaders/obj2/shared/MeshReceiver.d.ts
+22
-0
examples/jsm/loaders/obj2/shared/MeshReceiver.js
examples/jsm/loaders/obj2/shared/MeshReceiver.js
+23
-6
examples/jsm/loaders/obj2/utils/CodeSerializer.d.ts
examples/jsm/loaders/obj2/utils/CodeSerializer.d.ts
+4
-0
examples/jsm/loaders/obj2/utils/CodeSerializer.js
examples/jsm/loaders/obj2/utils/CodeSerializer.js
+8
-3
examples/jsm/loaders/obj2/utils/ObjectManipulator.d.ts
examples/jsm/loaders/obj2/utils/ObjectManipulator.d.ts
+3
-0
examples/jsm/loaders/obj2/utils/ObjectManipulator.js
examples/jsm/loaders/obj2/utils/ObjectManipulator.js
+5
-1
examples/jsm/loaders/obj2/worker/main/WorkerExecutionSupport.js
...es/jsm/loaders/obj2/worker/main/WorkerExecutionSupport.js
+78
-5
examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.js
...ples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.js
+94
-20
examples/jsm/loaders/obj2/worker/parallel/WorkerRunner.js
examples/jsm/loaders/obj2/worker/parallel/WorkerRunner.js
+19
-4
未找到文件。
examples/jsm/loaders/OBJLoader2.d.ts
0 → 100644
浏览文件 @
90ee258d
import
{
LoadingManager
,
Group
}
from
'
../../../src/Three
'
;
import
{
MaterialHandler
}
from
'
./obj2/shared/MaterialHandler
'
;
import
{
MeshReceiver
}
from
'
./obj2/shared/MeshReceiver
'
;
export
class
OBJLoader2
{
constructor
(
manager
?:
LoadingManager
);
manager
:
LoadingManager
;
logging
:
{
enabled
:
boolean
;
debug
:
boolean
;
};
modelName
:
string
;
instanceNo
:
number
;
path
:
string
;
resourcePath
:
string
;
useIndices
:
boolean
;
disregardNormals
:
boolean
;
materialPerSmoothingGroup
:
boolean
;
useOAsMesh
:
boolean
;
baseObject3d
:
Group
;
callbacks
:
{
onParseProgress
:
Function
;
genericErrorHandler
:
Function
;
};
materialHandler
:
MaterialHandler
;
meshReceiver
:
MeshReceiver
;
addMaterials
(
materials
:
object
):
void
;
load
(
url
:
string
,
onLoad
:
(
group
:
Group
)
=>
void
,
onProgress
?:
(
event
:
ProgressEvent
)
=>
void
,
onError
?:
(
event
:
ErrorEvent
)
=>
void
,
onMeshAlter
?:
(
meshData
:
object
)
=>
void
):
void
;
parse
(
content
:
ArrayBuffer
|
string
):
void
;
setLogging
(
enabled
:
boolean
,
debug
:
boolean
):
this
;
setModelName
(
modelName
:
string
):
this
;
setPath
(
path
:
string
):
this
;
setResourcePath
(
path
:
string
):
this
;
setBaseObject3d
(
baseObject3d
:
Object3D
):
this
;
setUseIndices
(
useIndices
:
boolean
):
this
;
setDisregardNormals
(
disregardNormals
:
boolean
):
this
;
setMaterialPerSmoothingGroup
(
materialPerSmoothingGroup
:
boolean
):
this
;
setUseOAsMesh
(
useOAsMesh
:
boolean
):
this
;
setGenericErrorHandler
(
genericErrorHandler
:
Function
):
void
;
}
examples/jsm/loaders/OBJLoader2.js
浏览文件 @
90ee258d
...
...
@@ -20,6 +20,7 @@ import { MaterialHandler } from "./obj2/shared/MaterialHandler.js";
* @param {DefaultLoadingManager} [manager] The loadingManager for the loader to use. Default is {@link DefaultLoadingManager}
*/
const
OBJLoader2
=
function
(
manager
)
{
this
.
manager
=
(
manager
!==
undefined
&&
manager
!==
null
)
?
manager
:
DefaultLoadingManager
;
this
.
logging
=
{
enabled
:
true
,
...
...
@@ -43,6 +44,7 @@ const OBJLoader2 = function ( manager ) {
this
.
materialHandler
=
new
MaterialHandler
();
this
.
meshReceiver
=
new
MeshReceiver
(
this
.
materialHandler
);
};
OBJLoader2
.
OBJLOADER2_VERSION
=
'
3.0.0-beta2
'
;
console
.
info
(
'
Using OBJLoader2 version:
'
+
OBJLoader2
.
OBJLOADER2_VERSION
);
...
...
@@ -58,9 +60,11 @@ OBJLoader2.prototype = {
* @param {boolean} debug True or false.
*/
setLogging
:
function
(
enabled
,
debug
)
{
this
.
logging
.
enabled
=
enabled
===
true
;
this
.
logging
.
debug
=
debug
===
true
;
return
this
;
},
/**
...
...
@@ -69,8 +73,10 @@ OBJLoader2.prototype = {
* @param {string} modelName
*/
setModelName
:
function
(
modelName
)
{
this
.
modelName
=
modelName
?
modelName
:
this
.
modelName
;
return
this
;
},
/**
...
...
@@ -79,8 +85,10 @@ OBJLoader2.prototype = {
* @param {string} path URL
*/
setPath
:
function
(
path
)
{
this
.
path
=
path
?
path
:
this
.
path
;
return
this
;
},
...
...
@@ -89,7 +97,9 @@ OBJLoader2.prototype = {
* @param {string} resourcePath
*/
setResourcePath
:
function
(
resourcePath
)
{
this
.
resourcePath
=
resourcePath
?
resourcePath
:
this
.
resourcePath
;
},
/**
...
...
@@ -98,8 +108,10 @@ OBJLoader2.prototype = {
* @param {Object3D} baseObject3d Object already attached to scenegraph where new meshes will be attached to
*/
setBaseObject3d
:
function
(
baseObject3d
)
{
this
.
baseObject3d
=
(
baseObject3d
===
undefined
||
baseObject3d
===
null
)
?
this
.
baseObject3d
:
baseObject3d
;
return
this
;
},
/**
...
...
@@ -108,7 +120,9 @@ OBJLoader2.prototype = {
* @param materials Object with named {@link Material}
*/
addMaterials
:
function
(
materials
)
{
this
.
materialHandler
.
addMaterials
(
materials
);
},
/**
...
...
@@ -117,8 +131,10 @@ OBJLoader2.prototype = {
* @param {boolean} useIndices=false
*/
setUseIndices
:
function
(
useIndices
)
{
this
.
useIndices
=
useIndices
===
true
;
return
this
;
},
/**
...
...
@@ -127,8 +143,10 @@ OBJLoader2.prototype = {
* @param {boolean} disregardNormals=false
*/
setDisregardNormals
:
function
(
disregardNormals
)
{
this
.
disregardNormals
=
disregardNormals
===
true
;
return
this
;
},
/**
...
...
@@ -137,8 +155,10 @@ OBJLoader2.prototype = {
* @param {boolean} materialPerSmoothingGroup=false
*/
setMaterialPerSmoothingGroup
:
function
(
materialPerSmoothingGroup
)
{
this
.
materialPerSmoothingGroup
=
materialPerSmoothingGroup
===
true
;
return
this
;
},
/**
...
...
@@ -147,8 +167,10 @@ OBJLoader2.prototype = {
* @param {boolean} useOAsMesh=false
*/
setUseOAsMesh
:
function
(
useOAsMesh
)
{
this
.
useOAsMesh
=
useOAsMesh
===
true
;
return
this
;
},
/**
...
...
@@ -156,11 +178,13 @@ OBJLoader2.prototype = {
* @param {Function} genericErrorHandler
*/
setGenericErrorHandler
:
function
(
genericErrorHandler
)
{
if
(
genericErrorHandler
!==
undefined
&&
genericErrorHandler
!==
null
)
{
this
.
callbacks
.
genericErrorHandler
=
genericErrorHandler
;
}
},
/**
...
...
@@ -173,6 +197,7 @@ OBJLoader2.prototype = {
* @private
*/
_setCallbacks
:
function
(
onParseProgress
,
onMeshAlter
,
onLoadMaterials
)
{
if
(
onParseProgress
!==
undefined
&&
onParseProgress
!==
null
)
{
this
.
callbacks
.
onParseProgress
=
onParseProgress
;
...
...
@@ -180,6 +205,7 @@ OBJLoader2.prototype = {
}
this
.
meshReceiver
.
_setCallbacks
(
onParseProgress
,
onMeshAlter
);
this
.
materialHandler
.
_setCallbacks
(
onLoadMaterials
);
},
/**
...
...
@@ -191,6 +217,7 @@ OBJLoader2.prototype = {
* @param {number} numericalValue Numerical value describing the progress
*/
_onProgress
:
function
(
type
,
text
,
numericalValue
)
{
let
message
=
text
?
text
:
''
;
let
event
=
{
detail
:
{
...
...
@@ -211,6 +238,7 @@ OBJLoader2.prototype = {
console
.
log
(
message
);
}
},
/**
...
...
@@ -220,6 +248,7 @@ OBJLoader2.prototype = {
* @param {String} errorMessage The event containing the error
*/
_onError
:
function
(
errorMessage
)
{
if
(
this
.
callbacks
.
genericErrorHandler
)
{
this
.
callbacks
.
genericErrorHandler
(
errorMessage
);
...
...
@@ -243,6 +272,7 @@ OBJLoader2.prototype = {
* @param {function} [onMeshAlter] Called after worker successfully delivered a single mesh
*/
load
:
function
(
url
,
onLoad
,
onFileLoadProgress
,
onError
,
onMeshAlter
)
{
let
scope
=
this
;
if
(
onError
===
null
||
onError
===
undefined
)
{
...
...
@@ -279,27 +309,32 @@ OBJLoader2.prototype = {
let
numericalValueRef
=
0
;
let
numericalValue
=
0
;
onFileLoadProgress
=
function
(
event
)
{
if
(
!
event
.
lengthComputable
)
return
;
numericalValue
=
event
.
loaded
/
event
.
total
;
if
(
numericalValue
>
numericalValueRef
)
{
numericalValueRef
=
numericalValue
;
let
output
=
'
Download of "
'
+
url
+
'
":
'
+
(
numericalValue
*
100
).
toFixed
(
2
)
+
'
%
'
;
let
output
=
'
Download of "
'
+
url
+
'
":
'
+
(
numericalValue
*
100
).
toFixed
(
2
)
+
'
%
'
;
scope
.
_onProgress
(
'
progressLoad
'
,
output
,
numericalValue
);
}
};
}
this
.
_setCallbacks
(
null
,
onMeshAlter
,
null
);
let
fileLoaderOnLoad
=
function
(
content
)
{
onLoad
(
scope
.
parse
(
content
)
);
};
let
fileLoader
=
new
FileLoader
(
this
.
manager
);
fileLoader
.
setPath
(
this
.
path
||
this
.
resourcePath
);
fileLoader
.
setResponseType
(
'
arraybuffer
'
);
fileLoader
.
load
(
filename
,
fileLoaderOnLoad
,
onFileLoadProgress
,
onError
);
},
/**
...
...
@@ -308,6 +343,7 @@ OBJLoader2.prototype = {
* @param {arraybuffer|string} content OBJ data as Uint8Array or String
*/
parse
:
function
(
content
)
{
// fast-fail in case of illegal data
if
(
content
===
null
||
content
===
undefined
)
{
...
...
@@ -330,13 +366,19 @@ OBJLoader2.prototype = {
let
scope
=
this
;
let
scopedOnAssetAvailable
=
function
(
payload
)
{
scope
.
_onAssetAvailable
(
payload
);
};
let
onProgressScoped
=
function
(
text
,
numericalValue
)
{
scope
.
_onProgress
(
'
progressParse
'
,
text
,
numericalValue
);
};
let
onErrorScoped
=
function
(
message
)
{
scope
.
_onError
(
message
);
};
parser
.
setCallbackOnAssetAvailable
(
scopedOnAssetAvailable
);
parser
.
setCallbackOnProgress
(
onProgressScoped
);
...
...
@@ -346,7 +388,7 @@ OBJLoader2.prototype = {
if
(
this
.
logging
.
enabled
)
console
.
info
(
'
Parsing arrayBuffer...
'
);
parser
.
parse
(
content
);
}
else
if
(
typeof
(
content
)
===
'
string
'
||
content
instanceof
String
)
{
}
else
if
(
typeof
(
content
)
===
'
string
'
||
content
instanceof
String
)
{
if
(
this
.
logging
.
enabled
)
console
.
info
(
'
Parsing text...
'
);
parser
.
parseText
(
content
);
...
...
@@ -362,6 +404,7 @@ OBJLoader2.prototype = {
}
return
this
.
baseObject3d
;
},
_onAssetAvailable
:
function
(
payload
)
{
...
...
@@ -372,7 +415,9 @@ OBJLoader2.prototype = {
let
meshes
=
this
.
meshReceiver
.
buildMeshes
(
payload
);
for
(
let
mesh
of
meshes
)
{
this
.
baseObject3d
.
add
(
mesh
);
}
}
else
if
(
payload
.
type
===
'
material
'
)
{
...
...
@@ -380,6 +425,7 @@ OBJLoader2.prototype = {
this
.
materialHandler
.
addPayloadMaterials
(
payload
);
}
}
};
...
...
examples/jsm/loaders/OBJLoader2Parallel.d.ts
0 → 100644
浏览文件 @
90ee258d
import
{
LoadingManager
}
from
'
../../../src/Three
'
;
import
{
OBJLoader2
}
from
'
./OBJLoader2.js
'
;
export
class
OBJLoader2Parallel
extends
OBJLoader2
{
constructor
(
manager
?:
LoadingManager
);
preferJsmWorker
:
boolean
;
executeParallel
:
boolean
;
workerExecutionSupport
:
object
;
setPreferJsmWorker
(
preferJsmWorker
:
boolean
):
this
;
setCallbackOnParseComplete
(
onParseComplete
:
Function
):
this
;
setExecuteParallel
(
executeParallel
:
boolean
):
this
;
getWorkerExecutionSupport
():
object
;
buildWorkerCode
():
object
;
}
examples/jsm/loaders/OBJLoader2Parallel.js
浏览文件 @
90ee258d
...
...
@@ -27,12 +27,14 @@ import {
* @constructor
*/
const
OBJLoader2Parallel
=
function
(
manager
)
{
OBJLoader2
.
call
(
this
,
manager
);
this
.
preferJsmWorker
=
false
;
this
.
callbacks
.
onParseComplete
=
null
;
this
.
executeParallel
=
true
;
this
.
workerExecutionSupport
=
new
WorkerExecutionSupport
();
};
OBJLoader2Parallel
.
prototype
=
Object
.
create
(
OBJLoader2
.
prototype
);
OBJLoader2Parallel
.
prototype
.
constructor
=
OBJLoader2Parallel
;
...
...
@@ -42,8 +44,10 @@ console.info( 'Using OBJLoader2Parallel version: ' + OBJLoader2.OBJLOADER2_PARAL
OBJLoader2Parallel
.
prototype
.
setPreferJsmWorker
=
function
(
preferJsmWorker
)
{
this
.
preferJsmWorker
=
preferJsmWorker
===
true
;
return
this
;
};
/**
...
...
@@ -53,10 +57,14 @@ OBJLoader2Parallel.prototype.setPreferJsmWorker = function ( preferJsmWorker ) {
* @return {OBJLoader2Parallel}
*/
OBJLoader2Parallel
.
prototype
.
setCallbackOnParseComplete
=
function
(
onParseComplete
)
{
if
(
onParseComplete
!==
undefined
&&
onParseComplete
!==
null
)
{
this
.
callbacks
.
onParseComplete
=
onParseComplete
;
}
return
this
;
};
/**
...
...
@@ -66,8 +74,10 @@ OBJLoader2Parallel.prototype.setCallbackOnParseComplete = function ( onParseComp
* @return {OBJLoader2Parallel}
*/
OBJLoader2Parallel
.
prototype
.
setExecuteParallel
=
function
(
executeParallel
)
{
this
.
executeParallel
=
executeParallel
===
true
;
return
this
;
};
/**
...
...
@@ -76,7 +86,9 @@ OBJLoader2Parallel.prototype.setExecuteParallel = function ( executeParallel ) {
* @return {WorkerExecutionSupport|WorkerExecutionSupport}
*/
OBJLoader2Parallel
.
prototype
.
getWorkerExecutionSupport
=
function
()
{
return
this
.
workerExecutionSupport
;
};
/**
...
...
@@ -85,6 +97,7 @@ OBJLoader2Parallel.prototype.getWorkerExecutionSupport = function () {
* @return {CodeBuilderInstructions}
*/
OBJLoader2Parallel
.
prototype
.
buildWorkerCode
=
function
()
{
let
codeBuilderInstructions
=
new
CodeBuilderInstructions
(
true
,
true
,
this
.
preferJsmWorker
);
if
(
codeBuilderInstructions
.
isSupportsJsmWorker
()
)
{
...
...
@@ -104,19 +117,23 @@ OBJLoader2Parallel.prototype.buildWorkerCode = function () {
codeBuilderInstructions
.
addCodeFragment
(
codeWorkerRunner
);
// allows to include full libraries as importScripts
// codeBuilderInstructions.addLibraryImport( '../../node_modules/three/build/three.js' );
// codeBuilderInstructions.addLibraryImport( '../../node_modules/three/build/three.js' );
codeBuilderInstructions
.
addStartCode
(
'
new WorkerRunner( new DefaultWorkerPayloadHandler( new OBJLoader2Parser() ) );
'
);
}
return
codeBuilderInstructions
;
};
/**
* @private
*/
OBJLoader2Parallel
.
prototype
.
_configure
=
function
()
{
if
(
this
.
callbacks
.
onParseComplete
===
null
)
{
throw
"
No callbackOnLoad was provided! Aborting!
"
;
}
// check if worker is already available and if so, then fast-fail
if
(
this
.
workerExecutionSupport
.
isWorkerLoaded
(
this
.
preferJsmWorker
)
)
return
;
...
...
@@ -125,10 +142,13 @@ OBJLoader2Parallel.prototype._configure = function () {
let
scope
=
this
;
let
scopedOnAssetAvailable
=
function
(
payload
)
{
scope
.
_onAssetAvailable
(
payload
);
};
this
.
workerExecutionSupport
.
updateCallbacks
(
scopedOnAssetAvailable
,
this
.
callbacks
.
onParseComplete
);
};
/**
...
...
@@ -141,10 +161,12 @@ OBJLoader2Parallel.prototype._configure = function () {
* @param {function} [onError] A function to be called if an error occurs during loading. The function receives the error as an argument.
* @param {function} [onMeshAlter] Called after worker successfully delivered a single mesh
*/
OBJLoader2Parallel
.
prototype
.
load
=
function
(
content
,
onLoad
,
onFileLoadProgress
,
onError
,
onMeshAlter
)
{
OBJLoader2Parallel
.
prototype
.
load
=
function
(
content
,
onLoad
,
onFileLoadProgress
,
onError
,
onMeshAlter
)
{
this
.
setCallbackOnParseComplete
(
onLoad
);
OBJLoader2
.
prototype
.
load
.
call
(
this
,
content
,
function
()
{},
onFileLoadProgress
,
onError
,
onMeshAlter
);
};
/**
...
...
@@ -152,7 +174,8 @@ OBJLoader2Parallel.prototype.load = function( content, onLoad, onFileLoadProgres
*
* @param {arraybuffer} content OBJ data as Uint8Array or String
*/
OBJLoader2Parallel
.
prototype
.
parse
=
function
(
content
)
{
OBJLoader2Parallel
.
prototype
.
parse
=
function
(
content
)
{
if
(
this
.
executeParallel
)
{
this
.
_configure
();
...
...
@@ -183,6 +206,7 @@ OBJLoader2Parallel.prototype.parse = function( content ) {
this
.
callbacks
.
onParseComplete
(
OBJLoader2
.
prototype
.
parse
.
call
(
this
,
content
)
);
}
};
export
{
OBJLoader2Parallel
}
export
{
OBJLoader2Parallel
}
;
examples/jsm/loaders/obj2/bridge/MtlObjBridge.d.ts
0 → 100644
浏览文件 @
90ee258d
export
namespace
MtlObjBridge
{
export
function
link
(
processResult
:
object
,
assetLoader
:
object
):
void
;
export
function
addMaterialsFromMtlLoader
(
materialCreator
:
object
):
void
;
}
examples/jsm/loaders/obj2/bridge/MtlObjBridge.js
浏览文件 @
90ee258d
...
...
@@ -13,12 +13,14 @@ const MtlObjBridge = {
* @param processResult
* @param assetLoader
*/
link
:
function
(
processResult
,
assetLoader
)
{
link
:
function
(
processResult
,
assetLoader
)
{
if
(
typeof
assetLoader
.
addMaterials
===
'
function
'
)
{
assetLoader
.
addMaterials
(
this
.
addMaterialsFromMtlLoader
(
processResult
)
);
}
},
/**
...
...
@@ -27,6 +29,7 @@ const MtlObjBridge = {
* @param Instance of {@link MTLLoader.MaterialCreator}
*/
addMaterialsFromMtlLoader
:
function
(
materialCreator
)
{
let
newMaterials
=
{};
if
(
materialCreator
instanceof
MTLLoader
.
MaterialCreator
)
{
...
...
@@ -35,7 +38,8 @@ const MtlObjBridge = {
}
return
newMaterials
;
}
};
export
{
MtlObjBridge
}
export
{
MtlObjBridge
}
;
examples/jsm/loaders/obj2/shared/MaterialHandler.d.ts
0 → 100644
浏览文件 @
90ee258d
import
{
Material
}
from
'
../../../../../src/Three
'
;
export
class
MaterialHandler
{
constructor
();
logging
:
{
enabled
:
boolean
;
debug
:
boolean
;
};
callbacks
:
{
onLoadMaterials
:
Function
;
};
materials
:
object
;
addMaterials
(
materials
:
object
,
newMaterials
:
object
):
object
;
addPayloadMaterials
(
materialPayload
:
object
):
object
;
setLogging
(
enabled
:
boolean
,
debug
:
boolean
):
void
;
getMaterials
():
object
;
getMaterial
(
materialName
:
string
):
Material
;
getMaterialsJSON
():
object
;
}
examples/jsm/loaders/obj2/shared/MaterialHandler.js
浏览文件 @
90ee258d
...
...
@@ -13,6 +13,7 @@ import {
const
MaterialHandler
=
function
()
{
this
.
logging
=
{
enabled
:
true
,
debug
:
false
...
...
@@ -23,6 +24,7 @@ const MaterialHandler = function () {
};
this
.
materials
=
{};
this
.
_createDefaultMaterials
();
};
MaterialHandler
.
prototype
=
{
...
...
@@ -36,19 +38,24 @@ MaterialHandler.prototype = {
* @param {boolean} debug True or false.
*/
setLogging
:
function
(
enabled
,
debug
)
{
this
.
logging
.
enabled
=
enabled
===
true
;
this
.
logging
.
debug
=
debug
===
true
;
},
_setCallbacks
:
function
(
onLoadMaterials
)
{
if
(
onLoadMaterials
!==
undefined
&&
onLoadMaterials
!==
null
)
{
this
.
callbacks
.
onLoadMaterials
=
onLoadMaterials
;
}
},
_createDefaultMaterials
:
function
()
{
let
defaultMaterial
=
new
MeshStandardMaterial
(
{
color
:
0xDCF1FF
}
);
defaultMaterial
.
name
=
'
defaultMaterial
'
;
...
...
@@ -69,6 +76,7 @@ MaterialHandler.prototype = {
runtimeMaterials
[
defaultPointMaterial
.
name
]
=
defaultPointMaterial
;
this
.
addMaterials
(
runtimeMaterials
);
},
/**
...
...
@@ -78,6 +86,7 @@ MaterialHandler.prototype = {
* @returns {Object} Map of {@link Material}
*/
addPayloadMaterials
:
function
(
materialPayload
)
{
let
material
,
materialName
;
let
materialCloneInstructions
=
materialPayload
.
materials
.
materialCloneInstructions
;
let
newMaterials
=
{};
...
...
@@ -85,9 +94,10 @@ MaterialHandler.prototype = {
if
(
materialCloneInstructions
!==
undefined
&&
materialCloneInstructions
!==
null
)
{
let
materialNameOrg
=
materialCloneInstructions
.
materialNameOrg
;
materialNameOrg
=
(
materialNameOrg
!==
undefined
&&
materialNameOrg
!==
null
)
?
materialNameOrg
:
""
;
materialNameOrg
=
(
materialNameOrg
!==
undefined
&&
materialNameOrg
!==
null
)
?
materialNameOrg
:
""
;
let
materialOrg
=
this
.
materials
[
materialNameOrg
];
if
(
materialOrg
)
{
material
=
materialOrg
.
clone
();
materialName
=
materialCloneInstructions
.
materialName
;
...
...
@@ -111,6 +121,7 @@ MaterialHandler.prototype = {
console
.
info
(
'
Requested material "
'
+
materialNameOrg
+
'
" is not available!
'
);
}
}
let
materials
=
materialPayload
.
materials
.
serializedMaterials
;
...
...
@@ -137,6 +148,7 @@ MaterialHandler.prototype = {
newMaterials
=
this
.
addMaterials
(
materials
,
newMaterials
);
return
newMaterials
;
},
/**
...
...
@@ -146,6 +158,7 @@ MaterialHandler.prototype = {
* @param newMaterials [Object] with named {@link Material}
*/
addMaterials
:
function
(
materials
,
newMaterials
)
{
if
(
newMaterials
===
undefined
||
newMaterials
===
null
)
{
newMaterials
=
{};
...
...
@@ -165,6 +178,7 @@ MaterialHandler.prototype = {
}
return
newMaterials
;
},
/**
...
...
@@ -173,7 +187,9 @@ MaterialHandler.prototype = {
* @returns {Object} Map of {@link Material}
*/
getMaterials
:
function
()
{
return
this
.
materials
;
},
/**
...
...
@@ -182,7 +198,9 @@ MaterialHandler.prototype = {
* @returns {Material}
*/
getMaterial
:
function
(
materialName
)
{
return
this
.
materials
[
materialName
];
},
/**
...
...
@@ -191,17 +209,20 @@ MaterialHandler.prototype = {
* @returns {Object} Map of Materials in JSON representation
*/
getMaterialsJSON
:
function
()
{
let
materialsJSON
=
{};
let
material
;
for
(
let
materialName
in
this
.
materials
)
{
material
=
this
.
materials
[
materialName
];
materialsJSON
[
materialName
]
=
material
.
toJSON
();
}
return
materialsJSON
;
}
};
export
{
MaterialHandler
}
export
{
MaterialHandler
}
;
examples/jsm/loaders/obj2/shared/MeshReceiver.d.ts
0 → 100644
浏览文件 @
90ee258d
import
{
Mesh
}
from
'
../../../../../src/Three
'
;
import
{
MaterialHandler
}
from
'
./MaterialHandler
'
export
class
MeshReceiver
{
constructor
(
materialHandler
:
MaterialHandler
);
logging
:
{
enabled
:
boolean
;
debug
:
boolean
;
};
callbacks
:
{
onParseProgress
:
Function
;
onMeshAlter
:
Function
;
};
materialHandler
:
MaterialHandler
;
buildMeshes
(
meshPayload
:
object
):
Mesh
[];
setLogging
(
enabled
:
boolean
,
debug
:
boolean
):
void
;
}
examples/jsm/loaders/obj2/shared/MeshReceiver.js
浏览文件 @
90ee258d
...
...
@@ -17,7 +17,8 @@ import {
* @param {MaterialHandler} materialHandler
* @constructor
*/
const
MeshReceiver
=
function
(
materialHandler
)
{
const
MeshReceiver
=
function
(
materialHandler
)
{
this
.
logging
=
{
enabled
:
true
,
debug
:
false
...
...
@@ -28,6 +29,7 @@ const MeshReceiver = function( materialHandler ) {
onMeshAlter
:
null
};
this
.
materialHandler
=
materialHandler
;
};
MeshReceiver
.
prototype
=
{
...
...
@@ -41,8 +43,10 @@ MeshReceiver.prototype = {
* @param {boolean} debug True or false.
*/
setLogging
:
function
(
enabled
,
debug
)
{
this
.
logging
.
enabled
=
enabled
===
true
;
this
.
logging
.
debug
=
debug
===
true
;
},
/**
...
...
@@ -52,6 +56,7 @@ MeshReceiver.prototype = {
* @private
*/
_setCallbacks
:
function
(
onParseProgress
,
onMeshAlter
)
{
if
(
onParseProgress
!==
undefined
&&
onParseProgress
!==
null
)
{
this
.
callbacks
.
onParseProgress
=
onParseProgress
;
...
...
@@ -62,6 +67,7 @@ MeshReceiver.prototype = {
this
.
callbacks
.
onMeshAlter
=
onMeshAlter
;
}
},
/**
...
...
@@ -71,6 +77,7 @@ MeshReceiver.prototype = {
* @returns {Mesh[]} mesh Array of {@link Mesh}
*/
buildMeshes
:
function
(
meshPayload
)
{
let
meshName
=
meshPayload
.
params
.
meshName
;
let
bufferGeometry
=
new
BufferGeometry
();
...
...
@@ -80,7 +87,7 @@ MeshReceiver.prototype = {
bufferGeometry
.
setIndex
(
new
BufferAttribute
(
new
Uint32Array
(
meshPayload
.
buffers
.
indices
),
1
)
);
}
let
haveVertexColors
=
meshPayload
.
buffers
.
colors
!==
null
;
let
haveVertexColors
=
meshPayload
.
buffers
.
colors
!==
null
;
if
(
haveVertexColors
)
{
bufferGeometry
.
addAttribute
(
'
color
'
,
new
BufferAttribute
(
new
Float32Array
(
meshPayload
.
buffers
.
colors
),
3
)
);
...
...
@@ -95,7 +102,7 @@ MeshReceiver.prototype = {
bufferGeometry
.
computeVertexNormals
();
}
if
(
meshPayload
.
buffers
.
uvs
!==
null
)
{
if
(
meshPayload
.
buffers
.
uvs
!==
null
)
{
bufferGeometry
.
addAttribute
(
'
uv
'
,
new
BufferAttribute
(
new
Float32Array
(
meshPayload
.
buffers
.
uvs
),
2
)
);
...
...
@@ -155,6 +162,7 @@ MeshReceiver.prototype = {
}
}
);
}
// here LoadedMeshUserOverride is required to be provided by the callback used to alter the results
...
...
@@ -208,12 +216,12 @@ MeshReceiver.prototype = {
}
progressMessage
+=
'
: Adding mesh(es) (
'
+
meshNames
.
length
+
'
:
'
+
meshNames
+
'
) from input mesh:
'
+
meshName
;
progressMessage
+=
'
(
'
+
(
meshPayload
.
progress
.
numericalValue
*
100
).
toFixed
(
2
)
+
'
%)
'
;
progressMessage
+=
'
(
'
+
(
meshPayload
.
progress
.
numericalValue
*
100
).
toFixed
(
2
)
+
'
%)
'
;
}
else
{
progressMessage
+=
'
: Not adding mesh:
'
+
meshName
;
progressMessage
+=
'
(
'
+
(
meshPayload
.
progress
.
numericalValue
*
100
).
toFixed
(
2
)
+
'
%)
'
;
progressMessage
+=
'
(
'
+
(
meshPayload
.
progress
.
numericalValue
*
100
).
toFixed
(
2
)
+
'
%)
'
;
}
let
callbackOnParseProgress
=
this
.
callbacks
.
onParseProgress
;
...
...
@@ -224,6 +232,7 @@ MeshReceiver.prototype = {
}
return
meshes
;
}
};
...
...
@@ -235,10 +244,12 @@ MeshReceiver.prototype = {
* @param {boolean} disregardMesh=false Tell implementation to completely disregard this mesh
* @param {boolean} disregardMesh=false Tell implementation that mesh(es) have been altered or added
*/
const
LoadedMeshUserOverride
=
function
(
disregardMesh
,
alteredMesh
)
{
const
LoadedMeshUserOverride
=
function
(
disregardMesh
,
alteredMesh
)
{
this
.
disregardMesh
=
disregardMesh
===
true
;
this
.
alteredMesh
=
alteredMesh
===
true
;
this
.
meshes
=
[];
};
...
...
@@ -252,8 +263,10 @@ LoadedMeshUserOverride.prototype = {
* @param {Mesh} mesh
*/
addMesh
:
function
(
mesh
)
{
this
.
meshes
.
push
(
mesh
);
this
.
alteredMesh
=
true
;
},
/**
...
...
@@ -262,7 +275,9 @@ LoadedMeshUserOverride.prototype = {
* @returns {boolean}
*/
isDisregardMesh
:
function
()
{
return
this
.
disregardMesh
;
},
/**
...
...
@@ -271,7 +286,9 @@ LoadedMeshUserOverride.prototype = {
* @returns {boolean}
*/
providesAlteredMeshes
:
function
()
{
return
this
.
alteredMesh
;
}
};
...
...
examples/jsm/loaders/obj2/utils/CodeSerializer.d.ts
0 → 100644
浏览文件 @
90ee258d
export
namespace
CodeSerializer
{
export
function
serializeObject
(
fullName
:
string
,
object
:
object
):
string
;
export
function
serializeClass
(
fullName
:
string
,
object
:
object
,
constructorName
?:
string
,
basePrototypeName
?:
string
,
ignoreFunctions
?:
string
[],
includeFunctions
?:
string
[],
overrideFunctions
?:
string
[]):
string
;
}
examples/jsm/loaders/obj2/utils/CodeSerializer.js
浏览文件 @
90ee258d
...
...
@@ -12,12 +12,13 @@ const CodeSerializer = {
* @returns {string}
*/
serializeObject
:
function
(
fullName
,
object
)
{
let
objectString
=
fullName
+
'
= {
\n\n
'
;
let
part
;
for
(
let
name
in
object
)
{
part
=
object
[
name
];
if
(
typeof
(
part
)
===
'
string
'
||
part
instanceof
String
)
{
if
(
typeof
(
part
)
===
'
string
'
||
part
instanceof
String
)
{
part
=
part
.
replace
(
'
\n
'
,
'
\\
n
'
);
part
=
part
.
replace
(
'
\r
'
,
'
\\
r
'
);
...
...
@@ -42,6 +43,7 @@ const CodeSerializer = {
objectString
+=
'
}
\n\n
'
;
return
objectString
;
},
/**
...
...
@@ -53,6 +55,7 @@ const CodeSerializer = {
* @returns {string}
*/
serializeClass
:
function
(
fullName
,
object
,
constructorName
,
basePrototypeName
,
ignoreFunctions
,
includeFunctions
,
overrideFunctions
)
{
let
valueString
,
objectPart
,
constructorString
,
i
,
funcOverride
;
let
prototypeFunctions
=
[];
let
objectProperties
=
[];
...
...
@@ -90,6 +93,7 @@ const CodeSerializer = {
prototypeFunctions
.
push
(
'
\t
'
+
name
+
'
:
'
+
valueString
+
'
,
\n\n
'
);
}
}
}
...
...
@@ -119,7 +123,7 @@ const CodeSerializer = {
}
else
{
if
(
typeof
(
objectPart
)
===
'
string
'
||
objectPart
instanceof
String
)
{
if
(
typeof
(
objectPart
)
===
'
string
'
||
objectPart
instanceof
String
)
{
valueString
=
'
\
"
'
+
objectPart
.
toString
()
+
'
\
"
'
;
...
...
@@ -172,7 +176,8 @@ const CodeSerializer = {
objectString
+=
'
\n\n
'
;
return
objectString
;
},
};
export
{
CodeSerializer
}
export
{
CodeSerializer
}
;
examples/jsm/loaders/obj2/utils/ObjectManipulator.d.ts
0 → 100644
浏览文件 @
90ee258d
export
namespace
ObjectManipulator
{
export
function
applyProperties
(
objToAlter
:
object
,
params
:
object
,
forceCreation
:
boolean
):
void
;
}
examples/jsm/loaders/obj2/utils/ObjectManipulator.js
浏览文件 @
90ee258d
...
...
@@ -12,11 +12,13 @@ const ObjectManipulator = {
* @param {Object} params The parameter object
*/
applyProperties
:
function
(
objToAlter
,
params
,
forceCreation
)
{
// fast-fail
if
(
objToAlter
===
undefined
||
objToAlter
===
null
||
params
===
undefined
||
params
===
null
)
return
;
var
property
,
funcName
,
values
;
for
(
property
in
params
)
{
funcName
=
'
set
'
+
property
.
substring
(
0
,
1
).
toLocaleUpperCase
()
+
property
.
substring
(
1
);
values
=
params
[
property
];
...
...
@@ -29,8 +31,10 @@ const ObjectManipulator = {
objToAlter
[
property
]
=
values
;
}
}
}
};
export
{
ObjectManipulator
}
export
{
ObjectManipulator
}
;
examples/jsm/loaders/obj2/worker/main/WorkerExecutionSupport.js
浏览文件 @
90ee258d
...
...
@@ -11,6 +11,7 @@
* @constructor
*/
const
CodeBuilderInstructions
=
function
(
supportsStandardWorker
,
supportsJsmWorker
,
preferJsmWorker
)
{
this
.
supportsStandardWorker
=
supportsStandardWorker
;
this
.
supportsJsmWorker
=
supportsJsmWorker
;
this
.
preferJsmWorker
=
preferJsmWorker
;
...
...
@@ -20,6 +21,7 @@ const CodeBuilderInstructions = function ( supportsStandardWorker, supportsJsmWo
this
.
jsmWorkerFile
=
null
;
this
.
defaultGeometryType
=
0
;
};
CodeBuilderInstructions
.
prototype
=
{
...
...
@@ -27,15 +29,21 @@ CodeBuilderInstructions.prototype = {
constructor
:
CodeBuilderInstructions
,
isSupportsStandardWorker
:
function
()
{
return
this
.
supportsStandardWorker
;
},
isSupportsJsmWorker
:
function
()
{
return
this
.
supportsJsmWorker
;
},
isPreferJsmWorker
:
function
()
{
return
this
.
preferJsmWorker
;
},
/**
...
...
@@ -44,9 +52,13 @@ CodeBuilderInstructions.prototype = {
* @param {String} jsmWorkerFile
*/
setJsmWorkerFile
:
function
(
jsmWorkerFile
)
{
if
(
jsmWorkerFile
!==
undefined
&&
jsmWorkerFile
!==
null
)
{
this
.
jsmWorkerFile
=
jsmWorkerFile
;
}
},
/**
...
...
@@ -54,7 +66,9 @@ CodeBuilderInstructions.prototype = {
* @param {String} startCode
*/
addStartCode
:
function
(
startCode
)
{
this
.
startCode
=
startCode
;
},
/**
...
...
@@ -62,7 +76,9 @@ CodeBuilderInstructions.prototype = {
* @param {String} code
*/
addCodeFragment
:
function
(
code
)
{
this
.
codeFragments
.
push
(
code
);
},
/**
...
...
@@ -70,21 +86,29 @@ CodeBuilderInstructions.prototype = {
* @param {String} libraryPath
*/
addLibraryImport
:
function
(
libraryPath
)
{
let
libraryUrl
=
new
URL
(
libraryPath
,
window
.
location
.
href
).
href
;
let
code
=
'
importScripts( "
'
+
libraryUrl
+
'
" );
'
;
this
.
importStatements
.
push
(
code
);
},
getImportStatements
:
function
()
{
return
this
.
importStatements
;
},
getCodeFragments
:
function
()
{
return
this
.
codeFragments
;
},
getStartCode
:
function
()
{
return
this
.
startCode
;
}
};
...
...
@@ -94,12 +118,14 @@ CodeBuilderInstructions.prototype = {
* @class
*/
const
WorkerExecutionSupport
=
function
()
{
// check worker support first
if
(
window
.
Worker
===
undefined
)
throw
"
This browser does not support web workers!
"
;
if
(
window
.
Blob
===
undefined
)
throw
"
This browser does not support Blob!
"
;
if
(
typeof
window
.
URL
.
createObjectURL
!==
'
function
'
)
throw
"
This browser does not support Object creation from URL!
"
;
this
.
_reset
();
};
WorkerExecutionSupport
.
WORKER_SUPPORT_VERSION
=
'
3.0.0-beta2
'
;
console
.
info
(
'
Using WorkerSupport version:
'
+
WorkerExecutionSupport
.
WORKER_SUPPORT_VERSION
);
...
...
@@ -110,14 +136,17 @@ WorkerExecutionSupport.prototype = {
constructor
:
WorkerExecutionSupport
,
_reset
:
function
()
{
this
.
logging
=
{
enabled
:
true
,
debug
:
false
};
let
scope
=
this
;
let
scopeTerminate
=
function
(
)
{
let
scopeTerminate
=
function
(
)
{
scope
.
_terminate
();
};
this
.
worker
=
{
native
:
null
,
...
...
@@ -138,6 +167,7 @@ WorkerExecutionSupport.prototype = {
terminate
:
scopeTerminate
}
};
},
/**
...
...
@@ -147,10 +177,12 @@ WorkerExecutionSupport.prototype = {
* @param {boolean} debug True or false.
*/
setLogging
:
function
(
enabled
,
debug
)
{
this
.
logging
.
enabled
=
enabled
===
true
;
this
.
logging
.
debug
=
debug
===
true
;
this
.
worker
.
logging
=
enabled
===
true
;
return
this
;
},
/**
...
...
@@ -159,8 +191,10 @@ WorkerExecutionSupport.prototype = {
* @param {boolean} forceWorkerDataCopy True or false.
*/
setForceWorkerDataCopy
:
function
(
forceWorkerDataCopy
)
{
this
.
worker
.
forceWorkerDataCopy
=
forceWorkerDataCopy
===
true
;
return
this
;
},
/**
...
...
@@ -169,6 +203,7 @@ WorkerExecutionSupport.prototype = {
* @param {boolean} terminateWorkerOnLoad True or false.
*/
setTerminateWorkerOnLoad
:
function
(
terminateWorkerOnLoad
)
{
this
.
worker
.
terminateWorkerOnLoad
=
terminateWorkerOnLoad
===
true
;
if
(
this
.
worker
.
terminateWorkerOnLoad
&&
this
.
isWorkerLoaded
(
this
.
worker
.
jsmWorker
)
&&
this
.
worker
.
queuedMessage
===
null
&&
this
.
worker
.
started
)
{
...
...
@@ -182,6 +217,7 @@ WorkerExecutionSupport.prototype = {
}
return
this
;
},
/**
...
...
@@ -191,6 +227,7 @@ WorkerExecutionSupport.prototype = {
* @param {Function} [onLoad] The function that is called when parsing is complete.
*/
updateCallbacks
:
function
(
onAssetAvailable
,
onLoad
)
{
if
(
onAssetAvailable
!==
undefined
&&
onAssetAvailable
!==
null
)
{
this
.
worker
.
callbacks
.
onAssetAvailable
=
onAssetAvailable
;
...
...
@@ -202,14 +239,17 @@ WorkerExecutionSupport.prototype = {
}
this
.
_verifyCallbacks
();
},
_verifyCallbacks
:
function
()
{
if
(
this
.
worker
.
callbacks
.
onAssetAvailable
===
undefined
||
this
.
worker
.
callbacks
.
onAssetAvailable
===
null
)
{
throw
'
Unable to run as no "onAssetAvailable" callback is set.
'
;
}
},
/**
...
...
@@ -219,10 +259,13 @@ WorkerExecutionSupport.prototype = {
* @param {CodeBuilderInstructions} codeBuilderInstructions
*/
buildWorker
:
function
(
codeBuilderInstructions
)
{
let
jsmSuccess
=
false
;
if
(
codeBuilderInstructions
.
isSupportsJsmWorker
()
&&
codeBuilderInstructions
.
isPreferJsmWorker
()
)
{
jsmSuccess
=
this
.
_buildWorkerJsm
(
codeBuilderInstructions
);
}
if
(
!
jsmSuccess
&&
codeBuilderInstructions
.
isSupportsStandardWorker
()
)
{
...
...
@@ -230,6 +273,7 @@ WorkerExecutionSupport.prototype = {
this
.
_buildWorkerStandard
(
codeBuilderInstructions
);
}
},
/**
...
...
@@ -239,6 +283,7 @@ WorkerExecutionSupport.prototype = {
* @private
*/
_buildWorkerJsm
:
function
(
codeBuilderInstructions
)
{
let
jsmSuccess
=
true
;
let
timeLabel
=
'
buildWorkerJsm
'
;
let
workerAvailable
=
this
.
_buildWorkerCheckPreconditions
(
true
,
timeLabel
);
...
...
@@ -250,8 +295,7 @@ WorkerExecutionSupport.prototype = {
let
worker
=
new
Worker
(
workerFileUrl
,
{
type
:
"
module
"
}
);
this
.
_configureWorkerCommunication
(
worker
,
true
,
codeBuilderInstructions
.
defaultGeometryType
,
timeLabel
);
}
catch
(
e
)
{
}
catch
(
e
)
{
jsmSuccess
=
false
;
// Chrome throws this exception, but Firefox currently does not complain, but can't execute the worker afterwards
...
...
@@ -260,11 +304,13 @@ WorkerExecutionSupport.prototype = {
console
.
error
(
"
Modules are not supported in workers.
"
);
}
}
}
return
jsmSuccess
;
},
/**
...
...
@@ -279,17 +325,22 @@ WorkerExecutionSupport.prototype = {
* @private
*/
_buildWorkerStandard
:
function
(
codeBuilderInstructions
)
{
let
timeLabel
=
'
buildWorkerStandard
'
;
let
workerAvailable
=
this
.
_buildWorkerCheckPreconditions
(
false
,
timeLabel
);
if
(
!
workerAvailable
)
{
let
concatenateCode
=
''
;
codeBuilderInstructions
.
getImportStatements
().
forEach
(
function
(
element
)
{
concatenateCode
+=
element
+
'
\n
'
;
}
);
concatenateCode
+=
'
\n
'
;
codeBuilderInstructions
.
getCodeFragments
().
forEach
(
function
(
element
)
{
concatenateCode
+=
element
+
'
\n
'
;
}
);
concatenateCode
+=
'
\n
'
;
concatenateCode
+=
codeBuilderInstructions
.
getStartCode
();
...
...
@@ -300,15 +351,18 @@ WorkerExecutionSupport.prototype = {
this
.
_configureWorkerCommunication
(
worker
,
false
,
codeBuilderInstructions
.
defaultGeometryType
,
timeLabel
);
}
},
_buildWorkerCheckPreconditions
:
function
(
requireJsmWorker
,
timeLabel
)
{
let
workerAvailable
=
false
;
if
(
this
.
isWorkerLoaded
(
requireJsmWorker
)
)
{
workerAvailable
=
true
;
}
else
{
if
(
this
.
logging
.
enabled
)
{
console
.
info
(
'
WorkerExecutionSupport: Building
'
+
(
requireJsmWorker
?
'
jsm
'
:
'
standard
'
)
+
'
worker code...
'
);
...
...
@@ -318,20 +372,25 @@ WorkerExecutionSupport.prototype = {
}
return
workerAvailable
;
},
_configureWorkerCommunication
:
function
(
worker
,
haveJsmWorker
,
defaultGeometryType
,
timeLabel
)
{
this
.
worker
.
native
=
worker
;
this
.
worker
.
jsmWorker
=
haveJsmWorker
;
let
scope
=
this
;
let
scopedReceiveWorkerMessage
=
function
(
event
)
{
scope
.
_receiveWorkerMessage
(
event
);
};
this
.
worker
.
native
.
onmessage
=
scopedReceiveWorkerMessage
;
if
(
defaultGeometryType
!==
undefined
&&
defaultGeometryType
!==
null
)
{
this
.
worker
.
workerRunner
.
defaultGeometryType
=
defaultGeometryType
;
}
if
(
this
.
logging
.
enabled
)
{
...
...
@@ -339,6 +398,7 @@ WorkerExecutionSupport.prototype = {
console
.
timeEnd
(
timeLabel
);
}
},
/**
...
...
@@ -347,18 +407,22 @@ WorkerExecutionSupport.prototype = {
* @return {boolean|*}
*/
isWorkerLoaded
:
function
(
requireJsmWorker
)
{
return
this
.
worker
.
native
!==
null
&&
(
(
requireJsmWorker
&&
this
.
worker
.
jsmWorker
)
||
(
!
requireJsmWorker
&&
!
this
.
worker
.
jsmWorker
)
);
},
/**
* Executed in worker scope
*/
_receiveWorkerMessage
:
function
(
event
)
{
let
payload
=
event
.
data
;
let
workerRunnerName
=
this
.
worker
.
workerRunner
.
name
;
switch
(
payload
.
cmd
)
{
case
'
assetAvailable
'
:
this
.
worker
.
callbacks
.
onAssetAvailable
(
payload
);
break
;
...
...
@@ -401,6 +465,7 @@ WorkerExecutionSupport.prototype = {
break
;
}
},
/**
...
...
@@ -408,16 +473,19 @@ WorkerExecutionSupport.prototype = {
*
* @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes.
*/
executeParallel
:
function
(
payload
,
transferables
)
{
executeParallel
:
function
(
payload
,
transferables
)
{
payload
.
cmd
=
'
parse
'
;
payload
.
usesMeshDisassembler
=
this
.
worker
.
workerRunner
.
usesMeshDisassembler
;
payload
.
defaultGeometryType
=
this
.
worker
.
workerRunner
.
defaultGeometryType
;
if
(
!
this
.
_verifyWorkerIsAvailable
(
payload
,
transferables
)
)
return
;
this
.
_postMessage
();
},
_verifyWorkerIsAvailable
:
function
(
payload
,
transferables
)
{
this
.
_verifyCallbacks
();
let
ready
=
true
;
if
(
this
.
worker
.
queuedMessage
!==
null
)
{
...
...
@@ -435,9 +503,11 @@ WorkerExecutionSupport.prototype = {
}
return
ready
;
},
_postMessage
:
function
()
{
if
(
this
.
worker
.
queuedMessage
!==
null
)
{
if
(
this
.
worker
.
queuedMessage
.
payload
.
data
.
input
instanceof
ArrayBuffer
)
{
...
...
@@ -466,15 +536,18 @@ WorkerExecutionSupport.prototype = {
}
}
},
_terminate
:
function
()
{
this
.
worker
.
native
.
terminate
();
this
.
_reset
();
}
};
export
{
CodeBuilderInstructions
,
WorkerExecutionSupport
}
}
;
examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.js
浏览文件 @
90ee258d
...
...
@@ -6,7 +6,8 @@
* Parse OBJ data either from ArrayBuffer or string
* @class
*/
const
OBJLoader2Parser
=
function
()
{
const
OBJLoader2Parser
=
function
()
{
this
.
callbacks
=
{
onProgress
:
null
,
onAssetAvailable
:
null
,
...
...
@@ -64,6 +65,7 @@ const OBJLoader2Parser = function() {
enabled
:
true
,
debug
:
false
};
};
OBJLoader2Parser
.
prototype
=
{
...
...
@@ -71,6 +73,7 @@ OBJLoader2Parser.prototype = {
constructor
:
OBJLoader2Parser
,
resetRawMesh
:
function
()
{
// faces are stored according combined index of group, material and smoothingGroup (0 or not)
this
.
rawMesh
.
subGroups
=
[];
this
.
rawMesh
.
subGroupInUse
=
null
;
...
...
@@ -84,66 +87,88 @@ OBJLoader2Parser.prototype = {
this
.
rawMesh
.
counts
.
faceCount
=
0
;
this
.
rawMesh
.
counts
.
mtlCount
=
0
;
this
.
rawMesh
.
counts
.
smoothingGroupCount
=
0
;
},
setMaterialPerSmoothingGroup
:
function
(
materialPerSmoothingGroup
)
{
this
.
materialPerSmoothingGroup
=
materialPerSmoothingGroup
;
},
setUseOAsMesh
:
function
(
useOAsMesh
)
{
this
.
useOAsMesh
=
useOAsMesh
;
},
setUseIndices
:
function
(
useIndices
)
{
this
.
useIndices
=
useIndices
;
},
setDisregardNormals
:
function
(
disregardNormals
)
{
this
.
disregardNormals
=
disregardNormals
;
},
setMaterials
:
function
(
materials
)
{
if
(
materials
===
undefined
||
materials
===
null
)
return
;
for
(
let
materialName
in
materials
)
{
if
(
materials
.
hasOwnProperty
(
materialName
)
)
{
this
.
materials
[
materialName
]
=
materials
[
materialName
];
}
}
},
setCallbackOnAssetAvailable
:
function
(
onAssetAvailable
)
{
if
(
onAssetAvailable
!==
null
&&
onAssetAvailable
!==
undefined
)
{
this
.
callbacks
.
onAssetAvailable
=
onAssetAvailable
;
}
},
setCallbackOnProgress
:
function
(
onProgress
)
{
if
(
onProgress
!==
null
&&
onProgress
!==
undefined
)
{
this
.
callbacks
.
onProgress
=
onProgress
;
}
},
setCallbackOnError
:
function
(
onError
)
{
if
(
onError
!==
null
&&
onError
!==
undefined
)
{
this
.
callbacks
.
onError
=
onError
;
}
},
setLogging
:
function
(
enabled
,
debug
)
{
this
.
logging
.
enabled
=
enabled
===
true
;
this
.
logging
.
debug
=
debug
===
true
;
},
configure
:
function
()
{
if
(
this
.
callbacks
.
onAssetAvailable
===
null
)
{
let
errorMessage
=
'
Unable to run as no callback for building meshes is set.
'
;
...
...
@@ -154,6 +179,7 @@ OBJLoader2Parser.prototype = {
}
else
{
throw
errorMessage
;
}
}
...
...
@@ -161,7 +187,7 @@ OBJLoader2Parser.prototype = {
if
(
this
.
logging
.
enabled
)
{
let
matKeys
=
Object
.
keys
(
this
.
materials
);
let
matNames
=
(
matKeys
.
length
>
0
)
?
'
\n\t
materialNames:
\n\t\t
-
'
+
matKeys
.
join
(
'
\n\t\t
-
'
)
:
'
\n\t
materialNames: None
'
;
let
matNames
=
(
matKeys
.
length
>
0
)
?
'
\n\t
materialNames:
\n\t\t
-
'
+
matKeys
.
join
(
'
\n\t\t
-
'
)
:
'
\n\t
materialNames: None
'
;
let
printedConfig
=
'
OBJLoader.Parser configuration:
'
+
matNames
+
'
\n\t
materialPerSmoothingGroup:
'
+
this
.
materialPerSmoothingGroup
...
...
@@ -169,17 +195,24 @@ OBJLoader2Parser.prototype = {
+
'
\n\t
useIndices:
'
+
this
.
useIndices
+
'
\n\t
disregardNormals:
'
+
this
.
disregardNormals
;
if
(
this
.
callbacks
.
onProgress
!==
null
)
{
printedConfig
+=
'
\n\t
callbacks.onProgress:
'
+
this
.
callbacks
.
onProgress
.
name
;
}
if
(
this
.
callbacks
.
onAssetAvailable
!==
null
)
{
printedConfig
+=
'
\n\t
callbacks.onAssetAvailable:
'
+
this
.
callbacks
.
onAssetAvailable
.
name
;
}
if
(
this
.
callbacks
.
onError
!==
null
)
{
printedConfig
+=
'
\n\t
callbacks.onError:
'
+
this
.
callbacks
.
onError
.
name
;
}
console
.
info
(
printedConfig
);
}
},
/**
...
...
@@ -188,6 +221,7 @@ OBJLoader2Parser.prototype = {
* @param {Uint8Array} arrayBuffer OBJ data as Uint8Array
*/
parse
:
function
(
arrayBuffer
)
{
if
(
this
.
logging
.
enabled
)
console
.
time
(
'
OBJLoader.Parser.parse
'
);
this
.
configure
();
...
...
@@ -201,6 +235,7 @@ OBJLoader2Parser.prototype = {
code
=
arrayBufferView
[
i
];
switch
(
code
)
{
// space
case
32
:
if
(
word
.
length
>
0
)
buffer
[
bufferPointer
++
]
=
word
;
...
...
@@ -231,10 +266,13 @@ OBJLoader2Parser.prototype = {
default
:
word
+=
String
.
fromCharCode
(
code
);
break
;
}
}
this
.
finalizeParsing
();
if
(
this
.
logging
.
enabled
)
console
.
timeEnd
(
'
OBJLoader.Parser.parse
'
);
},
/**
...
...
@@ -243,6 +281,7 @@ OBJLoader2Parser.prototype = {
* @param {string} text OBJ data as string
*/
parseText
:
function
(
text
)
{
if
(
this
.
logging
.
enabled
)
console
.
time
(
'
OBJLoader.Parser.parseText
'
);
this
.
configure
();
this
.
legacyMode
=
true
;
...
...
@@ -255,6 +294,7 @@ OBJLoader2Parser.prototype = {
char
=
text
[
i
];
switch
(
char
)
{
case
'
'
:
if
(
word
.
length
>
0
)
buffer
[
bufferPointer
++
]
=
word
;
word
=
''
;
...
...
@@ -281,16 +321,21 @@ OBJLoader2Parser.prototype = {
default
:
word
+=
char
;
}
}
this
.
finalizeParsing
();
if
(
this
.
logging
.
enabled
)
console
.
timeEnd
(
'
OBJLoader.Parser.parseText
'
);
},
processLine
:
function
(
buffer
,
bufferPointer
,
slashesCount
)
{
if
(
bufferPointer
<
1
)
return
;
let
reconstructString
=
function
(
content
,
legacyMode
,
start
,
stop
)
{
let
line
=
''
;
if
(
stop
>
start
)
{
...
...
@@ -309,11 +354,13 @@ OBJLoader2Parser.prototype = {
}
return
line
;
};
let
bufferLength
,
length
,
i
,
lineDesignation
;
lineDesignation
=
buffer
[
0
];
lineDesignation
=
buffer
[
0
];
switch
(
lineDesignation
)
{
case
'
v
'
:
this
.
vertices
.
push
(
parseFloat
(
buffer
[
1
]
)
);
this
.
vertices
.
push
(
parseFloat
(
buffer
[
2
]
)
);
...
...
@@ -354,6 +401,7 @@ OBJLoader2Parser.prototype = {
}
// "f vertex/uv ..."
}
else
if
(
bufferLength
===
slashesCount
*
2
)
{
this
.
checkFaceType
(
1
);
...
...
@@ -366,6 +414,7 @@ OBJLoader2Parser.prototype = {
}
// "f vertex/uv/normal ..."
}
else
if
(
bufferLength
*
2
===
slashesCount
*
3
)
{
this
.
checkFaceType
(
2
);
...
...
@@ -378,6 +427,7 @@ OBJLoader2Parser.prototype = {
}
// "f vertex//normal ..."
}
else
{
this
.
checkFaceType
(
3
);
...
...
@@ -402,7 +452,7 @@ OBJLoader2Parser.prototype = {
}
else
{
this
.
checkFaceType
(
(
lineDesignation
===
'
l
'
)
?
5
:
6
);
this
.
checkFaceType
(
(
lineDesignation
===
'
l
'
)
?
5
:
6
);
for
(
i
=
1
,
length
=
bufferLength
+
1
;
i
<
length
;
i
++
)
this
.
buildFace
(
buffer
[
i
]
);
}
...
...
@@ -441,17 +491,22 @@ OBJLoader2Parser.prototype = {
default
:
break
;
}
},
pushSmoothingGroup
:
function
(
smoothingGroup
)
{
let
smoothingGroupInt
=
parseInt
(
smoothingGroup
);
if
(
isNaN
(
smoothingGroupInt
)
)
{
smoothingGroupInt
=
smoothingGroup
===
"
off
"
?
0
:
1
;
}
let
smoothCheck
=
this
.
rawMesh
.
smoothingGroup
.
normalized
;
this
.
rawMesh
.
smoothingGroup
.
normalized
=
this
.
rawMesh
.
smoothingGroup
.
splitMaterials
?
smoothingGroupInt
:
(
smoothingGroupInt
===
0
)
?
0
:
1
;
this
.
rawMesh
.
smoothingGroup
.
normalized
=
this
.
rawMesh
.
smoothingGroup
.
splitMaterials
?
smoothingGroupInt
:
(
smoothingGroupInt
===
0
)
?
0
:
1
;
this
.
rawMesh
.
smoothingGroup
.
real
=
smoothingGroupInt
;
if
(
smoothCheck
!==
smoothingGroupInt
)
{
...
...
@@ -460,6 +515,7 @@ OBJLoader2Parser.prototype = {
this
.
checkSubGroup
();
}
},
/**
...
...
@@ -473,6 +529,7 @@ OBJLoader2Parser.prototype = {
* faceType = 6: "p vertex ..."
*/
checkFaceType
:
function
(
faceType
)
{
if
(
this
.
rawMesh
.
faceType
!==
faceType
)
{
this
.
processCompletedMesh
();
...
...
@@ -480,9 +537,11 @@ OBJLoader2Parser.prototype = {
this
.
checkSubGroup
();
}
},
checkSubGroup
:
function
()
{
let
index
=
this
.
rawMesh
.
activeMtlName
+
'
|
'
+
this
.
rawMesh
.
smoothingGroup
.
normalized
;
this
.
rawMesh
.
subGroupInUse
=
this
.
rawMesh
.
subGroups
[
index
];
...
...
@@ -505,15 +564,17 @@ OBJLoader2Parser.prototype = {
this
.
rawMesh
.
subGroups
[
index
]
=
this
.
rawMesh
.
subGroupInUse
;
}
},
buildFace
:
function
(
faceIndexV
,
faceIndexU
,
faceIndexN
)
{
let
subGroupInUse
=
this
.
rawMesh
.
subGroupInUse
;
let
scope
=
this
;
let
updateSubGroupInUse
=
function
()
{
let
faceIndexVi
=
parseInt
(
faceIndexV
);
let
indexPointerV
=
3
*
(
faceIndexVi
>
0
?
faceIndexVi
-
1
:
faceIndexVi
+
scope
.
vertices
.
length
/
3
);
let
indexPointerV
=
3
*
(
faceIndexVi
>
0
?
faceIndexVi
-
1
:
faceIndexVi
+
scope
.
vertices
.
length
/
3
);
let
indexPointerC
=
scope
.
colors
.
length
>
0
?
indexPointerV
:
null
;
let
vertices
=
subGroupInUse
.
vertices
;
...
...
@@ -532,7 +593,7 @@ OBJLoader2Parser.prototype = {
if
(
faceIndexU
)
{
let
faceIndexUi
=
parseInt
(
faceIndexU
);
let
indexPointerU
=
2
*
(
faceIndexUi
>
0
?
faceIndexUi
-
1
:
faceIndexUi
+
scope
.
uvs
.
length
/
2
);
let
indexPointerU
=
2
*
(
faceIndexUi
>
0
?
faceIndexUi
-
1
:
faceIndexUi
+
scope
.
uvs
.
length
/
2
);
let
uvs
=
subGroupInUse
.
uvs
;
uvs
.
push
(
scope
.
uvs
[
indexPointerU
++
]
);
uvs
.
push
(
scope
.
uvs
[
indexPointerU
]
);
...
...
@@ -541,13 +602,14 @@ OBJLoader2Parser.prototype = {
if
(
faceIndexN
&&
!
scope
.
disregardNormals
)
{
let
faceIndexNi
=
parseInt
(
faceIndexN
);
let
indexPointerN
=
3
*
(
faceIndexNi
>
0
?
faceIndexNi
-
1
:
faceIndexNi
+
scope
.
normals
.
length
/
3
);
let
indexPointerN
=
3
*
(
faceIndexNi
>
0
?
faceIndexNi
-
1
:
faceIndexNi
+
scope
.
normals
.
length
/
3
);
let
normals
=
subGroupInUse
.
normals
;
normals
.
push
(
scope
.
normals
[
indexPointerN
++
]
);
normals
.
push
(
scope
.
normals
[
indexPointerN
++
]
);
normals
.
push
(
scope
.
normals
[
indexPointerN
]
);
}
};
if
(
this
.
useIndices
)
{
...
...
@@ -560,11 +622,11 @@ OBJLoader2Parser.prototype = {
indicesPointer
=
this
.
rawMesh
.
subGroupInUse
.
vertices
.
length
/
3
;
updateSubGroupInUse
();
subGroupInUse
.
indexMappings
[
mappingName
]
=
indicesPointer
;
subGroupInUse
.
indexMappingsCount
++
;
subGroupInUse
.
indexMappingsCount
++
;
}
else
{
this
.
rawMesh
.
counts
.
doubleIndicesCount
++
;
this
.
rawMesh
.
counts
.
doubleIndicesCount
++
;
}
subGroupInUse
.
indices
.
push
(
indicesPointer
);
...
...
@@ -575,9 +637,11 @@ OBJLoader2Parser.prototype = {
}
this
.
rawMesh
.
counts
.
faceCount
++
;
},
createRawMeshReport
:
function
(
inputObjectCount
)
{
return
'
Input Object number:
'
+
inputObjectCount
+
'
\n\t
Object name:
'
+
this
.
rawMesh
.
objectName
+
'
\n\t
Group name:
'
+
this
.
rawMesh
.
groupName
+
...
...
@@ -588,12 +652,14 @@ OBJLoader2Parser.prototype = {
'
\n\t
SmoothingGroup count:
'
+
this
.
rawMesh
.
counts
.
smoothingGroupCount
+
'
\n\t
Material count:
'
+
this
.
rawMesh
.
counts
.
mtlCount
+
'
\n\t
Real MeshOutputGroup count:
'
+
this
.
rawMesh
.
subGroups
.
length
;
},
/**
* Clear any empty subGroup and calculate absolute vertex, normal and uv counts
*/
finalizeRawMesh
:
function
()
{
let
meshOutputGroupTemp
=
[];
let
meshOutputGroup
;
let
absoluteVertexCount
=
0
;
...
...
@@ -611,7 +677,7 @@ OBJLoader2Parser.prototype = {
indices
=
meshOutputGroup
.
indices
;
if
(
indices
.
length
>
0
&&
absoluteIndexMappingsCount
>
0
)
{
for
(
let
i
=
0
;
i
<
indices
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
indices
.
length
;
i
++
)
{
indices
[
i
]
=
indices
[
i
]
+
absoluteIndexMappingsCount
;
...
...
@@ -627,6 +693,7 @@ OBJLoader2Parser.prototype = {
absoluteNormalCount
+=
meshOutputGroup
.
normals
.
length
;
}
}
// do not continue if no result
...
...
@@ -647,9 +714,11 @@ OBJLoader2Parser.prototype = {
}
return
result
;
},
processCompletedMesh
:
function
()
{
let
result
=
this
.
finalizeRawMesh
();
let
haveMesh
=
result
!==
null
;
if
(
haveMesh
)
{
...
...
@@ -671,13 +740,14 @@ OBJLoader2Parser.prototype = {
if
(
this
.
callbacks
.
onProgress
!==
null
)
{
this
.
callbacks
.
onProgress
(
'
Completed [o:
'
+
this
.
rawMesh
.
objectName
+
'
g:
'
+
this
.
rawMesh
.
groupName
+
''
+
'
] Total progress:
'
+
(
progressBytesPercent
*
100
).
toFixed
(
2
)
+
'
%
'
,
progressBytesPercent
);
'
] Total progress:
'
+
(
progressBytesPercent
*
100
).
toFixed
(
2
)
+
'
%
'
,
progressBytesPercent
);
}
this
.
resetRawMesh
();
}
return
haveMesh
;
},
/**
...
...
@@ -687,22 +757,23 @@ OBJLoader2Parser.prototype = {
* @param result
*/
buildMesh
:
function
(
result
)
{
let
meshOutputGroups
=
result
.
subGroups
;
let
vertexFA
=
new
Float32Array
(
result
.
absoluteVertexCount
);
this
.
globalCounts
.
vertices
+=
result
.
absoluteVertexCount
/
3
;
this
.
globalCounts
.
faces
+=
result
.
faceCount
;
this
.
globalCounts
.
doubleIndicesCount
+=
result
.
doubleIndicesCount
;
let
indexUA
=
(
result
.
absoluteIndexCount
>
0
)
?
new
Uint32Array
(
result
.
absoluteIndexCount
)
:
null
;
let
colorFA
=
(
result
.
absoluteColorCount
>
0
)
?
new
Float32Array
(
result
.
absoluteColorCount
)
:
null
;
let
normalFA
=
(
result
.
absoluteNormalCount
>
0
)
?
new
Float32Array
(
result
.
absoluteNormalCount
)
:
null
;
let
uvFA
=
(
result
.
absoluteUvCount
>
0
)
?
new
Float32Array
(
result
.
absoluteUvCount
)
:
null
;
let
indexUA
=
(
result
.
absoluteIndexCount
>
0
)
?
new
Uint32Array
(
result
.
absoluteIndexCount
)
:
null
;
let
colorFA
=
(
result
.
absoluteColorCount
>
0
)
?
new
Float32Array
(
result
.
absoluteColorCount
)
:
null
;
let
normalFA
=
(
result
.
absoluteNormalCount
>
0
)
?
new
Float32Array
(
result
.
absoluteNormalCount
)
:
null
;
let
uvFA
=
(
result
.
absoluteUvCount
>
0
)
?
new
Float32Array
(
result
.
absoluteUvCount
)
:
null
;
let
haveVertexColors
=
colorFA
!==
null
;
let
meshOutputGroup
;
let
materialNames
=
[];
let
createMultiMaterial
=
(
meshOutputGroups
.
length
>
1
);
let
createMultiMaterial
=
(
meshOutputGroups
.
length
>
1
);
let
materialIndex
=
0
;
let
materialIndexMapping
=
[];
let
selectedMaterialIndex
;
...
...
@@ -727,7 +798,7 @@ OBJLoader2Parser.prototype = {
materialNameOrg
=
meshOutputGroup
.
materialName
;
if
(
this
.
rawMesh
.
faceType
<
4
)
{
materialName
=
materialNameOrg
+
(
haveVertexColors
?
'
_vertexColor
'
:
''
)
+
(
meshOutputGroup
.
smoothingGroup
===
0
?
'
_flat
'
:
''
);
materialName
=
materialNameOrg
+
(
haveVertexColors
?
'
_vertexColor
'
:
''
)
+
(
meshOutputGroup
.
smoothingGroup
===
0
?
'
_flat
'
:
''
);
}
else
{
...
...
@@ -883,17 +954,19 @@ OBJLoader2Parser.prototype = {
uvs
:
uvFA
},
// 0: mesh, 1: line, 2: point
geometryType
:
this
.
rawMesh
.
faceType
<
4
?
0
:
(
this
.
rawMesh
.
faceType
===
6
)
?
2
:
1
geometryType
:
this
.
rawMesh
.
faceType
<
4
?
0
:
(
this
.
rawMesh
.
faceType
===
6
)
?
2
:
1
},
[
vertexFA
.
buffer
],
indexUA
!==
null
?
[
indexUA
.
buffer
]
:
null
,
indexUA
!==
null
?
[
indexUA
.
buffer
]
:
null
,
colorFA
!==
null
?
[
colorFA
.
buffer
]
:
null
,
normalFA
!==
null
?
[
normalFA
.
buffer
]
:
null
,
uvFA
!==
null
?
[
uvFA
.
buffer
]
:
null
);
},
finalizeParsing
:
function
()
{
if
(
this
.
logging
.
enabled
)
console
.
info
(
'
Global output object count:
'
+
this
.
outputObjectCount
);
if
(
this
.
processCompletedMesh
()
&&
this
.
logging
.
enabled
)
{
...
...
@@ -904,6 +977,7 @@ OBJLoader2Parser.prototype = {
console
.
info
(
parserFinalReport
);
}
}
};
...
...
examples/jsm/loaders/obj2/worker/parallel/WorkerRunner.js
浏览文件 @
90ee258d
...
...
@@ -5,11 +5,13 @@
import
{
ObjectManipulator
}
from
"
../../utils/ObjectManipulator.js
"
;
const
DefaultWorkerPayloadHandler
=
function
(
parser
)
{
this
.
parser
=
parser
;
this
.
logging
=
{
enabled
:
false
,
debug
:
false
};
};
DefaultWorkerPayloadHandler
.
prototype
=
{
...
...
@@ -17,19 +19,26 @@ DefaultWorkerPayloadHandler.prototype = {
constructor
:
DefaultWorkerPayloadHandler
,
handlePayload
:
function
(
payload
)
{
if
(
payload
.
logging
)
{
this
.
logging
.
enabled
=
payload
.
logging
.
enabled
===
true
;
this
.
logging
.
debug
=
payload
.
logging
.
debug
===
true
;
}
if
(
payload
.
cmd
===
'
parse
'
)
{
let
scope
=
this
;
let
callbacks
=
{
callbackOnAssetAvailable
:
function
(
payload
)
{
self
.
postMessage
(
payload
);
},
callbackOnProgress
:
function
(
text
)
{
if
(
scope
.
logging
.
enabled
&&
scope
.
logging
.
debug
)
console
.
debug
(
'
WorkerRunner: progress:
'
+
text
);
}
};
...
...
@@ -44,7 +53,7 @@ DefaultWorkerPayloadHandler.prototype = {
ObjectManipulator
.
applyProperties
(
parser
,
callbacks
);
let
arraybuffer
;
if
(
payload
.
params
&&
payload
.
params
.
index
!==
undefined
&&
payload
.
params
.
index
!==
null
)
{
if
(
payload
.
params
&&
payload
.
params
.
index
!==
undefined
&&
payload
.
params
.
index
!==
null
)
{
arraybuffer
=
this
.
resourceDescriptors
[
payload
.
params
.
index
].
content
;
...
...
@@ -62,7 +71,7 @@ DefaultWorkerPayloadHandler.prototype = {
}
else
{
parser
[
parseFunctionName
]
(
arraybuffer
,
payload
.
data
.
options
);
parser
[
parseFunctionName
](
arraybuffer
,
payload
.
data
.
options
);
}
if
(
this
.
logging
.
enabled
)
console
.
log
(
'
WorkerRunner: Run complete!
'
);
...
...
@@ -87,14 +96,18 @@ DefaultWorkerPayloadHandler.prototype = {
* @constructor
*/
const
WorkerRunner
=
function
(
payloadHandler
)
{
this
.
resourceDescriptors
=
[];
this
.
payloadHandler
=
payloadHandler
;
let
scope
=
this
;
let
scopedRunner
=
function
(
event
)
{
let
scopedRunner
=
function
(
event
)
{
scope
.
processMessage
(
event
.
data
);
};
self
.
addEventListener
(
'
message
'
,
scopedRunner
,
false
);
};
WorkerRunner
.
prototype
=
{
...
...
@@ -107,6 +120,7 @@ WorkerRunner.prototype = {
* @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes.
*/
processMessage
:
function
(
payload
)
{
if
(
payload
.
data
.
resourceDescriptors
&&
this
.
resourceDescriptors
.
length
===
0
)
{
for
(
let
name
in
payload
.
data
.
resourceDescriptors
)
{
...
...
@@ -118,6 +132,7 @@ WorkerRunner.prototype = {
}
this
.
payloadHandler
.
handlePayload
(
payload
);
}
};
...
...
@@ -125,4 +140,4 @@ WorkerRunner.prototype = {
export
{
WorkerRunner
,
DefaultWorkerPayloadHandler
}
}
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录