Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
9441e74a
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,发现更多精彩内容 >>
提交
9441e74a
编写于
9月 23, 2011
作者:
M
Mr.doob
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implemented @pyrotechnick's array concat replacement.
上级
c25b39cc
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
6 addition
and
6 deletion
+6
-6
build/Three.js
build/Three.js
+1
-1
build/custom/ThreeCanvas.js
build/custom/ThreeCanvas.js
+1
-1
build/custom/ThreeDOM.js
build/custom/ThreeDOM.js
+1
-1
build/custom/ThreeSVG.js
build/custom/ThreeSVG.js
+1
-1
build/custom/ThreeWebGL.js
build/custom/ThreeWebGL.js
+1
-1
src/core/Ray.js
src/core/Ray.js
+1
-1
未找到文件。
build/Three.js
浏览文件 @
9441e74a
...
...
@@ -14,7 +14,7 @@ Math.abs(c)>1.0E-5?(this.x=Math.atan2(-b.n23/c,b.n33/c),this.z=Math.atan2(-b.n12
THREE
.
Vector4
.
prototype
=
{
constructor
:
THREE
.
Vector4
,
set
:
function
(
b
,
c
,
e
,
f
){
this
.
x
=
b
;
this
.
y
=
c
;
this
.
z
=
e
;
this
.
w
=
f
;
return
this
},
copy
:
function
(
b
){
this
.
x
=
b
.
x
;
this
.
y
=
b
.
y
;
this
.
z
=
b
.
z
;
this
.
w
=
b
.
w
!==
void
0
?
b
.
w
:
1
},
clone
:
function
(){
return
new
THREE
.
Vector4
(
this
.
x
,
this
.
y
,
this
.
z
,
this
.
w
)},
add
:
function
(
b
,
c
){
this
.
x
=
b
.
x
+
c
.
x
;
this
.
y
=
b
.
y
+
c
.
y
;
this
.
z
=
b
.
z
+
c
.
z
;
this
.
w
=
b
.
w
+
c
.
w
;
return
this
},
addSelf
:
function
(
b
){
this
.
x
+=
b
.
x
;
this
.
y
+=
b
.
y
;
this
.
z
+=
b
.
z
;
this
.
w
+=
b
.
w
;
return
this
},
sub
:
function
(
b
,
c
){
this
.
x
=
b
.
x
-
c
.
x
;
this
.
y
=
b
.
y
-
c
.
y
;
this
.
z
=
b
.
z
-
c
.
z
;
this
.
w
=
b
.
w
-
c
.
w
;
return
this
},
subSelf
:
function
(
b
){
this
.
x
-=
b
.
x
;
this
.
y
-=
b
.
y
;
this
.
z
-=
b
.
z
;
this
.
w
-=
b
.
w
;
return
this
},
multiplyScalar
:
function
(
b
){
this
.
x
*=
b
;
this
.
y
*=
b
;
this
.
z
*=
b
;
this
.
w
*=
b
;
return
this
},
divideScalar
:
function
(
b
){
b
?(
this
.
x
/=
b
,
this
.
y
/=
b
,
this
.
z
/=
b
,
this
.
w
/=
b
):(
this
.
z
=
this
.
y
=
this
.
x
=
0
,
this
.
w
=
1
);
return
this
},
negate
:
function
(){
return
this
.
multiplyScalar
(
-
1
)},
dot
:
function
(
b
){
return
this
.
x
*
b
.
x
+
this
.
y
*
b
.
y
+
this
.
z
*
b
.
z
+
this
.
w
*
b
.
w
},
lengthSq
:
function
(){
return
this
.
dot
(
this
)},
length
:
function
(){
return
Math
.
sqrt
(
this
.
lengthSq
())},
normalize
:
function
(){
return
this
.
divideScalar
(
this
.
length
())},
setLength
:
function
(
b
){
return
this
.
normalize
().
multiplyScalar
(
b
)},
lerpSelf
:
function
(
b
,
c
){
this
.
x
+=
(
b
.
x
-
this
.
x
)
*
c
;
this
.
y
+=
(
b
.
y
-
this
.
y
)
*
c
;
this
.
z
+=
(
b
.
z
-
this
.
z
)
*
c
;
this
.
w
+=
(
b
.
w
-
this
.
w
)
*
c
;
return
this
}};
THREE
.
Ray
=
function
(
b
,
c
){
this
.
origin
=
b
||
new
THREE
.
Vector3
;
this
.
direction
=
c
||
new
THREE
.
Vector3
};
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
b
){
return
this
.
intersectObjects
(
b
.
objects
)},
intersectObjects
:
function
(
b
){
var
c
,
e
,
f
=
[];
c
=
0
;
for
(
e
=
b
.
length
;
c
<
e
;
c
++
)
f
=
f
.
concat
(
this
.
intersectObject
(
b
[
c
]));
f
.
sort
(
function
(
b
,
e
){
return
b
.
distance
-
e
.
distance
});
return
f
},
intersectObject
:
function
(
b
){
function
c
(
b
,
e
,
c
){
var
f
;
f
=
c
.
clone
().
subSelf
(
b
).
dot
(
e
);
if
(
f
<=
0
)
return
null
;
b
=
b
.
clone
().
addSelf
(
e
.
clone
().
multiplyScalar
(
f
));
return
c
.
distanceTo
(
b
)}
function
e
(
b
,
e
,
c
,
f
){
var
f
=
f
.
clone
().
subSelf
(
e
),
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
b
){
return
this
.
intersectObjects
(
b
.
objects
)},
intersectObjects
:
function
(
b
){
var
c
,
e
,
f
=
[];
c
=
0
;
for
(
e
=
b
.
length
;
c
<
e
;
c
++
)
Array
.
prototype
.
push
.
apply
(
f
,
this
.
intersectObject
(
b
[
c
]));
f
.
sort
(
function
(
b
,
e
){
return
b
.
distance
-
e
.
distance
});
return
f
},
intersectObject
:
function
(
b
){
function
c
(
b
,
e
,
c
){
var
f
;
f
=
c
.
clone
().
subSelf
(
b
).
dot
(
e
);
if
(
f
<=
0
)
return
null
;
b
=
b
.
clone
().
addSelf
(
e
.
clone
().
multiplyScalar
(
f
));
return
c
.
distanceTo
(
b
)}
function
e
(
b
,
e
,
c
,
f
){
var
f
=
f
.
clone
().
subSelf
(
e
),
c
=
c
.
clone
().
subSelf
(
e
),
h
=
b
.
clone
().
subSelf
(
e
),
b
=
f
.
dot
(
f
),
e
=
f
.
dot
(
c
),
f
=
f
.
dot
(
h
),
k
=
c
.
dot
(
c
),
c
=
c
.
dot
(
h
),
h
=
1
/
(
b
*
k
-
e
*
e
),
k
=
(
k
*
f
-
e
*
c
)
*
h
,
b
=
(
b
*
c
-
e
*
f
)
*
h
;
return
k
>
0
&&
b
>
0
&&
k
+
b
<
1
}
if
(
b
instanceof
THREE
.
Particle
){
var
f
=
c
(
this
.
origin
,
this
.
direction
,
b
.
matrixWorld
.
getPosition
());
if
(
f
==
null
||
f
>
b
.
scale
.
x
)
return
[];
return
[{
distance
:
f
,
point
:
b
.
position
,
face
:
null
,
object
:
b
}]}
else
if
(
b
instanceof
THREE
.
Mesh
){
f
=
c
(
this
.
origin
,
this
.
direction
,
b
.
matrixWorld
.
getPosition
());
if
(
f
==
null
||
f
>
b
.
geometry
.
boundingSphere
.
radius
*
Math
.
max
(
b
.
scale
.
x
,
Math
.
max
(
b
.
scale
.
y
,
b
.
scale
.
z
)))
return
[];
var
h
,
m
,
k
,
n
,
u
,
p
,
v
,
t
,
x
,
w
,
z
=
b
.
geometry
,
y
=
z
.
vertices
,
A
=
[],
f
=
0
;
for
(
h
=
z
.
faces
.
length
;
f
<
h
;
f
++
)
if
(
m
=
z
.
faces
[
f
],
x
=
this
.
origin
.
clone
(),
w
=
this
.
direction
.
clone
(),
p
=
b
.
matrixWorld
,
k
=
p
.
multiplyVector3
(
m
.
centroid
.
clone
()).
subSelf
(
x
),
t
=
k
.
dot
(
w
),
!
(
t
<=
0
)
&&
(
k
=
p
.
multiplyVector3
(
y
[
m
.
a
].
position
.
clone
()),
n
=
p
.
multiplyVector3
(
y
[
m
.
b
].
position
.
clone
()),
u
=
p
.
multiplyVector3
(
y
[
m
.
c
].
position
.
clone
()),
p
=
m
instanceof
THREE
.
Face4
?
p
.
multiplyVector3
(
y
[
m
.
d
].
position
.
clone
()):
null
,
v
=
b
.
matrixRotationWorld
.
multiplyVector3
(
m
.
normal
.
clone
()),
t
=
w
.
dot
(
v
),
b
.
doubleSided
||
(
b
.
flipSided
?
t
>
0
:
t
<
0
)))
if
(
t
=
v
.
dot
((
new
THREE
.
Vector3
).
sub
(
k
,
x
))
/
t
,
x
=
x
.
addSelf
(
w
.
multiplyScalar
(
t
)),
m
instanceof
THREE
.
Face3
)
e
(
x
,
k
,
n
,
u
)
&&
(
m
=
{
distance
:
this
.
origin
.
distanceTo
(
x
),
point
:
x
,
face
:
m
,
object
:
b
},
A
.
push
(
m
));
else
if
(
m
instanceof
THREE
.
Face4
&&
(
e
(
x
,
k
,
n
,
p
)
||
e
(
x
,
n
,
u
,
p
)))
m
=
{
distance
:
this
.
origin
.
distanceTo
(
x
),
point
:
x
,
face
:
m
,
object
:
b
},
A
.
push
(
m
);
A
.
sort
(
function
(
b
,
e
){
return
b
.
distance
-
e
.
distance
});
return
A
}
else
return
[]}};
...
...
build/custom/ThreeCanvas.js
浏览文件 @
9441e74a
...
...
@@ -14,7 +14,7 @@ Math.abs(b)>1.0E-5?(this.x=Math.atan2(-a.n23/b,a.n33/b),this.z=Math.atan2(-a.n12
THREE
.
Vector4
.
prototype
=
{
constructor
:
THREE
.
Vector4
,
set
:
function
(
a
,
b
,
c
,
d
){
this
.
x
=
a
;
this
.
y
=
b
;
this
.
z
=
c
;
this
.
w
=
d
;
return
this
},
copy
:
function
(
a
){
this
.
x
=
a
.
x
;
this
.
y
=
a
.
y
;
this
.
z
=
a
.
z
;
this
.
w
=
a
.
w
!==
void
0
?
a
.
w
:
1
},
clone
:
function
(){
return
new
THREE
.
Vector4
(
this
.
x
,
this
.
y
,
this
.
z
,
this
.
w
)},
add
:
function
(
a
,
b
){
this
.
x
=
a
.
x
+
b
.
x
;
this
.
y
=
a
.
y
+
b
.
y
;
this
.
z
=
a
.
z
+
b
.
z
;
this
.
w
=
a
.
w
+
b
.
w
;
return
this
},
addSelf
:
function
(
a
){
this
.
x
+=
a
.
x
;
this
.
y
+=
a
.
y
;
this
.
z
+=
a
.
z
;
this
.
w
+=
a
.
w
;
return
this
},
sub
:
function
(
a
,
b
){
this
.
x
=
a
.
x
-
b
.
x
;
this
.
y
=
a
.
y
-
b
.
y
;
this
.
z
=
a
.
z
-
b
.
z
;
this
.
w
=
a
.
w
-
b
.
w
;
return
this
},
subSelf
:
function
(
a
){
this
.
x
-=
a
.
x
;
this
.
y
-=
a
.
y
;
this
.
z
-=
a
.
z
;
this
.
w
-=
a
.
w
;
return
this
},
multiplyScalar
:
function
(
a
){
this
.
x
*=
a
;
this
.
y
*=
a
;
this
.
z
*=
a
;
this
.
w
*=
a
;
return
this
},
divideScalar
:
function
(
a
){
a
?(
this
.
x
/=
a
,
this
.
y
/=
a
,
this
.
z
/=
a
,
this
.
w
/=
a
):(
this
.
z
=
this
.
y
=
this
.
x
=
0
,
this
.
w
=
1
);
return
this
},
negate
:
function
(){
return
this
.
multiplyScalar
(
-
1
)},
dot
:
function
(
a
){
return
this
.
x
*
a
.
x
+
this
.
y
*
a
.
y
+
this
.
z
*
a
.
z
+
this
.
w
*
a
.
w
},
lengthSq
:
function
(){
return
this
.
dot
(
this
)},
length
:
function
(){
return
Math
.
sqrt
(
this
.
lengthSq
())},
normalize
:
function
(){
return
this
.
divideScalar
(
this
.
length
())},
setLength
:
function
(
a
){
return
this
.
normalize
().
multiplyScalar
(
a
)},
lerpSelf
:
function
(
a
,
b
){
this
.
x
+=
(
a
.
x
-
this
.
x
)
*
b
;
this
.
y
+=
(
a
.
y
-
this
.
y
)
*
b
;
this
.
z
+=
(
a
.
z
-
this
.
z
)
*
b
;
this
.
w
+=
(
a
.
w
-
this
.
w
)
*
b
;
return
this
}};
THREE
.
Ray
=
function
(
a
,
b
){
this
.
origin
=
a
||
new
THREE
.
Vector3
;
this
.
direction
=
b
||
new
THREE
.
Vector3
};
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
d
=
d
.
concat
(
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
Array
.
prototype
.
push
.
apply
(
d
,
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
c
=
c
.
clone
().
subSelf
(
b
),
e
=
a
.
clone
().
subSelf
(
b
),
a
=
d
.
dot
(
d
),
b
=
d
.
dot
(
c
),
d
=
d
.
dot
(
e
),
f
=
c
.
dot
(
c
),
c
=
c
.
dot
(
e
),
e
=
1
/
(
a
*
f
-
b
*
b
),
f
=
(
f
*
d
-
b
*
c
)
*
e
,
a
=
(
a
*
c
-
b
*
d
)
*
e
;
return
f
>
0
&&
a
>
0
&&
f
+
a
<
1
}
if
(
a
instanceof
THREE
.
Particle
){
var
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
scale
.
x
)
return
[];
return
[{
distance
:
d
,
point
:
a
.
position
,
face
:
null
,
object
:
a
}]}
else
if
(
a
instanceof
THREE
.
Mesh
){
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
geometry
.
boundingSphere
.
radius
*
Math
.
max
(
a
.
scale
.
x
,
Math
.
max
(
a
.
scale
.
y
,
a
.
scale
.
z
)))
return
[];
var
e
,
g
,
f
,
h
,
l
,
j
,
n
,
i
,
o
,
k
,
r
=
a
.
geometry
,
s
=
r
.
vertices
,
w
=
[],
d
=
0
;
for
(
e
=
r
.
faces
.
length
;
d
<
e
;
d
++
)
if
(
g
=
r
.
faces
[
d
],
o
=
this
.
origin
.
clone
(),
k
=
this
.
direction
.
clone
(),
j
=
a
.
matrixWorld
,
f
=
j
.
multiplyVector3
(
g
.
centroid
.
clone
()).
subSelf
(
o
),
i
=
f
.
dot
(
k
),
!
(
i
<=
0
)
&&
(
f
=
j
.
multiplyVector3
(
s
[
g
.
a
].
position
.
clone
()),
h
=
j
.
multiplyVector3
(
s
[
g
.
b
].
position
.
clone
()),
l
=
j
.
multiplyVector3
(
s
[
g
.
c
].
position
.
clone
()),
j
=
g
instanceof
THREE
.
Face4
?
j
.
multiplyVector3
(
s
[
g
.
d
].
position
.
clone
()):
null
,
n
=
a
.
matrixRotationWorld
.
multiplyVector3
(
g
.
normal
.
clone
()),
i
=
k
.
dot
(
n
),
a
.
doubleSided
||
(
a
.
flipSided
?
i
>
0
:
i
<
0
)))
if
(
i
=
n
.
dot
((
new
THREE
.
Vector3
).
sub
(
f
,
o
))
/
i
,
o
=
o
.
addSelf
(
k
.
multiplyScalar
(
i
)),
g
instanceof
THREE
.
Face3
)
c
(
o
,
f
,
h
,
l
)
&&
(
g
=
{
distance
:
this
.
origin
.
distanceTo
(
o
),
point
:
o
,
face
:
g
,
object
:
a
},
w
.
push
(
g
));
else
if
(
g
instanceof
THREE
.
Face4
&&
(
c
(
o
,
f
,
h
,
j
)
||
c
(
o
,
h
,
l
,
j
)))
g
=
{
distance
:
this
.
origin
.
distanceTo
(
o
),
point
:
o
,
face
:
g
,
object
:
a
},
w
.
push
(
g
);
w
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
w
}
else
return
[]}};
...
...
build/custom/ThreeDOM.js
浏览文件 @
9441e74a
...
...
@@ -14,7 +14,7 @@ Math.abs(b)>1.0E-5?(this.x=Math.atan2(-a.n23/b,a.n33/b),this.z=Math.atan2(-a.n12
THREE
.
Vector4
.
prototype
=
{
constructor
:
THREE
.
Vector4
,
set
:
function
(
a
,
b
,
c
,
d
){
this
.
x
=
a
;
this
.
y
=
b
;
this
.
z
=
c
;
this
.
w
=
d
;
return
this
},
copy
:
function
(
a
){
this
.
x
=
a
.
x
;
this
.
y
=
a
.
y
;
this
.
z
=
a
.
z
;
this
.
w
=
a
.
w
!==
void
0
?
a
.
w
:
1
},
clone
:
function
(){
return
new
THREE
.
Vector4
(
this
.
x
,
this
.
y
,
this
.
z
,
this
.
w
)},
add
:
function
(
a
,
b
){
this
.
x
=
a
.
x
+
b
.
x
;
this
.
y
=
a
.
y
+
b
.
y
;
this
.
z
=
a
.
z
+
b
.
z
;
this
.
w
=
a
.
w
+
b
.
w
;
return
this
},
addSelf
:
function
(
a
){
this
.
x
+=
a
.
x
;
this
.
y
+=
a
.
y
;
this
.
z
+=
a
.
z
;
this
.
w
+=
a
.
w
;
return
this
},
sub
:
function
(
a
,
b
){
this
.
x
=
a
.
x
-
b
.
x
;
this
.
y
=
a
.
y
-
b
.
y
;
this
.
z
=
a
.
z
-
b
.
z
;
this
.
w
=
a
.
w
-
b
.
w
;
return
this
},
subSelf
:
function
(
a
){
this
.
x
-=
a
.
x
;
this
.
y
-=
a
.
y
;
this
.
z
-=
a
.
z
;
this
.
w
-=
a
.
w
;
return
this
},
multiplyScalar
:
function
(
a
){
this
.
x
*=
a
;
this
.
y
*=
a
;
this
.
z
*=
a
;
this
.
w
*=
a
;
return
this
},
divideScalar
:
function
(
a
){
a
?(
this
.
x
/=
a
,
this
.
y
/=
a
,
this
.
z
/=
a
,
this
.
w
/=
a
):(
this
.
z
=
this
.
y
=
this
.
x
=
0
,
this
.
w
=
1
);
return
this
},
negate
:
function
(){
return
this
.
multiplyScalar
(
-
1
)},
dot
:
function
(
a
){
return
this
.
x
*
a
.
x
+
this
.
y
*
a
.
y
+
this
.
z
*
a
.
z
+
this
.
w
*
a
.
w
},
lengthSq
:
function
(){
return
this
.
dot
(
this
)},
length
:
function
(){
return
Math
.
sqrt
(
this
.
lengthSq
())},
normalize
:
function
(){
return
this
.
divideScalar
(
this
.
length
())},
setLength
:
function
(
a
){
return
this
.
normalize
().
multiplyScalar
(
a
)},
lerpSelf
:
function
(
a
,
b
){
this
.
x
+=
(
a
.
x
-
this
.
x
)
*
b
;
this
.
y
+=
(
a
.
y
-
this
.
y
)
*
b
;
this
.
z
+=
(
a
.
z
-
this
.
z
)
*
b
;
this
.
w
+=
(
a
.
w
-
this
.
w
)
*
b
;
return
this
}};
THREE
.
Ray
=
function
(
a
,
b
){
this
.
origin
=
a
||
new
THREE
.
Vector3
;
this
.
direction
=
b
||
new
THREE
.
Vector3
};
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
d
=
d
.
concat
(
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
Array
.
prototype
.
push
.
apply
(
d
,
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
c
=
c
.
clone
().
subSelf
(
b
),
e
=
a
.
clone
().
subSelf
(
b
),
a
=
d
.
dot
(
d
),
b
=
d
.
dot
(
c
),
d
=
d
.
dot
(
e
),
f
=
c
.
dot
(
c
),
c
=
c
.
dot
(
e
),
e
=
1
/
(
a
*
f
-
b
*
b
),
f
=
(
f
*
d
-
b
*
c
)
*
e
,
a
=
(
a
*
c
-
b
*
d
)
*
e
;
return
f
>
0
&&
a
>
0
&&
f
+
a
<
1
}
if
(
a
instanceof
THREE
.
Particle
){
var
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
scale
.
x
)
return
[];
return
[{
distance
:
d
,
point
:
a
.
position
,
face
:
null
,
object
:
a
}]}
else
if
(
a
instanceof
THREE
.
Mesh
){
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
geometry
.
boundingSphere
.
radius
*
Math
.
max
(
a
.
scale
.
x
,
Math
.
max
(
a
.
scale
.
y
,
a
.
scale
.
z
)))
return
[];
var
e
,
g
,
f
,
h
,
j
,
i
,
k
,
l
,
m
,
n
,
p
=
a
.
geometry
,
q
=
p
.
vertices
,
s
=
[],
d
=
0
;
for
(
e
=
p
.
faces
.
length
;
d
<
e
;
d
++
)
if
(
g
=
p
.
faces
[
d
],
m
=
this
.
origin
.
clone
(),
n
=
this
.
direction
.
clone
(),
i
=
a
.
matrixWorld
,
f
=
i
.
multiplyVector3
(
g
.
centroid
.
clone
()).
subSelf
(
m
),
l
=
f
.
dot
(
n
),
!
(
l
<=
0
)
&&
(
f
=
i
.
multiplyVector3
(
q
[
g
.
a
].
position
.
clone
()),
h
=
i
.
multiplyVector3
(
q
[
g
.
b
].
position
.
clone
()),
j
=
i
.
multiplyVector3
(
q
[
g
.
c
].
position
.
clone
()),
i
=
g
instanceof
THREE
.
Face4
?
i
.
multiplyVector3
(
q
[
g
.
d
].
position
.
clone
()):
null
,
k
=
a
.
matrixRotationWorld
.
multiplyVector3
(
g
.
normal
.
clone
()),
l
=
n
.
dot
(
k
),
a
.
doubleSided
||
(
a
.
flipSided
?
l
>
0
:
l
<
0
)))
if
(
l
=
k
.
dot
((
new
THREE
.
Vector3
).
sub
(
f
,
m
))
/
l
,
m
=
m
.
addSelf
(
n
.
multiplyScalar
(
l
)),
g
instanceof
THREE
.
Face3
)
c
(
m
,
f
,
h
,
j
)
&&
(
g
=
{
distance
:
this
.
origin
.
distanceTo
(
m
),
point
:
m
,
face
:
g
,
object
:
a
},
s
.
push
(
g
));
else
if
(
g
instanceof
THREE
.
Face4
&&
(
c
(
m
,
f
,
h
,
i
)
||
c
(
m
,
h
,
j
,
i
)))
g
=
{
distance
:
this
.
origin
.
distanceTo
(
m
),
point
:
m
,
face
:
g
,
object
:
a
},
s
.
push
(
g
);
s
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
s
}
else
return
[]}};
...
...
build/custom/ThreeSVG.js
浏览文件 @
9441e74a
...
...
@@ -14,7 +14,7 @@ Math.abs(b)>1.0E-5?(this.x=Math.atan2(-a.n23/b,a.n33/b),this.z=Math.atan2(-a.n12
THREE
.
Vector4
.
prototype
=
{
constructor
:
THREE
.
Vector4
,
set
:
function
(
a
,
b
,
c
,
d
){
this
.
x
=
a
;
this
.
y
=
b
;
this
.
z
=
c
;
this
.
w
=
d
;
return
this
},
copy
:
function
(
a
){
this
.
x
=
a
.
x
;
this
.
y
=
a
.
y
;
this
.
z
=
a
.
z
;
this
.
w
=
a
.
w
!==
void
0
?
a
.
w
:
1
},
clone
:
function
(){
return
new
THREE
.
Vector4
(
this
.
x
,
this
.
y
,
this
.
z
,
this
.
w
)},
add
:
function
(
a
,
b
){
this
.
x
=
a
.
x
+
b
.
x
;
this
.
y
=
a
.
y
+
b
.
y
;
this
.
z
=
a
.
z
+
b
.
z
;
this
.
w
=
a
.
w
+
b
.
w
;
return
this
},
addSelf
:
function
(
a
){
this
.
x
+=
a
.
x
;
this
.
y
+=
a
.
y
;
this
.
z
+=
a
.
z
;
this
.
w
+=
a
.
w
;
return
this
},
sub
:
function
(
a
,
b
){
this
.
x
=
a
.
x
-
b
.
x
;
this
.
y
=
a
.
y
-
b
.
y
;
this
.
z
=
a
.
z
-
b
.
z
;
this
.
w
=
a
.
w
-
b
.
w
;
return
this
},
subSelf
:
function
(
a
){
this
.
x
-=
a
.
x
;
this
.
y
-=
a
.
y
;
this
.
z
-=
a
.
z
;
this
.
w
-=
a
.
w
;
return
this
},
multiplyScalar
:
function
(
a
){
this
.
x
*=
a
;
this
.
y
*=
a
;
this
.
z
*=
a
;
this
.
w
*=
a
;
return
this
},
divideScalar
:
function
(
a
){
a
?(
this
.
x
/=
a
,
this
.
y
/=
a
,
this
.
z
/=
a
,
this
.
w
/=
a
):(
this
.
z
=
this
.
y
=
this
.
x
=
0
,
this
.
w
=
1
);
return
this
},
negate
:
function
(){
return
this
.
multiplyScalar
(
-
1
)},
dot
:
function
(
a
){
return
this
.
x
*
a
.
x
+
this
.
y
*
a
.
y
+
this
.
z
*
a
.
z
+
this
.
w
*
a
.
w
},
lengthSq
:
function
(){
return
this
.
dot
(
this
)},
length
:
function
(){
return
Math
.
sqrt
(
this
.
lengthSq
())},
normalize
:
function
(){
return
this
.
divideScalar
(
this
.
length
())},
setLength
:
function
(
a
){
return
this
.
normalize
().
multiplyScalar
(
a
)},
lerpSelf
:
function
(
a
,
b
){
this
.
x
+=
(
a
.
x
-
this
.
x
)
*
b
;
this
.
y
+=
(
a
.
y
-
this
.
y
)
*
b
;
this
.
z
+=
(
a
.
z
-
this
.
z
)
*
b
;
this
.
w
+=
(
a
.
w
-
this
.
w
)
*
b
;
return
this
}};
THREE
.
Ray
=
function
(
a
,
b
){
this
.
origin
=
a
||
new
THREE
.
Vector3
;
this
.
direction
=
b
||
new
THREE
.
Vector3
};
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
d
=
d
.
concat
(
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
a
){
return
this
.
intersectObjects
(
a
.
objects
)},
intersectObjects
:
function
(
a
){
var
b
,
c
,
d
=
[];
b
=
0
;
for
(
c
=
a
.
length
;
b
<
c
;
b
++
)
Array
.
prototype
.
push
.
apply
(
d
,
this
.
intersectObject
(
a
[
b
]));
d
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
d
},
intersectObject
:
function
(
a
){
function
b
(
a
,
b
,
c
){
var
d
;
d
=
c
.
clone
().
subSelf
(
a
).
dot
(
b
);
if
(
d
<=
0
)
return
null
;
a
=
a
.
clone
().
addSelf
(
b
.
clone
().
multiplyScalar
(
d
));
return
c
.
distanceTo
(
a
)}
function
c
(
a
,
b
,
c
,
d
){
var
d
=
d
.
clone
().
subSelf
(
b
),
c
=
c
.
clone
().
subSelf
(
b
),
e
=
a
.
clone
().
subSelf
(
b
),
a
=
d
.
dot
(
d
),
b
=
d
.
dot
(
c
),
d
=
d
.
dot
(
e
),
f
=
c
.
dot
(
c
),
c
=
c
.
dot
(
e
),
e
=
1
/
(
a
*
f
-
b
*
b
),
f
=
(
f
*
d
-
b
*
c
)
*
e
,
a
=
(
a
*
c
-
b
*
d
)
*
e
;
return
f
>
0
&&
a
>
0
&&
f
+
a
<
1
}
if
(
a
instanceof
THREE
.
Particle
){
var
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
scale
.
x
)
return
[];
return
[{
distance
:
d
,
point
:
a
.
position
,
face
:
null
,
object
:
a
}]}
else
if
(
a
instanceof
THREE
.
Mesh
){
d
=
b
(
this
.
origin
,
this
.
direction
,
a
.
matrixWorld
.
getPosition
());
if
(
d
==
null
||
d
>
a
.
geometry
.
boundingSphere
.
radius
*
Math
.
max
(
a
.
scale
.
x
,
Math
.
max
(
a
.
scale
.
y
,
a
.
scale
.
z
)))
return
[];
var
e
,
g
,
f
,
h
,
k
,
i
,
l
,
j
,
m
,
n
,
p
=
a
.
geometry
,
q
=
p
.
vertices
,
v
=
[],
d
=
0
;
for
(
e
=
p
.
faces
.
length
;
d
<
e
;
d
++
)
if
(
g
=
p
.
faces
[
d
],
m
=
this
.
origin
.
clone
(),
n
=
this
.
direction
.
clone
(),
i
=
a
.
matrixWorld
,
f
=
i
.
multiplyVector3
(
g
.
centroid
.
clone
()).
subSelf
(
m
),
j
=
f
.
dot
(
n
),
!
(
j
<=
0
)
&&
(
f
=
i
.
multiplyVector3
(
q
[
g
.
a
].
position
.
clone
()),
h
=
i
.
multiplyVector3
(
q
[
g
.
b
].
position
.
clone
()),
k
=
i
.
multiplyVector3
(
q
[
g
.
c
].
position
.
clone
()),
i
=
g
instanceof
THREE
.
Face4
?
i
.
multiplyVector3
(
q
[
g
.
d
].
position
.
clone
()):
null
,
l
=
a
.
matrixRotationWorld
.
multiplyVector3
(
g
.
normal
.
clone
()),
j
=
n
.
dot
(
l
),
a
.
doubleSided
||
(
a
.
flipSided
?
j
>
0
:
j
<
0
)))
if
(
j
=
l
.
dot
((
new
THREE
.
Vector3
).
sub
(
f
,
m
))
/
j
,
m
=
m
.
addSelf
(
n
.
multiplyScalar
(
j
)),
g
instanceof
THREE
.
Face3
)
c
(
m
,
f
,
h
,
k
)
&&
(
g
=
{
distance
:
this
.
origin
.
distanceTo
(
m
),
point
:
m
,
face
:
g
,
object
:
a
},
v
.
push
(
g
));
else
if
(
g
instanceof
THREE
.
Face4
&&
(
c
(
m
,
f
,
h
,
i
)
||
c
(
m
,
h
,
k
,
i
)))
g
=
{
distance
:
this
.
origin
.
distanceTo
(
m
),
point
:
m
,
face
:
g
,
object
:
a
},
v
.
push
(
g
);
v
.
sort
(
function
(
a
,
b
){
return
a
.
distance
-
b
.
distance
});
return
v
}
else
return
[]}};
...
...
build/custom/ThreeWebGL.js
浏览文件 @
9441e74a
...
...
@@ -14,7 +14,7 @@ Math.abs(c)>1.0E-5?(this.x=Math.atan2(-b.n23/c,b.n33/c),this.z=Math.atan2(-b.n12
THREE
.
Vector4
.
prototype
=
{
constructor
:
THREE
.
Vector4
,
set
:
function
(
b
,
c
,
d
,
f
){
this
.
x
=
b
;
this
.
y
=
c
;
this
.
z
=
d
;
this
.
w
=
f
;
return
this
},
copy
:
function
(
b
){
this
.
x
=
b
.
x
;
this
.
y
=
b
.
y
;
this
.
z
=
b
.
z
;
this
.
w
=
b
.
w
!==
void
0
?
b
.
w
:
1
},
clone
:
function
(){
return
new
THREE
.
Vector4
(
this
.
x
,
this
.
y
,
this
.
z
,
this
.
w
)},
add
:
function
(
b
,
c
){
this
.
x
=
b
.
x
+
c
.
x
;
this
.
y
=
b
.
y
+
c
.
y
;
this
.
z
=
b
.
z
+
c
.
z
;
this
.
w
=
b
.
w
+
c
.
w
;
return
this
},
addSelf
:
function
(
b
){
this
.
x
+=
b
.
x
;
this
.
y
+=
b
.
y
;
this
.
z
+=
b
.
z
;
this
.
w
+=
b
.
w
;
return
this
},
sub
:
function
(
b
,
c
){
this
.
x
=
b
.
x
-
c
.
x
;
this
.
y
=
b
.
y
-
c
.
y
;
this
.
z
=
b
.
z
-
c
.
z
;
this
.
w
=
b
.
w
-
c
.
w
;
return
this
},
subSelf
:
function
(
b
){
this
.
x
-=
b
.
x
;
this
.
y
-=
b
.
y
;
this
.
z
-=
b
.
z
;
this
.
w
-=
b
.
w
;
return
this
},
multiplyScalar
:
function
(
b
){
this
.
x
*=
b
;
this
.
y
*=
b
;
this
.
z
*=
b
;
this
.
w
*=
b
;
return
this
},
divideScalar
:
function
(
b
){
b
?(
this
.
x
/=
b
,
this
.
y
/=
b
,
this
.
z
/=
b
,
this
.
w
/=
b
):(
this
.
z
=
this
.
y
=
this
.
x
=
0
,
this
.
w
=
1
);
return
this
},
negate
:
function
(){
return
this
.
multiplyScalar
(
-
1
)},
dot
:
function
(
b
){
return
this
.
x
*
b
.
x
+
this
.
y
*
b
.
y
+
this
.
z
*
b
.
z
+
this
.
w
*
b
.
w
},
lengthSq
:
function
(){
return
this
.
dot
(
this
)},
length
:
function
(){
return
Math
.
sqrt
(
this
.
lengthSq
())},
normalize
:
function
(){
return
this
.
divideScalar
(
this
.
length
())},
setLength
:
function
(
b
){
return
this
.
normalize
().
multiplyScalar
(
b
)},
lerpSelf
:
function
(
b
,
c
){
this
.
x
+=
(
b
.
x
-
this
.
x
)
*
c
;
this
.
y
+=
(
b
.
y
-
this
.
y
)
*
c
;
this
.
z
+=
(
b
.
z
-
this
.
z
)
*
c
;
this
.
w
+=
(
b
.
w
-
this
.
w
)
*
c
;
return
this
}};
THREE
.
Ray
=
function
(
b
,
c
){
this
.
origin
=
b
||
new
THREE
.
Vector3
;
this
.
direction
=
c
||
new
THREE
.
Vector3
};
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
b
){
return
this
.
intersectObjects
(
b
.
objects
)},
intersectObjects
:
function
(
b
){
var
c
,
d
,
f
=
[];
c
=
0
;
for
(
d
=
b
.
length
;
c
<
d
;
c
++
)
f
=
f
.
concat
(
this
.
intersectObject
(
b
[
c
]));
f
.
sort
(
function
(
b
,
c
){
return
b
.
distance
-
c
.
distance
});
return
f
},
intersectObject
:
function
(
b
){
function
c
(
b
,
c
,
d
){
var
f
;
f
=
d
.
clone
().
subSelf
(
b
).
dot
(
c
);
if
(
f
<=
0
)
return
null
;
b
=
b
.
clone
().
addSelf
(
c
.
clone
().
multiplyScalar
(
f
));
return
d
.
distanceTo
(
b
)}
function
d
(
b
,
c
,
d
,
f
){
var
f
=
f
.
clone
().
subSelf
(
c
),
THREE
.
Ray
.
prototype
=
{
constructor
:
THREE
.
Ray
,
intersectScene
:
function
(
b
){
return
this
.
intersectObjects
(
b
.
objects
)},
intersectObjects
:
function
(
b
){
var
c
,
d
,
f
=
[];
c
=
0
;
for
(
d
=
b
.
length
;
c
<
d
;
c
++
)
Array
.
prototype
.
push
.
apply
(
f
,
this
.
intersectObject
(
b
[
c
]));
f
.
sort
(
function
(
b
,
c
){
return
b
.
distance
-
c
.
distance
});
return
f
},
intersectObject
:
function
(
b
){
function
c
(
b
,
c
,
d
){
var
f
;
f
=
d
.
clone
().
subSelf
(
b
).
dot
(
c
);
if
(
f
<=
0
)
return
null
;
b
=
b
.
clone
().
addSelf
(
c
.
clone
().
multiplyScalar
(
f
));
return
d
.
distanceTo
(
b
)}
function
d
(
b
,
c
,
d
,
f
){
var
f
=
f
.
clone
().
subSelf
(
c
),
d
=
d
.
clone
().
subSelf
(
c
),
i
=
b
.
clone
().
subSelf
(
c
),
b
=
f
.
dot
(
f
),
c
=
f
.
dot
(
d
),
f
=
f
.
dot
(
i
),
h
=
d
.
dot
(
d
),
d
=
d
.
dot
(
i
),
i
=
1
/
(
b
*
h
-
c
*
c
),
h
=
(
h
*
f
-
c
*
d
)
*
i
,
b
=
(
b
*
d
-
c
*
f
)
*
i
;
return
h
>
0
&&
b
>
0
&&
h
+
b
<
1
}
if
(
b
instanceof
THREE
.
Particle
){
var
f
=
c
(
this
.
origin
,
this
.
direction
,
b
.
matrixWorld
.
getPosition
());
if
(
f
==
null
||
f
>
b
.
scale
.
x
)
return
[];
return
[{
distance
:
f
,
point
:
b
.
position
,
face
:
null
,
object
:
b
}]}
else
if
(
b
instanceof
THREE
.
Mesh
){
f
=
c
(
this
.
origin
,
this
.
direction
,
b
.
matrixWorld
.
getPosition
());
if
(
f
==
null
||
f
>
b
.
geometry
.
boundingSphere
.
radius
*
Math
.
max
(
b
.
scale
.
x
,
Math
.
max
(
b
.
scale
.
y
,
b
.
scale
.
z
)))
return
[];
var
i
,
h
,
j
,
k
,
p
,
n
,
t
,
q
,
u
,
r
,
y
=
b
.
geometry
,
x
=
y
.
vertices
,
D
=
[],
f
=
0
;
for
(
i
=
y
.
faces
.
length
;
f
<
i
;
f
++
)
if
(
h
=
y
.
faces
[
f
],
u
=
this
.
origin
.
clone
(),
r
=
this
.
direction
.
clone
(),
n
=
b
.
matrixWorld
,
j
=
n
.
multiplyVector3
(
h
.
centroid
.
clone
()).
subSelf
(
u
),
q
=
j
.
dot
(
r
),
!
(
q
<=
0
)
&&
(
j
=
n
.
multiplyVector3
(
x
[
h
.
a
].
position
.
clone
()),
k
=
n
.
multiplyVector3
(
x
[
h
.
b
].
position
.
clone
()),
p
=
n
.
multiplyVector3
(
x
[
h
.
c
].
position
.
clone
()),
n
=
h
instanceof
THREE
.
Face4
?
n
.
multiplyVector3
(
x
[
h
.
d
].
position
.
clone
()):
null
,
t
=
b
.
matrixRotationWorld
.
multiplyVector3
(
h
.
normal
.
clone
()),
q
=
r
.
dot
(
t
),
b
.
doubleSided
||
(
b
.
flipSided
?
q
>
0
:
q
<
0
)))
if
(
q
=
t
.
dot
((
new
THREE
.
Vector3
).
sub
(
j
,
u
))
/
q
,
u
=
u
.
addSelf
(
r
.
multiplyScalar
(
q
)),
h
instanceof
THREE
.
Face3
)
d
(
u
,
j
,
k
,
p
)
&&
(
h
=
{
distance
:
this
.
origin
.
distanceTo
(
u
),
point
:
u
,
face
:
h
,
object
:
b
},
D
.
push
(
h
));
else
if
(
h
instanceof
THREE
.
Face4
&&
(
d
(
u
,
j
,
k
,
n
)
||
d
(
u
,
k
,
p
,
n
)))
h
=
{
distance
:
this
.
origin
.
distanceTo
(
u
),
point
:
u
,
face
:
h
,
object
:
b
},
D
.
push
(
h
);
D
.
sort
(
function
(
b
,
c
){
return
b
.
distance
-
c
.
distance
});
return
D
}
else
return
[]}};
...
...
src/core/Ray.js
浏览文件 @
9441e74a
...
...
@@ -26,7 +26,7 @@ THREE.Ray.prototype = {
for
(
i
=
0
,
l
=
objects
.
length
;
i
<
l
;
i
++
)
{
intersects
=
intersects
.
concat
(
this
.
intersectObject
(
objects
[
i
]
)
);
Array
.
prototype
.
push
.
apply
(
intersects
,
this
.
intersectObject
(
objects
[
i
]
)
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录