Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
693a36f5
T
three.js
项目概览
Ablesons
/
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,发现更多精彩内容 >>
提交
693a36f5
编写于
4月 05, 2011
作者:
A
alteredq
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Moved scene loader from SceneUtils into SceneLoader.
上级
55a3d829
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
498 addition
and
569 deletion
+498
-569
build/Three.js
build/Three.js
+16
-15
build/custom/ThreeExtras.js
build/custom/ThreeExtras.js
+19
-19
examples/webgl_scene_test.html
examples/webgl_scene_test.html
+3
-1
examples/webgl_scene_test_blender.html
examples/webgl_scene_test_blender.html
+4
-89
src/extras/SceneUtils.js
src/extras/SceneUtils.js
+0
-445
src/extras/io/SceneLoader.js
src/extras/io/SceneLoader.js
+455
-0
utils/build.py
utils/build.py
+1
-0
未找到文件。
build/Three.js
浏览文件 @
693a36f5
此差异已折叠。
点击以展开。
build/custom/ThreeExtras.js
浏览文件 @
693a36f5
此差异已折叠。
点击以展开。
examples/webgl_scene_test.html
浏览文件 @
693a36f5
...
...
@@ -304,7 +304,9 @@
}
$
(
"
progress
"
).
style
.
display
=
"
block
"
;
SceneUtils
.
loadScene
(
"
scenes/test_scene.js
"
,
callback_sync
,
callback_async
,
callback_progress
);
var
loader
=
new
THREE
.
SceneLoader
();
loader
.
load
(
"
scenes/test_scene.js
"
,
callback_sync
,
callback_async
,
callback_progress
);
$
(
"
plus_exp
"
).
addEventListener
(
'
click
'
,
createToggle
(
"
exp
"
),
false
);
...
...
examples/webgl_scene_test_blender.html
浏览文件 @
693a36f5
...
...
@@ -148,95 +148,8 @@
</div>
<pre
id=
"log"
></pre>
<!--
<script
type=
"text/javascript"
src=
"../build/Three.js"
></script>
-->
<script
type=
"text/javascript"
src=
"../src/Three.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Color.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Vector2.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Vector3.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Vector4.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Ray.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Rectangle.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Matrix3.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Matrix4.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Object3D.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Quaternion.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Vertex.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Face3.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Face4.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/UV.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Geometry.js"
></script>
<script
type=
"text/javascript"
src=
"../src/core/Spline.js"
></script>
<script
type=
"text/javascript"
src=
"../src/animation/AnimationHandler.js"
></script>
<script
type=
"text/javascript"
src=
"../src/animation/Animation.js"
></script>
<script
type=
"text/javascript"
src=
"../src/cameras/Camera.js"
></script>
<script
type=
"text/javascript"
src=
"../src/lights/Light.js"
></script>
<script
type=
"text/javascript"
src=
"../src/lights/AmbientLight.js"
></script>
<script
type=
"text/javascript"
src=
"../src/lights/DirectionalLight.js"
></script>
<script
type=
"text/javascript"
src=
"../src/lights/PointLight.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/Material.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/Mappings.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/LineBasicMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshBasicMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshLambertMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshPhongMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshDepthMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshNormalMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshFaceMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/MeshShaderMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/ShadowVolumeDynamicMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/ParticleBasicMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/ParticleCanvasMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/ParticleDOMMaterial.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/Texture.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/RenderTarget.js"
></script>
<script
type=
"text/javascript"
src=
"../src/materials/Uniforms.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Particle.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/ParticleSystem.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Line.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Mesh.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Bone.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/SkinnedMesh.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Ribbon.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/Sound.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/LOD.js"
></script>
<script
type=
"text/javascript"
src=
"../src/objects/ShadowVolume.js"
></script>
<script
type=
"text/javascript"
src=
"../src/scenes/Scene.js"
></script>
<script
type=
"text/javascript"
src=
"../src/scenes/Fog.js"
></script>
<script
type=
"text/javascript"
src=
"../src/scenes/FogExp2.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/Projector.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/DOMRenderer.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/CanvasRenderer.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/SVGRenderer.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/WebGLShaders.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/WebGLRenderer.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/SoundRenderer.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableVertex.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableFace3.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableFace4.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableObject.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableParticle.js"
></script>
<script
type=
"text/javascript"
src=
"../src/renderers/renderables/RenderableLine.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/GeometryUtils.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/ImageUtils.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/SceneUtils.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/ShaderUtils.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/cameras/QuakeCamera.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/cameras/PathCamera.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Cube.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Cylinder.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Icosahedron.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Lathe.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Plane.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Sphere.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/Torus.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/geometries/TorusKnot.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/io/Loader.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/io/JSONLoader.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/io/BinaryLoader.js"
></script>
<script
type=
"text/javascript"
src=
"../src/extras/objects/MarchingCubes.js"
></script>
<script
type=
"text/javascript"
src=
"js/Detector.js"
></script>
<script
type=
"text/javascript"
src=
"js/RequestAnimationFrame.js"
></script>
...
...
@@ -380,7 +293,9 @@
}
$
(
"
progress
"
).
style
.
display
=
"
block
"
;
SceneUtils
.
loadScene
(
"
obj/blenderscene/scene.js
"
,
callback_sync
,
callback_async
,
callback_progress
);
var
loader
=
new
THREE
.
SceneLoader
();
loader
.
load
(
"
obj/blenderscene/scene.js
"
,
callback_sync
,
callback_async
,
callback_progress
);
$
(
"
plus_exp
"
).
addEventListener
(
'
click
'
,
createToggle
(
"
exp
"
),
false
);
...
...
src/extras/SceneUtils.js
浏览文件 @
693a36f5
...
...
@@ -4,451 +4,6 @@
var
SceneUtils
=
{
loadScene
:
function
(
url
,
callback_sync
,
callback_async
,
callback_progress
)
{
var
worker
=
new
Worker
(
url
);
worker
.
postMessage
(
0
);
var
urlBase
=
THREE
.
Loader
.
prototype
.
extractUrlbase
(
url
);
worker
.
onmessage
=
function
(
event
)
{
var
dg
,
dm
,
dd
,
dl
,
dc
,
df
,
dt
,
g
,
o
,
m
,
l
,
p
,
c
,
t
,
f
,
tt
,
pp
,
geometry
,
material
,
camera
,
fog
,
texture
,
images
,
materials
,
data
,
binLoader
,
jsonLoader
,
counter_models
,
counter_textures
,
total_models
,
total_textures
,
result
;
data
=
event
.
data
;
binLoader
=
new
THREE
.
BinaryLoader
();
jsonLoader
=
new
THREE
.
JSONLoader
();
counter_models
=
0
;
counter_textures
=
0
;
result
=
{
scene
:
new
THREE
.
Scene
(),
geometries
:
{},
materials
:
{},
textures
:
{},
objects
:
{},
cameras
:
{},
lights
:
{},
fogs
:
{}
};
function
get_url
(
source_url
,
url_type
)
{
if
(
url_type
==
"
relativeToHTML
"
)
{
return
source_url
;
}
else
{
return
urlBase
+
"
/
"
+
source_url
;
}
};
function
handle_objects
()
{
for
(
dd
in
data
.
objects
)
{
if
(
!
result
.
objects
[
dd
]
)
{
o
=
data
.
objects
[
dd
];
geometry
=
result
.
geometries
[
o
.
geometry
];
if
(
geometry
)
{
materials
=
[];
for
(
i
=
0
;
i
<
o
.
materials
.
length
;
i
++
)
{
materials
[
i
]
=
result
.
materials
[
o
.
materials
[
i
]
];
}
p
=
o
.
position
;
r
=
o
.
rotation
;
q
=
o
.
quaternion
;
s
=
o
.
scale
;
// turn off quaternions, for the moment
q
=
0
;
if
(
materials
.
length
==
0
)
{
materials
[
0
]
=
new
THREE
.
MeshFaceMaterial
();
}
object
=
new
THREE
.
Mesh
(
geometry
,
materials
);
object
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
if
(
q
)
{
object
.
quaternion
.
set
(
q
[
0
],
q
[
1
],
q
[
2
],
q
[
3
]
);
object
.
useQuaternion
=
true
;
}
else
{
object
.
rotation
.
set
(
r
[
0
],
r
[
1
],
r
[
2
]
);
}
object
.
scale
.
set
(
s
[
0
],
s
[
1
],
s
[
2
]
);
object
.
visible
=
o
.
visible
;
result
.
scene
.
addObject
(
object
);
result
.
objects
[
dd
]
=
object
;
}
}
}
};
function
handle_mesh
(
geo
,
id
)
{
result
.
geometries
[
id
]
=
geo
;
handle_objects
();
};
function
create_callback
(
id
)
{
return
function
(
geo
)
{
handle_mesh
(
geo
,
id
);
counter_models
-=
1
;
async_callback_gate
();
}
};
function
async_callback_gate
()
{
var
progress
=
{
total_models
:
total_models
,
total_textures
:
total_textures
,
loaded_models
:
total_models
-
counter_models
,
loaded_textures
:
total_textures
-
counter_textures
};
callback_progress
(
progress
,
result
);
if
(
counter_models
==
0
&&
counter_textures
==
0
)
{
callback_async
(
result
);
}
};
var
callback_texture
=
function
(
images
)
{
counter_textures
-=
1
;
async_callback_gate
();
};
// first go synchronous elements
// cameras
for
(
dc
in
data
.
cameras
)
{
c
=
data
.
cameras
[
dc
];
if
(
c
.
type
==
"
perspective
"
)
{
camera
=
new
THREE
.
Camera
(
c
.
fov
,
c
.
aspect
,
c
.
near
,
c
.
far
);
}
else
if
(
c
.
type
==
"
ortho
"
)
{
camera
=
new
THREE
.
Camera
();
camera
.
projectionMatrix
=
THREE
.
Matrix4
.
makeOrtho
(
c
.
left
,
c
.
right
,
c
.
top
,
c
.
bottom
,
c
.
near
,
c
.
far
);
}
p
=
c
.
position
;
t
=
c
.
target
;
camera
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
camera
.
target
.
position
.
set
(
t
[
0
],
t
[
1
],
t
[
2
]
);
result
.
cameras
[
dc
]
=
camera
;
}
// lights
var
hex
,
intensity
;
for
(
dl
in
data
.
lights
)
{
l
=
data
.
lights
[
dl
];
hex
=
(
l
.
color
!==
undefined
)
?
l
.
color
:
0xffffff
;
intensity
=
(
l
.
intensity
!==
undefined
)
?
l
.
intensity
:
1
;
if
(
l
.
type
==
"
directional
"
)
{
p
=
l
.
direction
;
light
=
new
THREE
.
DirectionalLight
(
hex
,
intensity
);
light
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
light
.
position
.
normalize
();
}
else
if
(
l
.
type
==
"
point
"
)
{
p
=
l
.
position
;
light
=
new
THREE
.
PointLight
(
hex
,
intensity
);
light
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
}
result
.
scene
.
addLight
(
light
);
result
.
lights
[
dl
]
=
light
;
}
// fogs
for
(
df
in
data
.
fogs
)
{
f
=
data
.
fogs
[
df
];
if
(
f
.
type
==
"
linear
"
)
{
fog
=
new
THREE
.
Fog
(
0x000000
,
f
.
near
,
f
.
far
);
}
else
if
(
f
.
type
==
"
exp2
"
)
{
fog
=
new
THREE
.
FogExp2
(
0x000000
,
f
.
density
);
}
c
=
f
.
color
;
fog
.
color
.
setRGB
(
c
[
0
],
c
[
1
],
c
[
2
]
);
result
.
fogs
[
df
]
=
fog
;
}
// defaults
if
(
result
.
cameras
&&
data
.
defaults
.
camera
)
{
result
.
currentCamera
=
result
.
cameras
[
data
.
defaults
.
camera
];
}
if
(
result
.
fogs
&&
data
.
defaults
.
fog
)
{
result
.
scene
.
fog
=
result
.
fogs
[
data
.
defaults
.
fog
];
}
c
=
data
.
defaults
.
bgcolor
;
result
.
bgColor
=
new
THREE
.
Color
();
result
.
bgColor
.
setRGB
(
c
[
0
],
c
[
1
],
c
[
2
]
);
result
.
bgColorAlpha
=
data
.
defaults
.
bgalpha
;
// now come potentially asynchronous elements
// geometries
// count how many models will be loaded asynchronously
for
(
dg
in
data
.
geometries
)
{
g
=
data
.
geometries
[
dg
];
if
(
g
.
type
==
"
bin_mesh
"
||
g
.
type
==
"
ascii_mesh
"
)
{
counter_models
+=
1
;
}
}
total_models
=
counter_models
;
for
(
dg
in
data
.
geometries
)
{
g
=
data
.
geometries
[
dg
];
if
(
g
.
type
==
"
cube
"
)
{
geometry
=
new
Cube
(
g
.
width
,
g
.
height
,
g
.
depth
,
g
.
segmentsWidth
,
g
.
segmentsHeight
,
g
.
segmentsDepth
,
null
,
g
.
flipped
,
g
.
sides
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
plane
"
)
{
geometry
=
new
Plane
(
g
.
width
,
g
.
height
,
g
.
segmentsWidth
,
g
.
segmentsHeight
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
sphere
"
)
{
geometry
=
new
Sphere
(
g
.
radius
,
g
.
segmentsWidth
,
g
.
segmentsHeight
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
cylinder
"
)
{
geometry
=
new
Cylinder
(
g
.
numSegs
,
g
.
topRad
,
g
.
botRad
,
g
.
height
,
g
.
topOffset
,
g
.
botOffset
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
torus
"
)
{
geometry
=
new
Torus
(
g
.
radius
,
g
.
tube
,
g
.
segmentsR
,
g
.
segmentsT
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
icosahedron
"
)
{
geometry
=
new
Icosahedron
(
g
.
subdivisions
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
bin_mesh
"
)
{
binLoader
.
load
(
{
model
:
get_url
(
g
.
url
,
data
.
urlBaseType
),
callback
:
create_callback
(
dg
)
}
);
}
else
if
(
g
.
type
==
"
ascii_mesh
"
)
{
jsonLoader
.
load
(
{
model
:
get_url
(
g
.
url
,
data
.
urlBaseType
),
callback
:
create_callback
(
dg
)
}
);
}
}
// textures
// count how many textures will be loaded asynchronously
for
(
dt
in
data
.
textures
)
{
tt
=
data
.
textures
[
dt
];
if
(
tt
.
url
instanceof
Array
)
{
counter_textures
+=
tt
.
url
.
length
;
}
else
{
counter_textures
+=
1
;
}
}
total_textures
=
counter_textures
;
for
(
dt
in
data
.
textures
)
{
tt
=
data
.
textures
[
dt
];
if
(
tt
.
mapping
!=
undefined
&&
THREE
[
tt
.
mapping
]
!=
undefined
)
{
tt
.
mapping
=
new
THREE
[
tt
.
mapping
]();
}
if
(
tt
.
url
instanceof
Array
)
{
var
url_array
=
[];
for
(
var
i
=
0
;
i
<
tt
.
url
.
length
;
i
++
)
{
url_array
[
i
]
=
get_url
(
tt
.
url
[
i
],
data
.
urlBaseType
);
}
texture
=
ImageUtils
.
loadTextureCube
(
url_array
,
tt
.
mapping
,
callback_texture
);
}
else
{
texture
=
ImageUtils
.
loadTexture
(
get_url
(
tt
.
url
,
data
.
urlBaseType
),
tt
.
mapping
,
callback_texture
);
if
(
THREE
[
tt
.
minFilter
]
!=
undefined
)
texture
.
minFilter
=
THREE
[
tt
.
minFilter
];
if
(
THREE
[
tt
.
magFilter
]
!=
undefined
)
texture
.
magFilter
=
THREE
[
tt
.
magFilter
];
}
result
.
textures
[
dt
]
=
texture
;
}
// materials
for
(
dm
in
data
.
materials
)
{
m
=
data
.
materials
[
dm
];
for
(
pp
in
m
.
parameters
)
{
if
(
pp
==
"
envMap
"
||
pp
==
"
map
"
||
pp
==
"
lightMap
"
)
{
m
.
parameters
[
pp
]
=
result
.
textures
[
m
.
parameters
[
pp
]
];
}
else
if
(
pp
==
"
shading
"
)
{
m
.
parameters
[
pp
]
=
(
m
.
parameters
[
pp
]
==
"
flat
"
)
?
THREE
.
FlatShading
:
THREE
.
SmoothShading
;
}
else
if
(
pp
==
"
blending
"
)
{
m
.
parameters
[
pp
]
=
THREE
[
m
.
parameters
[
pp
]
]
?
THREE
[
m
.
parameters
[
pp
]
]
:
THREE
.
NormalBlending
;
}
else
if
(
pp
==
"
combine
"
)
{
m
.
parameters
[
pp
]
=
(
m
.
parameters
[
pp
]
==
"
MixOperation
"
)
?
THREE
.
MixOperation
:
THREE
.
MultiplyOperation
;
}
}
material
=
new
THREE
[
m
.
type
](
m
.
parameters
);
result
.
materials
[
dm
]
=
material
;
}
// objects ( synchronous init of procedural primitives )
handle_objects
();
// synchronous callback
callback_sync
(
result
);
};
},
addMesh
:
function
(
scene
,
geometry
,
scale
,
x
,
y
,
z
,
rx
,
ry
,
rz
,
material
)
{
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
...
...
src/extras/io/SceneLoader.js
0 → 100644
浏览文件 @
693a36f5
/**
* @author alteredq / http://alteredqualia.com/
*/
THREE
.
SceneLoader
=
function
(
)
{
};
THREE
.
SceneLoader
.
prototype
=
{
load
:
function
(
url
,
callback_sync
,
callback_async
,
callback_progress
)
{
var
worker
=
new
Worker
(
url
);
worker
.
postMessage
(
0
);
var
urlBase
=
THREE
.
Loader
.
prototype
.
extractUrlbase
(
url
);
worker
.
onmessage
=
function
(
event
)
{
var
dg
,
dm
,
dd
,
dl
,
dc
,
df
,
dt
,
g
,
o
,
m
,
l
,
p
,
c
,
t
,
f
,
tt
,
pp
,
geometry
,
material
,
camera
,
fog
,
texture
,
images
,
materials
,
data
,
binLoader
,
jsonLoader
,
counter_models
,
counter_textures
,
total_models
,
total_textures
,
result
;
data
=
event
.
data
;
binLoader
=
new
THREE
.
BinaryLoader
();
jsonLoader
=
new
THREE
.
JSONLoader
();
counter_models
=
0
;
counter_textures
=
0
;
result
=
{
scene
:
new
THREE
.
Scene
(),
geometries
:
{},
materials
:
{},
textures
:
{},
objects
:
{},
cameras
:
{},
lights
:
{},
fogs
:
{}
};
function
get_url
(
source_url
,
url_type
)
{
if
(
url_type
==
"
relativeToHTML
"
)
{
return
source_url
;
}
else
{
return
urlBase
+
"
/
"
+
source_url
;
}
};
function
handle_objects
()
{
for
(
dd
in
data
.
objects
)
{
if
(
!
result
.
objects
[
dd
]
)
{
o
=
data
.
objects
[
dd
];
geometry
=
result
.
geometries
[
o
.
geometry
];
if
(
geometry
)
{
materials
=
[];
for
(
i
=
0
;
i
<
o
.
materials
.
length
;
i
++
)
{
materials
[
i
]
=
result
.
materials
[
o
.
materials
[
i
]
];
}
p
=
o
.
position
;
r
=
o
.
rotation
;
q
=
o
.
quaternion
;
s
=
o
.
scale
;
// turn off quaternions, for the moment
q
=
0
;
if
(
materials
.
length
==
0
)
{
materials
[
0
]
=
new
THREE
.
MeshFaceMaterial
();
}
object
=
new
THREE
.
Mesh
(
geometry
,
materials
);
object
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
if
(
q
)
{
object
.
quaternion
.
set
(
q
[
0
],
q
[
1
],
q
[
2
],
q
[
3
]
);
object
.
useQuaternion
=
true
;
}
else
{
object
.
rotation
.
set
(
r
[
0
],
r
[
1
],
r
[
2
]
);
}
object
.
scale
.
set
(
s
[
0
],
s
[
1
],
s
[
2
]
);
object
.
visible
=
o
.
visible
;
result
.
scene
.
addObject
(
object
);
result
.
objects
[
dd
]
=
object
;
}
}
}
};
function
handle_mesh
(
geo
,
id
)
{
result
.
geometries
[
id
]
=
geo
;
handle_objects
();
};
function
create_callback
(
id
)
{
return
function
(
geo
)
{
handle_mesh
(
geo
,
id
);
counter_models
-=
1
;
async_callback_gate
();
}
};
function
async_callback_gate
()
{
var
progress
=
{
total_models
:
total_models
,
total_textures
:
total_textures
,
loaded_models
:
total_models
-
counter_models
,
loaded_textures
:
total_textures
-
counter_textures
};
callback_progress
(
progress
,
result
);
if
(
counter_models
==
0
&&
counter_textures
==
0
)
{
callback_async
(
result
);
}
};
var
callback_texture
=
function
(
images
)
{
counter_textures
-=
1
;
async_callback_gate
();
};
// first go synchronous elements
// cameras
for
(
dc
in
data
.
cameras
)
{
c
=
data
.
cameras
[
dc
];
if
(
c
.
type
==
"
perspective
"
)
{
camera
=
new
THREE
.
Camera
(
c
.
fov
,
c
.
aspect
,
c
.
near
,
c
.
far
);
}
else
if
(
c
.
type
==
"
ortho
"
)
{
camera
=
new
THREE
.
Camera
();
camera
.
projectionMatrix
=
THREE
.
Matrix4
.
makeOrtho
(
c
.
left
,
c
.
right
,
c
.
top
,
c
.
bottom
,
c
.
near
,
c
.
far
);
}
p
=
c
.
position
;
t
=
c
.
target
;
camera
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
camera
.
target
.
position
.
set
(
t
[
0
],
t
[
1
],
t
[
2
]
);
result
.
cameras
[
dc
]
=
camera
;
}
// lights
var
hex
,
intensity
;
for
(
dl
in
data
.
lights
)
{
l
=
data
.
lights
[
dl
];
hex
=
(
l
.
color
!==
undefined
)
?
l
.
color
:
0xffffff
;
intensity
=
(
l
.
intensity
!==
undefined
)
?
l
.
intensity
:
1
;
if
(
l
.
type
==
"
directional
"
)
{
p
=
l
.
direction
;
light
=
new
THREE
.
DirectionalLight
(
hex
,
intensity
);
light
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
light
.
position
.
normalize
();
}
else
if
(
l
.
type
==
"
point
"
)
{
p
=
l
.
position
;
light
=
new
THREE
.
PointLight
(
hex
,
intensity
);
light
.
position
.
set
(
p
[
0
],
p
[
1
],
p
[
2
]
);
}
result
.
scene
.
addLight
(
light
);
result
.
lights
[
dl
]
=
light
;
}
// fogs
for
(
df
in
data
.
fogs
)
{
f
=
data
.
fogs
[
df
];
if
(
f
.
type
==
"
linear
"
)
{
fog
=
new
THREE
.
Fog
(
0x000000
,
f
.
near
,
f
.
far
);
}
else
if
(
f
.
type
==
"
exp2
"
)
{
fog
=
new
THREE
.
FogExp2
(
0x000000
,
f
.
density
);
}
c
=
f
.
color
;
fog
.
color
.
setRGB
(
c
[
0
],
c
[
1
],
c
[
2
]
);
result
.
fogs
[
df
]
=
fog
;
}
// defaults
if
(
result
.
cameras
&&
data
.
defaults
.
camera
)
{
result
.
currentCamera
=
result
.
cameras
[
data
.
defaults
.
camera
];
}
if
(
result
.
fogs
&&
data
.
defaults
.
fog
)
{
result
.
scene
.
fog
=
result
.
fogs
[
data
.
defaults
.
fog
];
}
c
=
data
.
defaults
.
bgcolor
;
result
.
bgColor
=
new
THREE
.
Color
();
result
.
bgColor
.
setRGB
(
c
[
0
],
c
[
1
],
c
[
2
]
);
result
.
bgColorAlpha
=
data
.
defaults
.
bgalpha
;
// now come potentially asynchronous elements
// geometries
// count how many models will be loaded asynchronously
for
(
dg
in
data
.
geometries
)
{
g
=
data
.
geometries
[
dg
];
if
(
g
.
type
==
"
bin_mesh
"
||
g
.
type
==
"
ascii_mesh
"
)
{
counter_models
+=
1
;
}
}
total_models
=
counter_models
;
for
(
dg
in
data
.
geometries
)
{
g
=
data
.
geometries
[
dg
];
if
(
g
.
type
==
"
cube
"
)
{
geometry
=
new
Cube
(
g
.
width
,
g
.
height
,
g
.
depth
,
g
.
segmentsWidth
,
g
.
segmentsHeight
,
g
.
segmentsDepth
,
null
,
g
.
flipped
,
g
.
sides
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
plane
"
)
{
geometry
=
new
Plane
(
g
.
width
,
g
.
height
,
g
.
segmentsWidth
,
g
.
segmentsHeight
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
sphere
"
)
{
geometry
=
new
Sphere
(
g
.
radius
,
g
.
segmentsWidth
,
g
.
segmentsHeight
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
cylinder
"
)
{
geometry
=
new
Cylinder
(
g
.
numSegs
,
g
.
topRad
,
g
.
botRad
,
g
.
height
,
g
.
topOffset
,
g
.
botOffset
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
torus
"
)
{
geometry
=
new
Torus
(
g
.
radius
,
g
.
tube
,
g
.
segmentsR
,
g
.
segmentsT
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
icosahedron
"
)
{
geometry
=
new
Icosahedron
(
g
.
subdivisions
);
result
.
geometries
[
dg
]
=
geometry
;
}
else
if
(
g
.
type
==
"
bin_mesh
"
)
{
binLoader
.
load
(
{
model
:
get_url
(
g
.
url
,
data
.
urlBaseType
),
callback
:
create_callback
(
dg
)
}
);
}
else
if
(
g
.
type
==
"
ascii_mesh
"
)
{
jsonLoader
.
load
(
{
model
:
get_url
(
g
.
url
,
data
.
urlBaseType
),
callback
:
create_callback
(
dg
)
}
);
}
}
// textures
// count how many textures will be loaded asynchronously
for
(
dt
in
data
.
textures
)
{
tt
=
data
.
textures
[
dt
];
if
(
tt
.
url
instanceof
Array
)
{
counter_textures
+=
tt
.
url
.
length
;
}
else
{
counter_textures
+=
1
;
}
}
total_textures
=
counter_textures
;
for
(
dt
in
data
.
textures
)
{
tt
=
data
.
textures
[
dt
];
if
(
tt
.
mapping
!=
undefined
&&
THREE
[
tt
.
mapping
]
!=
undefined
)
{
tt
.
mapping
=
new
THREE
[
tt
.
mapping
]();
}
if
(
tt
.
url
instanceof
Array
)
{
var
url_array
=
[];
for
(
var
i
=
0
;
i
<
tt
.
url
.
length
;
i
++
)
{
url_array
[
i
]
=
get_url
(
tt
.
url
[
i
],
data
.
urlBaseType
);
}
texture
=
ImageUtils
.
loadTextureCube
(
url_array
,
tt
.
mapping
,
callback_texture
);
}
else
{
texture
=
ImageUtils
.
loadTexture
(
get_url
(
tt
.
url
,
data
.
urlBaseType
),
tt
.
mapping
,
callback_texture
);
if
(
THREE
[
tt
.
minFilter
]
!=
undefined
)
texture
.
minFilter
=
THREE
[
tt
.
minFilter
];
if
(
THREE
[
tt
.
magFilter
]
!=
undefined
)
texture
.
magFilter
=
THREE
[
tt
.
magFilter
];
}
result
.
textures
[
dt
]
=
texture
;
}
// materials
for
(
dm
in
data
.
materials
)
{
m
=
data
.
materials
[
dm
];
for
(
pp
in
m
.
parameters
)
{
if
(
pp
==
"
envMap
"
||
pp
==
"
map
"
||
pp
==
"
lightMap
"
)
{
m
.
parameters
[
pp
]
=
result
.
textures
[
m
.
parameters
[
pp
]
];
}
else
if
(
pp
==
"
shading
"
)
{
m
.
parameters
[
pp
]
=
(
m
.
parameters
[
pp
]
==
"
flat
"
)
?
THREE
.
FlatShading
:
THREE
.
SmoothShading
;
}
else
if
(
pp
==
"
blending
"
)
{
m
.
parameters
[
pp
]
=
THREE
[
m
.
parameters
[
pp
]
]
?
THREE
[
m
.
parameters
[
pp
]
]
:
THREE
.
NormalBlending
;
}
else
if
(
pp
==
"
combine
"
)
{
m
.
parameters
[
pp
]
=
(
m
.
parameters
[
pp
]
==
"
MixOperation
"
)
?
THREE
.
MixOperation
:
THREE
.
MultiplyOperation
;
}
}
material
=
new
THREE
[
m
.
type
](
m
.
parameters
);
result
.
materials
[
dm
]
=
material
;
}
// objects ( synchronous init of procedural primitives )
handle_objects
();
// synchronous callback
callback_sync
(
result
);
};
}
};
utils/build.py
浏览文件 @
693a36f5
...
...
@@ -101,6 +101,7 @@ EXTRAS_FILES = [
'extras/io/Loader.js'
,
'extras/io/JSONLoader.js'
,
'extras/io/BinaryLoader.js'
,
'extras/io/SceneLoader.js'
,
'extras/objects/MarchingCubes.js'
]
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录