Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
bcebd785
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,发现更多精彩内容 >>
提交
bcebd785
编写于
5月 14, 2012
作者:
M
Mr.doob
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added onError callback to ImageUtils.loadTexture. Fixes #1908.
上级
d0f37dfa
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
27 addition
and
13 deletion
+27
-13
build/Three.js
build/Three.js
+5
-4
build/custom/ThreeExtras.js
build/custom/ThreeExtras.js
+4
-4
src/extras/ImageUtils.js
src/extras/ImageUtils.js
+18
-5
未找到文件。
build/Three.js
浏览文件 @
bcebd785
...
...
@@ -444,10 +444,11 @@ y.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)
f
.
lerpSelf
(
e
.
vertexNormals
[
2
],
0.5
);
g
=
e
.
vertexNormals
[
3
].
clone
();
g
.
lerpSelf
(
e
.
vertexNormals
[
0
],
0.5
);
y
.
vertexNormals
[
2
].
copy
(
f
);
y
.
vertexNormals
[
3
].
copy
(
g
);
s
.
vertexNormals
[
0
].
copy
(
g
);
s
.
vertexNormals
[
1
].
copy
(
f
)}
if
(
e
.
vertexColors
.
length
===
4
){
f
=
e
.
vertexColors
[
1
].
clone
();
f
.
lerpSelf
(
e
.
vertexColors
[
2
],
0.5
);
g
=
e
.
vertexColors
[
3
].
clone
();
g
.
lerpSelf
(
e
.
vertexColors
[
0
],
0.5
);
y
.
vertexColors
[
2
].
copy
(
f
);
y
.
vertexColors
[
3
].
copy
(
g
);
s
.
vertexColors
[
0
].
copy
(
g
);
s
.
vertexColors
[
1
].
copy
(
f
)}
e
=
1
}
x
.
push
(
y
,
s
);
a
.
vertices
.
push
(
p
,
l
);
f
=
0
;
for
(
g
=
a
.
faceVertexUvs
.
length
;
f
<
g
;
f
++
)
if
(
a
.
faceVertexUvs
[
f
].
length
){
k
=
a
.
faceVertexUvs
[
f
][
c
];
s
=
k
[
0
];
h
=
k
[
1
];
y
=
k
[
2
];
k
=
k
[
3
];
if
(
e
===
0
){
l
=
s
.
clone
();
l
.
lerpSelf
(
h
,
0.5
);
o
=
y
.
clone
();
o
.
lerpSelf
(
k
,
0.5
);
s
=
[
s
.
clone
(),
l
.
clone
(),
o
.
clone
(),
k
.
clone
()];
h
=
[
l
.
clone
(),
h
.
clone
(),
y
.
clone
(),
o
.
clone
()]}
else
{
l
=
h
.
clone
();
l
.
lerpSelf
(
y
,
0.5
);
o
=
k
.
clone
();
o
.
lerpSelf
(
s
,
0.5
);
s
=
[
s
.
clone
(),
h
.
clone
(),
l
.
clone
(),
o
.
clone
()];
h
=
[
o
.
clone
(),
l
.
clone
(),
y
.
clone
(),
k
.
clone
()]}
E
[
f
].
push
(
s
,
h
)}}
else
{
x
.
push
(
e
);
f
=
0
;
for
(
g
=
a
.
faceVertexUvs
.
length
;
f
<
g
;
f
++
)
E
[
f
].
push
(
a
.
faceVertexUvs
[
f
][
c
])}}}
a
.
faces
=
x
;
a
.
faceVertexUvs
=
E
}};
THREE
.
GeometryUtils
.
random
=
THREE
.
Math
.
random16
;
THREE
.
GeometryUtils
.
__v1
=
new
THREE
.
Vector3
;
THREE
.
ImageUtils
=
{
crossOrigin
:
"
anonymous
"
,
loadTexture
:
function
(
a
,
b
,
c
){
var
d
=
new
THREE
.
Texture
(
void
0
,
b
),
b
=
new
THREE
.
ImageLoader
;
b
.
addEventListener
(
"
load
"
,
function
(
a
){
d
.
image
=
a
.
content
;
d
.
needsUpdate
=
true
;
c
&&
c
(
this
)});
b
.
crossOrigin
=
this
.
crossOrigin
;
b
.
load
(
a
);
return
d
},
loadTextureCube
:
function
(
a
,
b
,
c
){
var
d
,
e
=
[],
f
=
new
THREE
.
Texture
(
e
,
b
),
b
=
e
.
loadCount
=
0
;
for
(
d
=
a
.
length
;
b
<
d
;
++
b
){
e
[
b
]
=
new
Image
;
e
[
b
].
onload
=
function
(){
e
.
loadCount
=
e
.
loadCount
+
1
;
if
(
e
.
loadCount
===
6
)
f
.
needsUpdate
=
true
;
c
&&
c
(
this
)};
e
[
b
].
crossOrigin
=
this
.
crossOrigin
;
e
[
b
].
src
=
a
[
b
]}
return
f
},
getNormalMap
:
function
(
a
,
b
){
var
c
=
function
(
a
){
var
b
=
Math
.
sqrt
(
a
[
0
]
*
a
[
0
]
+
a
[
1
]
*
a
[
1
]
+
a
[
2
]
*
a
[
2
]);
return
[
a
[
0
]
/
b
,
a
[
1
]
/
b
,
a
[
2
]
/
b
]},
b
=
b
|
1
,
d
=
a
.
width
,
e
=
a
.
height
,
f
=
document
.
createElement
(
"
canvas
"
);
f
.
width
=
d
;
f
.
height
=
e
;
var
g
=
f
.
getContext
(
"
2d
"
);
g
.
drawImage
(
a
,
0
,
0
);
for
(
var
h
=
g
.
getImageData
(
0
,
0
,
d
,
e
).
data
,
j
=
g
.
createImageData
(
d
,
e
),
k
=
j
.
data
,
l
=
0
;
l
<
d
;
l
++
)
for
(
var
o
=
0
;
o
<
e
;
o
++
){
var
m
=
o
-
1
<
0
?
0
:
o
-
1
,
p
=
o
+
1
>
e
-
1
?
e
-
1
:
o
+
1
,
r
=
l
-
1
<
0
?
0
:
l
-
1
,
n
=
l
+
1
>
d
-
1
?
d
-
1
:
l
+
1
,
q
=
[],
u
=
[
0
,
0
,
h
[(
o
*
d
+
l
)
*
4
]
/
255
*
b
];
q
.
push
([
-
1
,
0
,
h
[(
o
*
d
+
r
)
*
4
]
/
255
*
b
]);
q
.
push
([
-
1
,
-
1
,
h
[(
m
*
d
+
r
)
*
4
]
/
255
*
b
]);
q
.
push
([
0
,
-
1
,
h
[(
m
*
d
+
l
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
-
1
,
h
[(
m
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
0
,
h
[(
o
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
1
,
h
[(
p
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
0
,
1
,
h
[(
p
*
d
+
l
)
*
4
]
/
255
*
b
]);
q
.
push
([
-
1
,
1
,
h
[(
p
*
d
+
r
)
*
4
]
/
255
*
b
]);
m
=
[];
r
=
q
.
length
;
for
(
p
=
0
;
p
<
r
;
p
++
){
var
n
=
q
[
p
],
t
=
q
[(
p
+
1
)
%
r
],
n
=
[
n
[
0
]
-
u
[
0
],
n
[
1
]
-
u
[
1
],
n
[
2
]
-
u
[
2
]],
t
=
[
t
[
0
]
-
u
[
0
],
t
[
1
]
-
u
[
1
],
t
[
2
]
-
u
[
2
]];
m
.
push
(
c
([
n
[
1
]
*
t
[
2
]
-
n
[
2
]
*
t
[
1
],
n
[
2
]
*
t
[
0
]
-
n
[
0
]
*
t
[
2
],
n
[
0
]
*
t
[
1
]
-
n
[
1
]
*
t
[
0
]]))}
q
=
[
0
,
0
,
0
];
for
(
p
=
0
;
p
<
m
.
length
;
p
++
){
q
[
0
]
=
q
[
0
]
+
m
[
p
][
0
];
q
[
1
]
=
q
[
1
]
+
m
[
p
][
1
];
q
[
2
]
=
q
[
2
]
+
m
[
p
][
2
]}
q
[
0
]
=
q
[
0
]
/
m
.
length
;
q
[
1
]
=
q
[
1
]
/
m
.
length
;
q
[
2
]
=
q
[
2
]
/
m
.
length
;
u
=
(
o
*
d
+
l
)
*
4
;
k
[
u
]
=
(
q
[
0
]
+
1
)
/
2
*
255
|
0
;
k
[
u
+
1
]
=
(
q
[
1
]
+
1
)
/
2
*
255
|
0
;
k
[
u
+
2
]
=
q
[
2
]
*
255
|
0
;
k
[
u
+
3
]
=
255
}
g
.
putImageData
(
j
,
0
,
0
);
return
f
},
generateDataTexture
:
function
(
a
,
b
,
c
){
for
(
var
d
=
a
*
b
,
e
=
new
Uint8Array
(
3
*
d
),
f
=
Math
.
floor
(
c
.
r
*
255
),
g
=
Math
.
floor
(
c
.
g
*
255
),
c
=
Math
.
floor
(
c
.
b
*
255
),
h
=
0
;
h
<
d
;
h
++
){
e
[
h
*
3
]
=
f
;
e
[
h
*
3
+
1
]
=
g
;
e
[
h
*
3
+
2
]
=
c
}
a
=
new
THREE
.
DataTexture
(
e
,
a
,
b
,
THREE
.
RGBFormat
);
a
.
needsUpdate
=
true
;
return
a
}};
THREE
.
ImageUtils
=
{
crossOrigin
:
"
anonymous
"
,
loadTexture
:
function
(
a
,
b
,
c
,
d
){
var
e
=
new
THREE
.
Texture
(
void
0
,
b
),
b
=
new
THREE
.
ImageLoader
;
b
.
addEventListener
(
"
load
"
,
function
(
a
){
e
.
image
=
a
.
content
;
e
.
needsUpdate
=
true
;
c
&&
c
()});
b
.
addEventListener
(
"
error
"
,
function
(
a
){
d
&&
d
(
a
.
message
)});
b
.
crossOrigin
=
this
.
crossOrigin
;
b
.
load
(
a
);
return
e
},
loadTextureCube
:
function
(
a
,
b
,
c
){
var
d
,
e
=
[],
f
=
new
THREE
.
Texture
(
e
,
b
),
b
=
e
.
loadCount
=
0
;
for
(
d
=
a
.
length
;
b
<
d
;
++
b
){
e
[
b
]
=
new
Image
;
e
[
b
].
onload
=
function
(){
e
.
loadCount
=
e
.
loadCount
+
1
;
if
(
e
.
loadCount
===
6
){
f
.
needsUpdate
=
true
;
c
&&
c
()}};
e
[
b
].
crossOrigin
=
this
.
crossOrigin
;
e
[
b
].
src
=
a
[
b
]}
return
f
},
getNormalMap
:
function
(
a
,
b
){
var
c
=
function
(
a
){
var
b
=
Math
.
sqrt
(
a
[
0
]
*
a
[
0
]
+
a
[
1
]
*
a
[
1
]
+
a
[
2
]
*
a
[
2
]);
return
[
a
[
0
]
/
b
,
a
[
1
]
/
b
,
a
[
2
]
/
b
]},
b
=
b
|
1
,
d
=
a
.
width
,
e
=
a
.
height
,
f
=
document
.
createElement
(
"
canvas
"
);
f
.
width
=
d
;
f
.
height
=
e
;
var
g
=
f
.
getContext
(
"
2d
"
);
g
.
drawImage
(
a
,
0
,
0
);
for
(
var
h
=
g
.
getImageData
(
0
,
0
,
d
,
e
).
data
,
j
=
g
.
createImageData
(
d
,
e
),
k
=
j
.
data
,
l
=
0
;
l
<
d
;
l
++
)
for
(
var
o
=
0
;
o
<
e
;
o
++
){
var
m
=
o
-
1
<
0
?
0
:
o
-
1
,
p
=
o
+
1
>
e
-
1
?
e
-
1
:
o
+
1
,
r
=
l
-
1
<
0
?
0
:
l
-
1
,
n
=
l
+
1
>
d
-
1
?
d
-
1
:
l
+
1
,
q
=
[],
u
=
[
0
,
0
,
h
[(
o
*
d
+
l
)
*
4
]
/
255
*
b
];
q
.
push
([
-
1
,
0
,
h
[(
o
*
d
+
r
)
*
4
]
/
255
*
b
]);
q
.
push
([
-
1
,
-
1
,
h
[(
m
*
d
+
r
)
*
4
]
/
255
*
b
]);
q
.
push
([
0
,
-
1
,
h
[(
m
*
d
+
l
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
-
1
,
h
[(
m
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
0
,
h
[(
o
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
1
,
1
,
h
[(
p
*
d
+
n
)
*
4
]
/
255
*
b
]);
q
.
push
([
0
,
1
,
h
[(
p
*
d
+
l
)
*
4
]
/
255
*
b
]);
q
.
push
([
-
1
,
1
,
h
[(
p
*
d
+
r
)
*
4
]
/
255
*
b
]);
m
=
[];
r
=
q
.
length
;
for
(
p
=
0
;
p
<
r
;
p
++
){
var
n
=
q
[
p
],
t
=
q
[(
p
+
1
)
%
r
],
n
=
[
n
[
0
]
-
u
[
0
],
n
[
1
]
-
u
[
1
],
n
[
2
]
-
u
[
2
]],
t
=
[
t
[
0
]
-
u
[
0
],
t
[
1
]
-
u
[
1
],
t
[
2
]
-
u
[
2
]];
m
.
push
(
c
([
n
[
1
]
*
t
[
2
]
-
n
[
2
]
*
t
[
1
],
n
[
2
]
*
t
[
0
]
-
n
[
0
]
*
t
[
2
],
n
[
0
]
*
t
[
1
]
-
n
[
1
]
*
t
[
0
]]))}
q
=
[
0
,
0
,
0
];
for
(
p
=
0
;
p
<
m
.
length
;
p
++
){
q
[
0
]
=
q
[
0
]
+
m
[
p
][
0
];
q
[
1
]
=
q
[
1
]
+
m
[
p
][
1
];
q
[
2
]
=
q
[
2
]
+
m
[
p
][
2
]}
q
[
0
]
=
q
[
0
]
/
m
.
length
;
q
[
1
]
=
q
[
1
]
/
m
.
length
;
q
[
2
]
=
q
[
2
]
/
m
.
length
;
u
=
(
o
*
d
+
l
)
*
4
;
k
[
u
]
=
(
q
[
0
]
+
1
)
/
2
*
255
|
0
;
k
[
u
+
1
]
=
(
q
[
1
]
+
1
)
/
2
*
255
|
0
;
k
[
u
+
2
]
=
q
[
2
]
*
255
|
0
;
k
[
u
+
3
]
=
255
}
g
.
putImageData
(
j
,
0
,
0
);
return
f
},
generateDataTexture
:
function
(
a
,
b
,
c
){
for
(
var
d
=
a
*
b
,
e
=
new
Uint8Array
(
3
*
d
),
f
=
Math
.
floor
(
c
.
r
*
255
),
g
=
Math
.
floor
(
c
.
g
*
255
),
c
=
Math
.
floor
(
c
.
b
*
255
),
h
=
0
;
h
<
d
;
h
++
){
e
[
h
*
3
]
=
f
;
e
[
h
*
3
+
1
]
=
g
;
e
[
h
*
3
+
2
]
=
c
}
a
=
new
THREE
.
DataTexture
(
e
,
a
,
b
,
THREE
.
RGBFormat
);
a
.
needsUpdate
=
true
;
return
a
}};
THREE
.
SceneUtils
=
{
showHierarchy
:
function
(
a
,
b
){
THREE
.
SceneUtils
.
traverseHierarchy
(
a
,
function
(
a
){
a
.
visible
=
b
})},
traverseHierarchy
:
function
(
a
,
b
){
var
c
,
d
,
e
=
a
.
children
.
length
;
for
(
d
=
0
;
d
<
e
;
d
++
){
c
=
a
.
children
[
d
];
b
(
c
);
THREE
.
SceneUtils
.
traverseHierarchy
(
c
,
b
)}},
createMultiMaterialObject
:
function
(
a
,
b
){
var
c
,
d
=
b
.
length
,
e
=
new
THREE
.
Object3D
;
for
(
c
=
0
;
c
<
d
;
c
++
){
var
f
=
new
THREE
.
Mesh
(
a
,
b
[
c
]);
e
.
add
(
f
)}
return
e
},
cloneObject
:
function
(
a
){
var
b
;
if
(
a
instanceof
THREE
.
MorphAnimMesh
){
b
=
new
THREE
.
MorphAnimMesh
(
a
.
geometry
,
a
.
material
);
b
.
duration
=
a
.
duration
;
b
.
mirroredLoop
=
a
.
mirroredLoop
;
b
.
time
=
a
.
time
;
b
.
lastKeyframe
=
a
.
lastKeyframe
;
b
.
currentKeyframe
=
a
.
currentKeyframe
;
b
.
direction
=
a
.
direction
;
b
.
directionBackwards
=
a
.
directionBackwards
}
else
if
(
a
instanceof
THREE
.
SkinnedMesh
)
b
=
new
THREE
.
SkinnedMesh
(
a
.
geometry
,
a
.
material
);
else
if
(
a
instanceof
THREE
.
Mesh
)
b
=
new
THREE
.
Mesh
(
a
.
geometry
,
a
.
material
);
else
if
(
a
instanceof
THREE
.
Line
)
b
=
new
THREE
.
Line
(
a
.
geometry
,
a
.
material
,
a
.
type
);
else
if
(
a
instanceof
THREE
.
Ribbon
)
b
=
new
THREE
.
Ribbon
(
a
.
geometry
,
a
.
material
);
else
if
(
a
instanceof
THREE
.
ParticleSystem
){
b
=
new
THREE
.
ParticleSystem
(
a
.
geometry
,
a
.
material
);
b
.
sortParticles
=
a
.
sortParticles
}
else
if
(
a
instanceof
THREE
.
Particle
)
b
=
new
THREE
.
Particle
(
a
.
material
);
else
if
(
a
instanceof
THREE
.
Sprite
){
b
=
new
THREE
.
Sprite
({});
b
.
color
.
copy
(
a
.
color
);
b
.
map
=
a
.
map
;
b
.
blending
=
a
.
blending
;
b
.
useScreenCoordinates
=
a
.
useScreenCoordinates
;
b
.
mergeWith3D
=
a
.
mergeWith3D
;
b
.
affectedByDistance
=
a
.
affectedByDistance
;
b
.
scaleByViewport
=
a
.
scaleByViewport
;
b
.
alignment
=
a
.
alignment
;
b
.
rotation3d
.
copy
(
a
.
rotation3d
);
...
...
build/custom/ThreeExtras.js
浏览文件 @
bcebd785
...
...
@@ -21,10 +21,10 @@ b.vertices.length+1;w=e.clone();o=e.clone();m>=p&&m>=q&&m>=r||q>=p&&q>=m&&q>=r?(
f
.
lerpSelf
(
e
.
vertexColors
[
1
],
0.5
),
g
=
e
.
vertexColors
[
2
].
clone
(),
g
.
lerpSelf
(
e
.
vertexColors
[
3
],
0.5
),
w
.
vertexColors
[
1
].
copy
(
f
),
w
.
vertexColors
[
2
].
copy
(
g
),
o
.
vertexColors
[
0
].
copy
(
f
),
o
.
vertexColors
[
3
].
copy
(
g
)),
e
=
0
):(
m
=
l
.
clone
(),
m
.
lerpSelf
(
n
,
0.5
),
l
=
k
.
clone
(),
l
.
lerpSelf
(
j
,
0.5
),
w
.
a
=
f
,
w
.
b
=
g
,
w
.
c
=
s
,
w
.
d
=
t
,
o
.
a
=
t
,
o
.
b
=
s
,
o
.
c
=
h
,
o
.
d
=
i
,
4
===
e
.
vertexNormals
.
length
&&
(
f
=
e
.
vertexNormals
[
1
].
clone
(),
f
.
lerpSelf
(
e
.
vertexNormals
[
2
],
0.5
),
g
=
e
.
vertexNormals
[
3
].
clone
(),
g
.
lerpSelf
(
e
.
vertexNormals
[
0
],
0.5
),
w
.
vertexNormals
[
2
].
copy
(
f
),
w
.
vertexNormals
[
3
].
copy
(
g
),
o
.
vertexNormals
[
0
].
copy
(
g
),
o
.
vertexNormals
[
1
].
copy
(
f
)),
4
===
e
.
vertexColors
.
length
&&
(
f
=
e
.
vertexColors
[
1
].
clone
(),
f
.
lerpSelf
(
e
.
vertexColors
[
2
],
0.5
),
g
=
e
.
vertexColors
[
3
].
clone
(),
g
.
lerpSelf
(
e
.
vertexColors
[
0
],
0.5
),
w
.
vertexColors
[
2
].
copy
(
f
),
w
.
vertexColors
[
3
].
copy
(
g
),
o
.
vertexColors
[
0
].
copy
(
g
),
o
.
vertexColors
[
1
].
copy
(
f
)),
e
=
1
);
x
.
push
(
w
,
o
);
b
.
vertices
.
push
(
m
,
l
);
f
=
0
;
for
(
g
=
b
.
faceVertexUvs
.
length
;
f
<
g
;
f
++
)
b
.
faceVertexUvs
[
f
].
length
&&
(
j
=
b
.
faceVertexUvs
[
f
][
c
],
o
=
j
[
0
],
h
=
j
[
1
],
w
=
j
[
2
],
j
=
j
[
3
],
0
===
e
?(
l
=
o
.
clone
(),
l
.
lerpSelf
(
h
,
0.5
),
n
=
w
.
clone
(),
n
.
lerpSelf
(
j
,
0.5
),
o
=
[
o
.
clone
(),
l
.
clone
(),
n
.
clone
(),
j
.
clone
()],
h
=
[
l
.
clone
(),
h
.
clone
(),
w
.
clone
(),
n
.
clone
()]):(
l
=
h
.
clone
(),
l
.
lerpSelf
(
w
,
0.5
),
n
=
j
.
clone
(),
n
.
lerpSelf
(
o
,
0.5
),
o
=
[
o
.
clone
(),
h
.
clone
(),
l
.
clone
(),
n
.
clone
()],
h
=
[
n
.
clone
(),
l
.
clone
(),
w
.
clone
(),
j
.
clone
()]),
z
[
f
].
push
(
o
,
h
))}
else
{
x
.
push
(
e
);
f
=
0
;
for
(
g
=
b
.
faceVertexUvs
.
length
;
f
<
g
;
f
++
)
z
[
f
].
push
(
b
.
faceVertexUvs
[
f
][
c
])}
b
.
faces
=
x
;
b
.
faceVertexUvs
=
z
}};
THREE
.
GeometryUtils
.
random
=
THREE
.
Math
.
random16
;
THREE
.
GeometryUtils
.
__v1
=
new
THREE
.
Vector3
;
THREE
.
ImageUtils
=
{
crossOrigin
:
"
anonymous
"
,
loadTexture
:
function
(
b
,
a
,
c
){
var
d
=
new
THREE
.
Texture
(
void
0
,
a
),
a
=
new
THREE
.
ImageLoader
;
a
.
addEventListener
(
"
load
"
,
function
(
a
){
d
.
image
=
a
.
content
;
d
.
needsUpdate
=!
0
;
c
&&
c
(
this
)});
a
.
crossOrigin
=
this
.
crossOrigin
;
a
.
load
(
b
);
return
d
},
loadTextureCube
:
function
(
b
,
a
,
c
){
var
d
,
e
=
[],
f
=
new
THREE
.
Texture
(
e
,
a
),
a
=
e
.
loadCount
=
0
;
for
(
d
=
b
.
length
;
a
<
d
;
++
a
)
e
[
a
]
=
new
Image
,
e
[
a
].
onload
=
function
(){
e
.
loadCount
+=
1
;
6
===
e
.
loadCount
&&
(
f
.
needsUpdate
=!
0
);
c
&&
c
(
this
)},
e
[
a
].
crossOrigin
=
this
.
crossOrigin
,
e
[
a
].
src
=
b
[
a
];
return
f
},
getNormalMap
:
function
(
b
,
a
){
var
c
=
function
(
a
){
var
b
=
Math
.
sqrt
(
a
[
0
]
*
a
[
0
]
+
a
[
1
]
*
a
[
1
]
+
a
[
2
]
*
a
[
2
]);
return
[
a
[
0
]
/
b
,
a
[
1
]
/
b
,
a
[
2
]
/
b
]},
a
=
a
|
1
,
d
=
b
.
width
,
e
=
b
.
height
,
f
=
document
.
createElement
(
"
canvas
"
);
f
.
width
=
d
;
f
.
height
=
e
;
var
g
=
f
.
getContext
(
"
2d
"
);
g
.
drawImage
(
b
,
0
,
0
);
for
(
var
h
=
g
.
getImageData
(
0
,
0
,
d
,
e
).
data
,
i
=
g
.
createImageData
(
d
,
e
),
j
=
i
.
data
,
l
=
0
;
l
<
d
;
l
++
)
for
(
var
n
=
0
;
n
<
e
;
n
++
){
var
k
=
0
>
n
-
1
?
0
:
n
-
1
,
m
=
n
+
1
>
e
-
1
?
e
-
1
:
n
+
1
,
p
=
0
>
l
-
1
?
0
:
l
-
1
,
q
=
l
+
1
>
d
-
1
?
d
-
1
:
l
+
1
,
r
=
[],
s
=
[
0
,
0
,
h
[
4
*
(
n
*
d
+
l
)]
/
255
*
a
];
r
.
push
([
-
1
,
0
,
h
[
4
*
(
n
*
d
+
p
)]
/
255
*
a
]);
r
.
push
([
-
1
,
-
1
,
h
[
4
*
(
k
*
d
+
p
)]
/
255
*
a
]);
r
.
push
([
0
,
-
1
,
h
[
4
*
(
k
*
d
+
l
)]
/
255
*
a
]);
r
.
push
([
1
,
-
1
,
h
[
4
*
(
k
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
1
,
0
,
h
[
4
*
(
n
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
1
,
1
,
h
[
4
*
(
m
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
0
,
1
,
h
[
4
*
(
m
*
d
+
l
)]
/
255
*
a
]);
r
.
push
([
-
1
,
1
,
h
[
4
*
(
m
*
d
+
p
)]
/
255
*
a
]);
k
=
[];
p
=
r
.
length
;
for
(
m
=
0
;
m
<
p
;
m
++
){
var
q
=
r
[
m
],
t
=
r
[(
m
+
1
)
%
p
],
q
=
[
q
[
0
]
-
s
[
0
],
q
[
1
]
-
s
[
1
],
q
[
2
]
-
s
[
2
]],
t
=
[
t
[
0
]
-
s
[
0
],
t
[
1
]
-
s
[
1
],
t
[
2
]
-
s
[
2
]];
k
.
push
(
c
([
q
[
1
]
*
t
[
2
]
-
q
[
2
]
*
t
[
1
],
q
[
2
]
*
t
[
0
]
-
q
[
0
]
*
t
[
2
],
q
[
0
]
*
t
[
1
]
-
q
[
1
]
*
t
[
0
]]))}
r
=
[
0
,
0
,
0
];
for
(
m
=
0
;
m
<
k
.
length
;
m
++
)
r
[
0
]
+=
k
[
m
][
0
],
r
[
1
]
+=
k
[
m
][
1
],
r
[
2
]
+=
k
[
m
][
2
];
r
[
0
]
/=
k
.
length
;
r
[
1
]
/=
k
.
length
;
r
[
2
]
/=
k
.
length
;
s
=
4
*
(
n
*
d
+
l
);
j
[
s
]
=
255
*
((
r
[
0
]
+
1
)
/
2
)
|
0
;
j
[
s
+
1
]
=
255
*
((
r
[
1
]
+
1
)
/
2
)
|
0
;
j
[
s
+
2
]
=
255
*
r
[
2
]
|
0
;
j
[
s
+
3
]
=
255
}
g
.
putImageData
(
i
,
0
,
0
);
return
f
},
generateDataTexture
:
function
(
b
,
a
,
c
){
for
(
var
d
=
b
*
a
,
e
=
new
Uint8Array
(
3
*
d
),
f
=
Math
.
floor
(
255
*
c
.
r
),
g
=
Math
.
floor
(
255
*
c
.
g
),
c
=
Math
.
floor
(
255
*
c
.
b
),
h
=
0
;
h
<
d
;
h
++
)
e
[
3
*
h
]
=
f
,
e
[
3
*
h
+
1
]
=
g
,
e
[
3
*
h
+
2
]
=
c
;
b
=
new
THREE
.
DataTexture
(
e
,
b
,
a
,
THREE
.
RGBFormat
);
b
.
needsUpdate
=!
0
;
return
b
}};
THREE
.
ImageUtils
=
{
crossOrigin
:
"
anonymous
"
,
loadTexture
:
function
(
b
,
a
,
c
,
d
){
var
e
=
new
THREE
.
Texture
(
void
0
,
a
),
a
=
new
THREE
.
ImageLoader
;
a
.
addEventListener
(
"
load
"
,
function
(
a
){
e
.
image
=
a
.
content
;
e
.
needsUpdate
=!
0
;
c
&&
c
()});
a
.
addEventListener
(
"
error
"
,
function
(
a
){
d
&&
d
(
a
.
message
)});
a
.
crossOrigin
=
this
.
crossOrigin
;
a
.
load
(
b
);
return
e
},
loadTextureCube
:
function
(
b
,
a
,
c
){
var
d
,
e
=
[],
f
=
new
THREE
.
Texture
(
e
,
a
),
a
=
e
.
loadCount
=
0
;
for
(
d
=
b
.
length
;
a
<
d
;
++
a
)
e
[
a
]
=
new
Image
,
e
[
a
].
onload
=
function
(){
e
.
loadCount
+=
1
;
6
===
e
.
loadCount
&&
(
f
.
needsUpdate
=
!
0
,
c
&&
c
())},
e
[
a
].
crossOrigin
=
this
.
crossOrigin
,
e
[
a
].
src
=
b
[
a
];
return
f
},
getNormalMap
:
function
(
b
,
a
){
var
c
=
function
(
a
){
var
b
=
Math
.
sqrt
(
a
[
0
]
*
a
[
0
]
+
a
[
1
]
*
a
[
1
]
+
a
[
2
]
*
a
[
2
]);
return
[
a
[
0
]
/
b
,
a
[
1
]
/
b
,
a
[
2
]
/
b
]},
a
=
a
|
1
,
d
=
b
.
width
,
e
=
b
.
height
,
f
=
document
.
createElement
(
"
canvas
"
);
f
.
width
=
d
;
f
.
height
=
e
;
var
g
=
f
.
getContext
(
"
2d
"
);
g
.
drawImage
(
b
,
0
,
0
);
for
(
var
h
=
g
.
getImageData
(
0
,
0
,
d
,
e
).
data
,
i
=
g
.
createImageData
(
d
,
e
),
j
=
i
.
data
,
l
=
0
;
l
<
d
;
l
++
)
for
(
var
n
=
0
;
n
<
e
;
n
++
){
var
k
=
0
>
n
-
1
?
0
:
n
-
1
,
m
=
n
+
1
>
e
-
1
?
e
-
1
:
n
+
1
,
p
=
0
>
l
-
1
?
0
:
l
-
1
,
q
=
l
+
1
>
d
-
1
?
d
-
1
:
l
+
1
,
r
=
[],
s
=
[
0
,
0
,
h
[
4
*
(
n
*
d
+
l
)]
/
255
*
a
];
r
.
push
([
-
1
,
0
,
h
[
4
*
(
n
*
d
+
p
)]
/
255
*
a
]);
r
.
push
([
-
1
,
-
1
,
h
[
4
*
(
k
*
d
+
p
)]
/
255
*
a
]);
r
.
push
([
0
,
-
1
,
h
[
4
*
(
k
*
d
+
l
)]
/
255
*
a
]);
r
.
push
([
1
,
-
1
,
h
[
4
*
(
k
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
1
,
0
,
h
[
4
*
(
n
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
1
,
1
,
h
[
4
*
(
m
*
d
+
q
)]
/
255
*
a
]);
r
.
push
([
0
,
1
,
h
[
4
*
(
m
*
d
+
l
)]
/
255
*
a
]);
r
.
push
([
-
1
,
1
,
h
[
4
*
(
m
*
d
+
p
)]
/
255
*
a
]);
k
=
[];
p
=
r
.
length
;
for
(
m
=
0
;
m
<
p
;
m
++
){
var
q
=
r
[
m
],
t
=
r
[(
m
+
1
)
%
p
],
q
=
[
q
[
0
]
-
s
[
0
],
q
[
1
]
-
s
[
1
],
q
[
2
]
-
s
[
2
]],
t
=
[
t
[
0
]
-
s
[
0
],
t
[
1
]
-
s
[
1
],
t
[
2
]
-
s
[
2
]];
k
.
push
(
c
([
q
[
1
]
*
t
[
2
]
-
q
[
2
]
*
t
[
1
],
q
[
2
]
*
t
[
0
]
-
q
[
0
]
*
t
[
2
],
q
[
0
]
*
t
[
1
]
-
q
[
1
]
*
t
[
0
]]))}
r
=
[
0
,
0
,
0
];
for
(
m
=
0
;
m
<
k
.
length
;
m
++
)
r
[
0
]
+=
k
[
m
][
0
],
r
[
1
]
+=
k
[
m
][
1
],
r
[
2
]
+=
k
[
m
][
2
];
r
[
0
]
/=
k
.
length
;
r
[
1
]
/=
k
.
length
;
r
[
2
]
/=
k
.
length
;
s
=
4
*
(
n
*
d
+
l
);
j
[
s
]
=
255
*
((
r
[
0
]
+
1
)
/
2
)
|
0
;
j
[
s
+
1
]
=
255
*
((
r
[
1
]
+
1
)
/
2
)
|
0
;
j
[
s
+
2
]
=
255
*
r
[
2
]
|
0
;
j
[
s
+
3
]
=
255
}
g
.
putImageData
(
i
,
0
,
0
);
return
f
},
generateDataTexture
:
function
(
b
,
a
,
c
){
for
(
var
d
=
b
*
a
,
e
=
new
Uint8Array
(
3
*
d
),
f
=
Math
.
floor
(
255
*
c
.
r
),
g
=
Math
.
floor
(
255
*
c
.
g
),
c
=
Math
.
floor
(
255
*
c
.
b
),
h
=
0
;
h
<
d
;
h
++
)
e
[
3
*
h
]
=
f
,
e
[
3
*
h
+
1
]
=
g
,
e
[
3
*
h
+
2
]
=
c
;
b
=
new
THREE
.
DataTexture
(
e
,
b
,
a
,
THREE
.
RGBFormat
);
b
.
needsUpdate
=!
0
;
return
b
}};
THREE
.
SceneUtils
=
{
showHierarchy
:
function
(
b
,
a
){
THREE
.
SceneUtils
.
traverseHierarchy
(
b
,
function
(
b
){
b
.
visible
=
a
})},
traverseHierarchy
:
function
(
b
,
a
){
var
c
,
d
,
e
=
b
.
children
.
length
;
for
(
d
=
0
;
d
<
e
;
d
++
)
c
=
b
.
children
[
d
],
a
(
c
),
THREE
.
SceneUtils
.
traverseHierarchy
(
c
,
a
)},
createMultiMaterialObject
:
function
(
b
,
a
){
var
c
,
d
=
a
.
length
,
e
=
new
THREE
.
Object3D
;
for
(
c
=
0
;
c
<
d
;
c
++
){
var
f
=
new
THREE
.
Mesh
(
b
,
a
[
c
]);
e
.
add
(
f
)}
return
e
},
cloneObject
:
function
(
b
){
var
a
;
b
instanceof
THREE
.
MorphAnimMesh
?(
a
=
new
THREE
.
MorphAnimMesh
(
b
.
geometry
,
b
.
material
),
a
.
duration
=
b
.
duration
,
a
.
mirroredLoop
=
b
.
mirroredLoop
,
a
.
time
=
b
.
time
,
a
.
lastKeyframe
=
b
.
lastKeyframe
,
a
.
currentKeyframe
=
b
.
currentKeyframe
,
a
.
direction
=
b
.
direction
,
a
.
directionBackwards
=
b
.
directionBackwards
):
b
instanceof
THREE
.
SkinnedMesh
?
a
=
new
THREE
.
SkinnedMesh
(
b
.
geometry
,
b
.
material
):
b
instanceof
THREE
.
Mesh
?
a
=
new
THREE
.
Mesh
(
b
.
geometry
,
b
.
material
):
b
instanceof
THREE
.
Line
?
a
=
new
THREE
.
Line
(
b
.
geometry
,
b
.
material
,
b
.
type
):
b
instanceof
THREE
.
Ribbon
?
a
=
new
THREE
.
Ribbon
(
b
.
geometry
,
b
.
material
):
b
instanceof
THREE
.
ParticleSystem
?
(
a
=
new
THREE
.
ParticleSystem
(
b
.
geometry
,
b
.
material
),
a
.
sortParticles
=
b
.
sortParticles
):
b
instanceof
THREE
.
Particle
?
a
=
new
THREE
.
Particle
(
b
.
material
):
b
instanceof
THREE
.
Sprite
?(
a
=
new
THREE
.
Sprite
({}),
a
.
color
.
copy
(
b
.
color
),
a
.
map
=
b
.
map
,
a
.
blending
=
b
.
blending
,
a
.
useScreenCoordinates
=
b
.
useScreenCoordinates
,
a
.
mergeWith3D
=
b
.
mergeWith3D
,
a
.
affectedByDistance
=
b
.
affectedByDistance
,
a
.
scaleByViewport
=
b
.
scaleByViewport
,
a
.
alignment
=
b
.
alignment
,
a
.
rotation3d
.
copy
(
b
.
rotation3d
),
a
.
rotation
=
b
.
rotation
,
a
.
opacity
=
b
.
opacity
,
...
...
src/extras/ImageUtils.js
浏览文件 @
bcebd785
...
...
@@ -7,19 +7,27 @@ THREE.ImageUtils = {
crossOrigin
:
'
anonymous
'
,
loadTexture
:
function
(
url
,
mapping
,
callback
)
{
loadTexture
:
function
(
url
,
mapping
,
onLoad
,
onError
)
{
var
texture
=
new
THREE
.
Texture
(
undefined
,
mapping
);
var
loader
=
new
THREE
.
ImageLoader
();
loader
.
addEventListener
(
'
load
'
,
function
(
event
)
{
texture
.
image
=
event
.
content
;
texture
.
needsUpdate
=
true
;
if
(
callback
)
callback
(
this
);
if
(
onLoad
)
onLoad
();
}
);
loader
.
addEventListener
(
'
error
'
,
function
(
event
)
{
if
(
onError
)
onError
(
event
.
message
);
}
);
loader
.
crossOrigin
=
this
.
crossOrigin
;
loader
.
load
(
url
);
...
...
@@ -27,7 +35,7 @@ THREE.ImageUtils = {
},
loadTextureCube
:
function
(
array
,
mapping
,
callback
)
{
loadTextureCube
:
function
(
array
,
mapping
,
onLoad
)
{
var
i
,
l
,
images
=
[],
texture
=
new
THREE
.
Texture
(
images
,
mapping
);
...
...
@@ -39,8 +47,13 @@ THREE.ImageUtils = {
images
[
i
].
onload
=
function
()
{
images
.
loadCount
+=
1
;
if
(
images
.
loadCount
===
6
)
texture
.
needsUpdate
=
true
;
if
(
callback
)
callback
(
this
);
if
(
images
.
loadCount
===
6
)
{
texture
.
needsUpdate
=
true
;
if
(
onLoad
)
onLoad
();
}
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录