Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
88b4779c
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,体验更适合开发者的 AI 搜索 >>
提交
88b4779c
编写于
6月 25, 2014
作者:
O
OpenShift guest
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use recursive projectobject to fix visiblility and make renderdata smaller
上级
ddbbcae1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
152 addition
and
100 deletion
+152
-100
src/renderers/WebGLRenderer.js
src/renderers/WebGLRenderer.js
+152
-100
未找到文件。
src/renderers/WebGLRenderer.js
浏览文件 @
88b4779c
...
...
@@ -28,6 +28,10 @@ THREE.WebGLRenderer = function ( parameters ) {
_clearColor
=
new
THREE
.
Color
(
0x000000
),
_clearAlpha
=
0
;
var
OpaqueObjects
=
[];
var
transparentObjects
=
[];
var
_sortObjects
=
true
;
// public properties
...
...
@@ -3216,6 +3220,20 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function
reversePainterSortStable
(
a
,
b
)
{
if
(
a
.
z
!==
b
.
z
)
{
return
a
.
z
-
b
.
z
;
}
else
{
return
a
.
id
-
b
.
id
;
}
};
function
numericalSort
(
a
,
b
)
{
return
b
[
0
]
-
a
[
0
];
...
...
@@ -3285,52 +3303,17 @@ THREE.WebGLRenderer = function ( parameters ) {
// set matrices for regular objects (frustum culled)
renderList
=
scene
.
__webglObjects
;
for
(
i
=
0
,
il
=
renderList
.
length
;
i
<
il
;
i
++
)
{
webglObject
=
renderList
[
i
];
object
=
webglObject
.
object
;
webglObject
.
id
=
i
;
webglObject
.
render
=
false
;
if
(
object
.
visible
)
{
if
(
object
.
frustumCulled
===
false
||
_frustum
.
intersectsObject
(
object
)
===
true
)
{
setupMatrices
(
object
,
camera
);
unrollBufferMaterial
(
webglObject
);
webglObject
.
render
=
true
;
if
(
this
.
sortObjects
===
true
)
{
if
(
object
.
renderDepth
!==
null
)
{
webglObject
.
z
=
object
.
renderDepth
;
}
else
{
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
applyProjection
(
_projScreenMatrix
);
webglObject
.
z
=
_vector3
.
z
;
}
}
}
}
}
OpaqueObjects
.
length
=
0
;
transparentObjects
.
length
=
0
;
_sortObjects
=
this
.
sortObjects
;
projectObject
(
scene
,
scene
,
camera
);
if
(
this
.
sortObjects
)
{
renderList
.
sort
(
painterSortStable
);
OpaqueObjects
.
sort
(
painterSortStable
);
transparentObjects
.
sort
(
reversePainterSortStable
);
}
...
...
@@ -3362,7 +3345,8 @@ THREE.WebGLRenderer = function ( parameters ) {
this
.
setDepthWrite
(
material
.
depthWrite
);
setPolygonOffset
(
material
.
polygonOffset
,
material
.
polygonOffsetFactor
,
material
.
polygonOffsetUnits
);
renderObjects
(
scene
.
__webglObjects
,
false
,
''
,
camera
,
lights
,
fog
,
true
,
material
);
renderObjects
(
OpaqueObjects
,
camera
,
lights
,
fog
,
true
,
material
);
renderObjects
(
transparentObjects
,
camera
,
lights
,
fog
,
true
,
material
);
renderObjectsImmediate
(
scene
.
__webglObjectsImmediate
,
''
,
camera
,
lights
,
fog
,
false
,
material
);
}
else
{
...
...
@@ -3373,12 +3357,12 @@ THREE.WebGLRenderer = function ( parameters ) {
this
.
setBlending
(
THREE
.
NoBlending
);
renderObjects
(
scene
.
__webglObjects
,
true
,
'
opaque
'
,
camera
,
lights
,
fog
,
false
,
material
);
renderObjects
(
OpaqueObjects
,
camera
,
lights
,
fog
,
false
,
material
);
renderObjectsImmediate
(
scene
.
__webglObjectsImmediate
,
'
opaque
'
,
camera
,
lights
,
fog
,
false
,
material
);
// transparent pass (back-to-front order)
renderObjects
(
scene
.
__webglObjects
,
false
,
'
transparent
'
,
camera
,
lights
,
fog
,
true
,
material
);
renderObjects
(
transparentObjects
,
camera
,
lights
,
fog
,
true
,
material
);
renderObjectsImmediate
(
scene
.
__webglObjectsImmediate
,
'
transparent
'
,
camera
,
lights
,
fog
,
true
,
material
);
}
...
...
@@ -3404,6 +3388,63 @@ THREE.WebGLRenderer = function ( parameters ) {
// _gl.finish();
};
function
projectObject
(
scene
,
object
,
camera
){
if
(
object
.
visible
)
{
var
webglObjects
=
scene
.
__webglObjects
[
object
.
uuid
];
if
(
webglObjects
&&
(
object
.
frustumCulled
===
false
||
_frustum
.
intersectsObject
(
object
)
===
true
)
)
{
updateObject
(
scene
,
object
);
setupMatrices
(
object
,
camera
);
for
(
var
i
=
0
,
l
=
webglObjects
.
length
;
i
<
l
;
i
++
){
var
webglObject
=
webglObjects
[
i
];
unrollBufferMaterial
(
webglObject
);
if
(
webglObject
.
isTransparent
){
transparentObjects
.
push
(
webglObject
);
}
else
{
OpaqueObjects
.
push
(
webglObject
);
}
webglObject
.
render
=
true
;
if
(
_sortObjects
===
true
)
{
if
(
object
.
renderDepth
!==
null
)
{
webglObject
.
z
=
object
.
renderDepth
;
}
else
{
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
applyProjection
(
_projScreenMatrix
);
webglObject
.
z
=
_vector3
.
z
;
}
}
}
}
for
(
var
i
=
0
,
l
=
object
.
children
.
length
;
i
<
l
;
i
++
)
{
projectObject
(
scene
,
object
.
children
[
i
],
camera
);
}
}
}
function
renderPlugins
(
plugins
,
scene
,
camera
)
{
...
...
@@ -3447,61 +3488,44 @@ THREE.WebGLRenderer = function ( parameters ) {
};
function
renderObjects
(
renderList
,
reverse
,
materialType
,
camera
,
lights
,
fog
,
useBlending
,
overrideMaterial
)
{
var
webglObject
,
object
,
buffer
,
material
,
start
,
end
,
delta
;
function
renderObjects
(
renderList
,
camera
,
lights
,
fog
,
useBlending
,
overrideMaterial
)
{
if
(
reverse
)
{
var
webglObject
,
object
,
buffer
,
material
;
start
=
renderList
.
length
-
1
;
end
=
-
1
;
delta
=
-
1
;
}
else
{
start
=
0
;
end
=
renderList
.
length
;
delta
=
1
;
}
for
(
var
i
=
start
;
i
!==
end
;
i
+=
delta
)
{
for
(
var
i
=
renderList
.
length
-
1
;
i
!==
-
1
;
i
--
)
{
webglObject
=
renderList
[
i
];
if
(
webglObject
.
render
)
{
object
=
webglObject
.
object
;
buffer
=
webglObject
.
buffer
;
if
(
overrideMaterial
)
{
object
=
webglObject
.
object
;
buffer
=
webglObject
.
buffer
;
material
=
overrideMaterial
;
if
(
overrideMaterial
)
{
}
else
{
material
=
overrideMaterial
;
material
=
webglObject
[
materialType
];
}
else
{
if
(
!
material
)
continue
;
material
=
webglObject
.
material
;
if
(
useBlending
)
_this
.
setBlending
(
material
.
blending
,
material
.
blendEquation
,
material
.
blendSrc
,
material
.
blendDst
)
;
if
(
!
material
)
continue
;
_this
.
setDepthTest
(
material
.
depthTest
);
_this
.
setDepthWrite
(
material
.
depthWrite
);
setPolygonOffset
(
material
.
polygonOffset
,
material
.
polygonOffsetFactor
,
material
.
polygonOffsetUnits
);
if
(
useBlending
)
_this
.
setBlending
(
material
.
blending
,
material
.
blendEquation
,
material
.
blendSrc
,
material
.
blendDst
);
}
_this
.
setDepthTest
(
material
.
depthTest
);
_this
.
setDepthWrite
(
material
.
depthWrite
);
setPolygonOffset
(
material
.
polygonOffset
,
material
.
polygonOffsetFactor
,
material
.
polygonOffsetUnits
);
_this
.
setMaterialFaces
(
material
);
}
if
(
buffer
instanceof
THREE
.
BufferGeometry
)
{
_this
.
setMaterialFaces
(
material
);
_this
.
renderBufferDirect
(
camera
,
lights
,
fog
,
material
,
buffer
,
object
);
if
(
buffer
instanceof
THREE
.
BufferGeometry
)
{
}
else
{
_this
.
renderBufferDirect
(
camera
,
lights
,
fog
,
material
,
buffer
,
object
);
_this
.
renderBuffer
(
camera
,
lights
,
fog
,
material
,
buffer
,
object
);
}
else
{
}
_this
.
renderBuffer
(
camera
,
lights
,
fog
,
material
,
buffer
,
object
);
}
...
...
@@ -3603,11 +3627,15 @@ THREE.WebGLRenderer = function ( parameters ) {
globject
.
transparent
=
material
;
globject
.
opaque
=
null
;
globject
.
material
=
material
;
globject
.
isTransparent
=
true
;
}
else
{
globject
.
opaque
=
material
;
globject
.
transparent
=
null
;
globject
.
material
=
material
;
globject
.
isTransparent
=
false
;
}
...
...
@@ -3619,11 +3647,15 @@ THREE.WebGLRenderer = function ( parameters ) {
globject
.
transparent
=
material
;
globject
.
opaque
=
null
;
globject
.
material
=
material
;
globject
.
isTransparent
=
true
;
}
else
{
globject
.
opaque
=
material
;
globject
.
transparent
=
null
;
globject
.
material
=
material
;
globject
.
isTransparent
=
false
;
}
...
...
@@ -3639,7 +3671,7 @@ THREE.WebGLRenderer = function ( parameters ) {
if
(
!
scene
.
__webglObjects
)
{
scene
.
__webglObjects
=
[]
;
scene
.
__webglObjects
=
{}
;
scene
.
__webglObjectsImmediate
=
[];
scene
.
__webglSprites
=
[];
scene
.
__webglFlares
=
[];
...
...
@@ -3662,27 +3694,27 @@ THREE.WebGLRenderer = function ( parameters ) {
// update must be called after objects adding / removal
for
(
var
o
=
0
,
ol
=
scene
.
__webglObjects
.
length
;
o
<
ol
;
o
++
)
{
//
for ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) {
var
object
=
scene
.
__webglObjects
[
o
].
object
;
//
var object = scene.__webglObjects[ o ].object;
// TODO: Remove this hack (WebGLRenderer refactoring)
if
(
object
.
__webglInit
===
undefined
)
{
//
if ( object.__webglInit === undefined ) {
if
(
object
.
__webglActive
!==
undefined
)
{
//
if ( object.__webglActive !== undefined ) {
removeObject
(
object
,
scene
);
//
removeObject( object, scene );
}
//
}
addObject
(
object
,
scene
);
//
addObject( object, scene );
}
//
}
updateObject
(
scene
,
object
);
//
updateObject(scene, object );
}
//
}
};
...
...
@@ -3755,7 +3787,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
if
(
object
.
__webglActive
===
undefined
)
{
if
(
object
.
__webglActive
===
undefined
)
{
if
(
object
instanceof
THREE
.
Mesh
)
{
...
...
@@ -3765,6 +3797,13 @@ THREE.WebGLRenderer = function ( parameters ) {
addBuffer
(
scene
.
__webglObjects
,
geometry
,
object
);
}
else
{
for
(
g
in
geometry
.
geometryGroups
)
{
geometryGroup
=
geometry
.
geometryGroups
[
g
];
addBuffer
(
scene
.
__webglObjects
,
geometryGroup
,
object
);
}
}
}
else
if
(
object
instanceof
THREE
.
Line
||
...
...
@@ -3799,7 +3838,8 @@ THREE.WebGLRenderer = function ( parameters ) {
material
=
object
.
material
;
if
(
geometry
.
geometryGroups
===
undefined
)
{
delete
scene
.
__webglObjects
[
object
.
uuid
];
geometry
.
makeGroups
(
material
instanceof
THREE
.
MeshFaceMaterial
,
_glExtensionElementIndexUint
?
4294967296
:
65535
);
}
...
...
@@ -3840,16 +3880,18 @@ THREE.WebGLRenderer = function ( parameters ) {
}
object
.
__webglActive
=
true
;
}
function
addBuffer
(
objlist
,
buffer
,
object
)
{
objlist
.
push
(
objlist
[
object
.
uuid
]
=
objlist
[
object
.
uuid
]
||
[];
objlist
[
object
.
uuid
]
.
push
(
{
id
:
null
,
buffer
:
buffer
,
object
:
object
,
opaque
:
null
,
transparent
:
null
,
material
:
null
,
isTransparent
:
false
,
z
:
0
}
);
...
...
@@ -3885,7 +3927,9 @@ THREE.WebGLRenderer = function ( parameters ) {
// check all geometry groups
if
(
geometry
.
buffersNeedUpdate
)
{
initGeometryGroups
(
scene
,
object
,
geometry
);
}
for
(
var
i
=
0
,
il
=
geometry
.
geometryGroupsList
.
length
;
i
<
il
;
i
++
)
{
...
...
@@ -3996,7 +4040,7 @@ THREE.WebGLRenderer = function ( parameters ) {
object
instanceof
THREE
.
PointCloud
||
object
instanceof
THREE
.
Line
)
{
removeInstances
(
scene
.
__webglObjects
,
object
);
removeInstances
WebglObjects
(
scene
.
__webglObjects
,
object
);
}
else
if
(
object
instanceof
THREE
.
Sprite
)
{
...
...
@@ -4015,6 +4059,14 @@ THREE.WebGLRenderer = function ( parameters ) {
delete
object
.
__webglActive
;
};
function
removeInstancesWebglObjects
(
objlist
,
object
)
{
delete
objlist
[
object
];
};
function
removeInstances
(
objlist
,
object
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录