Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
a1ad7e3e
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,发现更多精彩内容 >>
提交
a1ad7e3e
编写于
2月 11, 2020
作者:
D
Don McCurdy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Clean up tests on BufferGeometryUtils and GLTFExporter.
上级
76d16bd8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
109 addition
and
105 deletion
+109
-105
test/unit/example/exporters/GLTFExporter.tests.js
test/unit/example/exporters/GLTFExporter.tests.js
+2
-2
test/unit/example/utils/BufferGeometryUtils.tests.js
test/unit/example/utils/BufferGeometryUtils.tests.js
+107
-103
未找到文件。
test/unit/example/exporters/GLTFExporter.tests.js
浏览文件 @
a1ad7e3e
...
...
@@ -6,7 +6,7 @@
import
{
GLTFExporter
}
from
'
../../../../examples/jsm/exporters/GLTFExporter
'
;
import
{
AnimationClip
}
from
'
../../../../src/animation/AnimationClip
'
;
import
{
BoxGeometry
}
from
'
../../../../src/geometries/BoxGeometry
'
;
import
{
Box
Buffer
Geometry
}
from
'
../../../../src/geometries/BoxGeometry
'
;
import
{
BufferAttribute
}
from
'
../../../../src/core/BufferAttribute
'
;
import
{
BufferGeometry
}
from
'
../../../../src/core/BufferGeometry
'
;
import
{
Mesh
}
from
'
../../../../src/objects/Mesh
'
;
...
...
@@ -59,7 +59,7 @@ export default QUnit.module( 'Exporters', () => {
var
done
=
assert
.
async
();
var
box
=
new
Mesh
(
new
BoxGeometry
(
1
,
1
,
1
),
new
Box
Buffer
Geometry
(
1
,
1
,
1
),
new
MeshStandardMaterial
(
{
color
:
0xFF0000
}
)
);
...
...
test/unit/example/utils/BufferGeometryUtils.tests.js
浏览文件 @
a1ad7e3e
...
...
@@ -9,164 +9,168 @@ import { BufferAttribute } from '../../../../src/core/BufferAttribute';
import
{
BufferGeometry
}
from
'
../../../../src/core/BufferGeometry
'
;
import
{
TriangleStripDrawMode
,
TriangleFanDrawMode
}
from
'
../../../../src/constants
'
;
export
default
QUnit
.
module
(
'
BufferGeometry
Utils
'
,
()
=>
{
export
default
QUnit
.
module
(
'
Utils
'
,
()
=>
{
QUnit
.
test
(
'
mergeBufferAttributes - basic
'
,
(
assert
)
=>
{
QUnit
.
module
(
'
BufferGeometryUtils
'
,
(
)
=>
{
var
array1
=
new
Float32Array
(
[
1
,
2
,
3
,
4
]
);
var
attr1
=
new
BufferAttribute
(
array1
,
2
,
false
);
QUnit
.
test
(
'
mergeBufferAttributes - basic
'
,
(
assert
)
=>
{
var
array2
=
new
Float32Array
(
[
5
,
6
,
7
,
8
]
);
var
attr2
=
new
BufferAttribute
(
array2
,
2
,
false
);
var
array1
=
new
Float32Array
(
[
1
,
2
,
3
,
4
]
);
var
attr1
=
new
BufferAttribute
(
array1
,
2
,
false
);
var
mergedAttr
=
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
);
var
array2
=
new
Float32Array
(
[
5
,
6
,
7
,
8
]
);
var
attr2
=
new
BufferAttribute
(
array2
,
2
,
false
);
assert
.
smartEqual
(
Array
.
from
(
mergedAttr
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
],
'
merges elements
'
);
assert
.
equal
(
mergedAttr
.
itemSize
,
2
,
'
retains .itemSize
'
);
assert
.
equal
(
mergedAttr
.
normalized
,
false
,
'
retains .normalized
'
);
var
mergedAttr
=
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
);
}
);
assert
.
smartEqual
(
Array
.
from
(
mergedAttr
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
],
'
merges elements
'
);
assert
.
equal
(
mergedAttr
.
itemSize
,
2
,
'
retains .itemSize
'
);
assert
.
equal
(
mergedAttr
.
normalized
,
false
,
'
retains .normalized
'
);
QUnit
.
test
(
'
mergeBufferAttributes - invalid
'
,
(
assert
)
=>
{
}
);
var
array1
=
new
Float32Array
(
[
1
,
2
,
3
,
4
]
);
var
attr1
=
new
BufferAttribute
(
array1
,
2
,
false
);
QUnit
.
test
(
'
mergeBufferAttributes - invalid
'
,
(
assert
)
=>
{
var
array2
=
new
Float32Array
(
[
5
,
6
,
7
,
8
]
);
var
attr2
=
new
BufferAttribute
(
array2
,
4
,
false
);
var
array1
=
new
Float32Array
(
[
1
,
2
,
3
,
4
]
);
var
attr1
=
new
BufferAttribute
(
array1
,
2
,
false
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
);
var
array2
=
new
Float32Array
(
[
5
,
6
,
7
,
8
]
);
var
attr2
=
new
BufferAttribute
(
array2
,
4
,
false
);
attr2
.
itemSize
=
2
;
attr2
.
normalized
=
true
;
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
);
attr2
.
itemSize
=
2
;
attr2
.
normalized
=
true
;
attr2
.
normalized
=
false
;
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
)
;
assert
.
ok
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
)
;
attr2
.
normalized
=
false
;
}
);
assert
.
ok
(
BufferGeometryUtils
.
mergeBufferAttributes
(
[
attr1
,
attr2
]
)
);
QUnit
.
test
(
'
mergeBufferGeometries - basic
'
,
(
assert
)
=>
{
}
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
QUnit
.
test
(
'
mergeBufferGeometries - basic
'
,
(
assert
)
=>
{
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
}
);
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
QUnit
.
test
(
'
mergeBufferGeometries - indexed
'
,
(
assert
)
=>
{
}
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
,
2
,
1
,
0
]
),
1
,
false
)
);
QUnit
.
test
(
'
mergeBufferGeometries - indexed
'
,
(
assert
)
=>
{
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
geometry2
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
,
2
,
1
,
0
]
),
1
,
false
)
);
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
geometry2
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
index
.
array
),
[
0
,
1
,
2
,
2
,
1
,
0
,
3
,
4
,
5
],
'
merges indices
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
}
);
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
index
.
array
),
[
0
,
1
,
2
,
2
,
1
,
0
,
3
,
4
,
5
],
'
merges indices
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
QUnit
.
test
(
'
mergeBufferGeometries - morph targets
'
,
(
assert
)
=>
{
}
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
morphAttributes
.
position
=
[
new
BufferAttribute
(
new
Float32Array
(
[
10
,
20
,
30
]
),
1
,
false
),
new
BufferAttribute
(
new
Float32Array
(
[
100
,
200
,
300
]
),
1
,
false
)
];
QUnit
.
test
(
'
mergeBufferGeometries - morph targets
'
,
(
assert
)
=>
{
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
geometry2
.
morphAttributes
.
position
=
[
new
BufferAttribute
(
new
Float32Array
(
[
40
,
50
,
6
0
]
),
1
,
false
),
new
BufferAttribute
(
new
Float32Array
(
[
400
,
500
,
6
00
]
),
1
,
false
)
];
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
morphAttributes
.
position
=
[
new
BufferAttribute
(
new
Float32Array
(
[
10
,
20
,
3
0
]
),
1
,
false
),
new
BufferAttribute
(
new
Float32Array
(
[
100
,
200
,
3
00
]
),
1
,
false
)
];
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
geometry2
.
morphAttributes
.
position
=
[
new
BufferAttribute
(
new
Float32Array
(
[
40
,
50
,
60
]
),
1
,
false
),
new
BufferAttribute
(
new
Float32Array
(
[
400
,
500
,
600
]
),
1
,
false
)
];
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
morphAttributes
.
position
[
0
].
array
),
[
10
,
20
,
30
,
40
,
50
,
60
],
'
merges morph targets
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
morphAttributes
.
position
[
1
].
array
),
[
100
,
200
,
300
,
400
,
500
,
600
],
'
merges morph targets
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
var
mergedGeometry
=
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
);
}
);
assert
.
ok
(
mergedGeometry
,
'
merge succeeds
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
attributes
.
position
.
array
),
[
1
,
2
,
3
,
4
,
5
,
6
],
'
merges elements
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
morphAttributes
.
position
[
0
].
array
),
[
10
,
20
,
30
,
40
,
50
,
60
],
'
merges morph targets
'
);
assert
.
smartEqual
(
Array
.
from
(
mergedGeometry
.
morphAttributes
.
position
[
1
].
array
),
[
100
,
200
,
300
,
400
,
500
,
600
],
'
merges morph targets
'
);
assert
.
equal
(
mergedGeometry
.
attributes
.
position
.
itemSize
,
1
,
'
retains .itemSize
'
);
QUnit
.
test
(
'
mergeBufferGeometries - invalid
'
,
(
assert
)
=>
{
}
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
QUnit
.
test
(
'
mergeBufferGeometries - invalid
'
,
(
assert
)
=>
{
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
geometry1
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
[
4
,
5
,
6
]
),
1
,
false
)
);
geometry2
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
assert
.
ok
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
geometry2
.
setIndex
(
new
BufferAttribute
(
new
Uint16Array
(
[
0
,
1
,
2
]
),
1
,
false
)
);
geometry2
.
setAttribute
(
'
foo
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
assert
.
ok
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
geometry2
.
setAttribute
(
'
foo
'
,
new
BufferAttribute
(
new
Float32Array
(
[
1
,
2
,
3
]
),
1
,
false
)
);
}
);
assert
.
notOk
(
BufferGeometryUtils
.
mergeBufferGeometries
(
[
geometry1
,
geometry2
]
)
);
}
);
QUnit
.
test
(
'
toTrianglesDrawMode()
'
,
(
assert
)
=>
{
QUnit
.
test
(
'
toTrianglesDrawMode()
'
,
(
assert
)
=>
{
// TRIANGLE_STRIP
// TRIANGLE_STRIP
const
vertices1
=
[];
const
vertices1
=
[];
vertices1
.
push
(
0
,
0
,
0
);
// v0
vertices1
.
push
(
1
,
0
,
0
);
// v1
vertices1
.
push
(
0
,
1
,
0
);
// v2
vertices1
.
push
(
2
,
0
,
0
);
// v3
vertices1
.
push
(
2
,
1
,
0
);
// v4
vertices1
.
push
(
3
,
0
,
0
);
// v5
vertices1
.
push
(
0
,
0
,
0
);
// v0
vertices1
.
push
(
1
,
0
,
0
);
// v1
vertices1
.
push
(
0
,
1
,
0
);
// v2
vertices1
.
push
(
2
,
0
,
0
);
// v3
vertices1
.
push
(
2
,
1
,
0
);
// v4
vertices1
.
push
(
3
,
0
,
0
);
// v5
var
geometry1
=
new
BufferGeometry
();
var
geometry1
=
new
BufferGeometry
();
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
vertices1
),
3
)
);
geometry1
=
BufferGeometryUtils
.
toTrianglesDrawMode
(
geometry1
,
TriangleStripDrawMode
);
geometry1
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
vertices1
),
3
)
);
geometry1
=
BufferGeometryUtils
.
toTrianglesDrawMode
(
geometry1
,
TriangleStripDrawMode
);
assert
.
deepEqual
(
geometry1
.
index
.
array
,
new
Uint16Array
(
[
0
,
1
,
2
,
3
,
2
,
1
,
2
,
3
,
4
,
5
,
4
,
3
]
),
'
correct triangle indices from triangle strip
'
);
assert
.
deepEqual
(
geometry1
.
index
.
array
,
new
Uint16Array
(
[
0
,
1
,
2
,
3
,
2
,
1
,
2
,
3
,
4
,
5
,
4
,
3
]
),
'
correct triangle indices from triangle strip
'
);
// TRIANGLE_FAN
// TRIANGLE_FAN
const
vertices2
=
[];
const
vertices2
=
[];
vertices2
.
push
(
0
,
0
,
0
);
// v0
vertices2
.
push
(
1
,
0
,
0
);
// v1
vertices2
.
push
(
1
,
1
,
0
);
// v2
vertices2
.
push
(
0
,
1
,
0
);
// v3
vertices2
.
push
(
-
1
,
1
,
0
);
// v4
vertices2
.
push
(
-
1
,
0
,
0
);
// v5
vertices2
.
push
(
0
,
0
,
0
);
// v0
vertices2
.
push
(
1
,
0
,
0
);
// v1
vertices2
.
push
(
1
,
1
,
0
);
// v2
vertices2
.
push
(
0
,
1
,
0
);
// v3
vertices2
.
push
(
-
1
,
1
,
0
);
// v4
vertices2
.
push
(
-
1
,
0
,
0
);
// v5
var
geometry2
=
new
BufferGeometry
();
var
geometry2
=
new
BufferGeometry
();
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
vertices2
),
3
)
);
geometry2
=
BufferGeometryUtils
.
toTrianglesDrawMode
(
geometry2
,
TriangleFanDrawMode
);
geometry2
.
setAttribute
(
'
position
'
,
new
BufferAttribute
(
new
Float32Array
(
vertices2
),
3
)
);
geometry2
=
BufferGeometryUtils
.
toTrianglesDrawMode
(
geometry2
,
TriangleFanDrawMode
);
assert
.
deepEqual
(
geometry2
.
index
.
array
,
new
Uint16Array
(
[
0
,
1
,
2
,
0
,
2
,
3
,
0
,
3
,
4
,
0
,
4
,
5
]
),
'
correct triangle indices from triangle fan
'
);
assert
.
deepEqual
(
geometry2
.
index
.
array
,
new
Uint16Array
(
[
0
,
1
,
2
,
0
,
2
,
3
,
0
,
3
,
4
,
0
,
4
,
5
]
),
'
correct triangle indices from triangle fan
'
);
}
);
}
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录