Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
three.js-projector
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Дмитрий Никулин
three.js-projector
Commits
3dbee6b2
Commit
3dbee6b2
authored
Aug 02, 2016
by
Дмитрий Никулин
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Port upstream changes
parent
f03a0d5a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
659 additions
and
644 deletions
+659
-644
index.js
index.js
+659
-644
No files found.
index.js
View file @
3dbee6b2
...
...
@@ -5,42 +5,47 @@
*/
define
([
'three'
],
function
(
THREE
,
BSPTree
){
var
Projector
=
{};
var
Projector
=
{};
var
i
,
l
,
o
;
// counters
var
i
,
l
,
o
;
// counters
Projector
.
RenderableObject
=
function
()
{
THREE
.
RenderableObject
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
this
.
object
=
null
;
this
.
z
=
0
;
this
.
object
=
null
;
this
.
z
=
0
;
this
.
renderOrder
=
0
;
};
};
//
Projector
.
RenderableFace
=
function
()
{
THREE
.
RenderableFace
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
this
.
v1
=
new
THREE
.
RenderableVertex
();
this
.
v2
=
new
THREE
.
RenderableVertex
();
this
.
v3
=
new
THREE
.
RenderableVertex
();
this
.
v1
=
new
THREE
.
RenderableVertex
();
this
.
v2
=
new
THREE
.
RenderableVertex
();
this
.
v3
=
new
THREE
.
RenderableVertex
();
this
.
normalModel
=
new
THREE
.
Vector3
();
this
.
normalModel
=
new
THREE
.
Vector3
();
this
.
vertexNormalsModel
=
[
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
()
];
this
.
vertexNormalsLength
=
0
;
this
.
vertexNormalsModel
=
[
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
()
];
this
.
vertexNormalsLength
=
0
;
this
.
color
=
new
THREE
.
Color
();
this
.
material
=
null
;
this
.
uvs
=
[
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
()
];
this
.
priority
=
null
;
this
.
color
=
new
THREE
.
Color
();
this
.
material
=
null
;
this
.
uvs
=
[
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
()
];
this
.
z
=
0
;
this
.
z
=
0
;
this
.
renderOrder
=
0
;
};
};
Projector
.
RenderableFace
.
prototype
.
copy
=
function
(
face
){
//
THREE
.
RenderableFace
.
prototype
.
copy
=
function
(
face
){
this
.
v1
.
copy
(
face
.
v1
);
this
.
v2
.
copy
(
face
.
v2
);
this
.
v3
.
copy
(
face
.
v3
);
...
...
@@ -53,41 +58,44 @@ define(['three'], function(THREE, BSPTree){
this
.
color
=
face
.
color
;
this
.
material
=
face
.
material
;
this
.
uvs
=
face
.
uvs
;
this
.
priority
=
face
.
priority
;
this
.
renderOrder
=
face
.
renderOrder
;
};
Projector
.
RenderableVertex
=
function
()
{
THREE
.
RenderableVertex
=
function
()
{
this
.
position
=
new
THREE
.
Vector3
();
this
.
positionWorld
=
new
THREE
.
Vector3
();
this
.
positionScreen
=
new
THREE
.
Vector4
();
this
.
position
=
new
THREE
.
Vector3
();
this
.
positionWorld
=
new
THREE
.
Vector3
();
this
.
positionScreen
=
new
THREE
.
Vector4
();
this
.
visible
=
true
;
this
.
visible
=
true
;
};
};
THREE
.
RenderableVertex
.
prototype
.
copy
=
function
(
vertex
)
{
Projector
.
RenderableVertex
.
prototype
.
copy
=
function
(
vertex
)
{
this
.
positionWorld
.
copy
(
vertex
.
positionWorld
);
this
.
positionScreen
.
copy
(
vertex
.
positionScreen
);
this
.
positionWorld
.
copy
(
vertex
.
positionWorld
);
this
.
positionScreen
.
copy
(
vertex
.
positionScreen
);
};
};
//
Projector
.
RenderableLine
=
function
()
{
THREE
.
RenderableLine
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
this
.
v1
=
new
Projector
.
RenderableVertex
();
this
.
v2
=
new
Projector
.
RenderableVertex
();
this
.
v1
=
new
THREE
.
RenderableVertex
();
this
.
v2
=
new
THREE
.
RenderableVertex
();
this
.
vertexColors
=
[
new
THREE
.
Color
(),
new
THREE
.
Color
()
];
this
.
material
=
null
;
this
.
vertexColors
=
[
new
THREE
.
Color
(),
new
THREE
.
Color
()
];
this
.
material
=
null
;
this
.
z
=
0
;
this
.
z
=
0
;
this
.
renderOrder
=
0
;
};
Projector
.
RenderableLine
.
prototype
.
copy
=
function
(
line
){
};
THREE
.
RenderableLine
.
prototype
.
copy
=
function
(
line
){
this
.
v1
.
copy
(
line
.
v1
);
this
.
v2
.
copy
(
line
.
v2
);
...
...
@@ -95,777 +103,801 @@ define(['three'], function(THREE, BSPTree){
this
.
material
=
line
.
material
;
};
Projector
.
RenderableSprite
=
function
()
{
//
this
.
id
=
0
;
THREE
.
RenderableSprite
=
function
()
{
this
.
object
=
null
;
this
.
id
=
0
;
this
.
x
=
0
;
this
.
y
=
0
;
this
.
z
=
0
;
this
.
object
=
null
;
this
.
rotation
=
0
;
this
.
scale
=
new
THREE
.
Vector2
();
this
.
x
=
0
;
this
.
y
=
0
;
this
.
z
=
0
;
this
.
material
=
null
;
this
.
rotation
=
0
;
this
.
scale
=
new
THREE
.
Vector2
();
};
this
.
material
=
null
;
this
.
renderOrder
=
0
;
Projector
.
Projector
=
function
()
{
};
var
_object
,
_objectCount
,
_objectPool
=
[],
_objectPoolLength
=
0
,
_vertex
,
_camera
,
_vertexCount
,
_vertexPool
=
[],
_vertexPoolLength
=
0
,
_face
,
_faceCount
,
_facePool
=
[],
_facePoolLength
=
0
,
_line
,
_lineCount
,
_linePool
=
[],
_linePoolLength
=
0
,
_sprite
,
_spriteCount
,
_spritePool
=
[],
_spritePoolLength
=
0
,
//
_renderData
=
{
objects
:
[],
lights
:
[],
elements
:
[]
},
THREE
.
Projector
=
function
()
{
_vA
=
new
THREE
.
Vector3
(),
_vB
=
new
THREE
.
Vector3
(),
_vC
=
new
THREE
.
Vector3
(),
var
_object
,
_objectCount
,
_objectPool
=
[],
_objectPoolLength
=
0
,
_vertex
,
_camera
,
_vertexCount
,
_vertexPool
=
[],
_vertexPoolLength
=
0
,
_face
,
_faceCount
,
_facePool
=
[],
_facePoolLength
=
0
,
_line
,
_lineCount
,
_linePool
=
[],
_linePoolLength
=
0
,
_sprite
,
_spriteCount
,
_spritePool
=
[],
_spritePoolLength
=
0
,
_vector3
=
new
THREE
.
Vector3
(),
_vector4
=
new
THREE
.
Vector4
(),
_renderData
=
{
objects
:
[],
lights
:
[],
elements
:
[]
},
_clipBox
=
new
THREE
.
Box3
(
new
THREE
.
Vector3
(
-
1
,
-
1
,
-
1
),
new
THREE
.
Vector3
(
1
,
1
,
1
)
),
_boundingBox
=
new
THREE
.
Box3
(),
_points3
=
new
Array
(
3
),
_points4
=
new
Array
(
4
),
_vector3
=
new
THREE
.
Vector3
(),
_vector4
=
new
THREE
.
Vector4
(),
_viewMatrix
=
new
THREE
.
Matrix4
(),
_viewProjectionMatrix
=
new
THREE
.
Matrix4
(),
_clipBox
=
new
THREE
.
Box3
(
new
THREE
.
Vector3
(
-
1
,
-
1
,
-
1
),
new
THREE
.
Vector3
(
1
,
1
,
1
)
),
_boundingBox
=
new
THREE
.
Box3
(),
_points3
=
new
Array
(
3
),
_points4
=
new
Array
(
4
),
_modelMatrix
,
_modelV
iewProjectionMatrix
=
new
THREE
.
Matrix4
(),
_viewMatrix
=
new
THREE
.
Matrix4
()
,
_v
iewProjectionMatrix
=
new
THREE
.
Matrix4
(),
_normalMatrix
=
new
THREE
.
Matrix3
(),
_modelMatrix
,
_modelViewProjectionMatrix
=
new
THREE
.
Matrix4
(),
_frustum
=
new
THREE
.
Frustum
(),
_normalMatrix
=
new
THREE
.
Matrix3
(),
_clippedVertex1PositionScreen
=
new
THREE
.
Vector4
(),
_clippedVertex2PositionScreen
=
new
THREE
.
Vector4
();
_frustum
=
new
THREE
.
Frustum
(),
this
.
projectVector
=
function
(
vector
,
camera
)
{
_clippedVertex1PositionScreen
=
new
THREE
.
Vector4
(),
_clippedVertex2PositionScreen
=
new
THREE
.
Vector4
();
//
logger
.
warn
(
'THREE.Projector: .projectVector() is now vector.project().'
);
vector
.
project
(
camera
);
this
.
projectVector
=
function
(
vector
,
camera
)
{
};
console
.
warn
(
'THREE.Projector: .projectVector() is now vector.project().'
);
vector
.
project
(
camera
);
this
.
unprojectVector
=
function
(
vector
,
camera
)
{
};
logger
.
warn
(
'THREE.Projector: .unprojectVector() is now vector.unproject().'
);
vector
.
unproject
(
camera
);
this
.
unprojectVector
=
function
(
vector
,
camera
)
{
};
console
.
warn
(
'THREE.Projector: .unprojectVector() is now vector.unproject().'
);
vector
.
unproject
(
camera
);
this
.
pickingRay
=
function
(
vector
,
camera
)
{
};
logger
.
error
(
'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().'
);
this
.
pickingRay
=
function
(
vector
,
camera
)
{
}
;
console
.
error
(
'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().'
)
;
var
RenderList
=
function
()
{
};
var
normals
=
[];
var
uvs
=
[];
//
var
object
=
null
;
var
material
=
null
;
var
RenderList
=
function
()
{
var
normalMatrix
=
new
THREE
.
Matrix3
();
var
normals
=
[];
var
uvs
=
[];
var
setObject
=
function
(
value
)
{
var
object
=
null
;
var
material
=
null
;
object
=
value
;
material
=
object
.
material
;
var
normalMatrix
=
new
THREE
.
Matrix3
();
normalMatrix
.
getNormalMatrix
(
object
.
matrixWorld
);
function
setObject
(
value
)
{
normals
.
length
=
0
;
uvs
.
length
=
0
;
object
=
value
;
material
=
object
.
material
;
}
;
normalMatrix
.
getNormalMatrix
(
object
.
matrixWorld
)
;
var
projectVertex
=
function
(
vertex
)
{
normals
.
length
=
0
;
uvs
.
length
=
0
;
var
position
=
vertex
.
position
;
var
positionWorld
=
vertex
.
positionWorld
;
var
positionScreen
=
vertex
.
positionScreen
;
}
positionWorld
.
copy
(
position
).
applyMatrix4
(
_modelMatrix
);
positionScreen
.
copy
(
positionWorld
).
applyMatrix4
(
_viewProjectionMatrix
);
function
projectVertex
(
vertex
)
{
var
invW
=
1
/
positionScreen
.
w
;
var
position
=
vertex
.
position
;
var
positionWorld
=
vertex
.
positionWorld
;
var
positionScreen
=
vertex
.
positionScreen
;
positionScreen
.
x
*=
invW
;
positionScreen
.
y
*=
invW
;
positionScreen
.
z
*=
invW
;
positionWorld
.
copy
(
position
).
applyMatrix4
(
_modelMatrix
);
positionScreen
.
copy
(
positionWorld
).
applyMatrix4
(
_viewProjectionMatrix
);
vertex
.
visible
=
positionScreen
.
x
>=
-
1
&&
positionScreen
.
x
<=
1
&&
positionScreen
.
y
>=
-
1
&&
positionScreen
.
y
<=
1
&&
positionScreen
.
z
>=
-
1
&&
positionScreen
.
z
<=
1
;
var
invW
=
1
/
positionScreen
.
w
;
};
positionScreen
.
x
*=
invW
;
positionScreen
.
y
*=
invW
;
positionScreen
.
z
*=
invW
;
var
pushVertex
=
function
(
x
,
y
,
z
)
{
vertex
.
visible
=
positionScreen
.
x
>=
-
1
&&
positionScreen
.
x
<=
1
&&
positionScreen
.
y
>=
-
1
&&
positionScreen
.
y
<=
1
&&
positionScreen
.
z
>=
-
1
&&
positionScreen
.
z
<=
1
;
_vertex
=
getNextVertexInPool
();
_vertex
.
position
.
set
(
x
,
y
,
z
);
}
projectVertex
(
_vertex
);
function
pushVertex
(
x
,
y
,
z
)
{
};
_vertex
=
getNextVertexInPool
();
_vertex
.
position
.
set
(
x
,
y
,
z
);
var
pushNormal
=
function
(
x
,
y
,
z
)
{
projectVertex
(
_vertex
);
normals
.
push
(
x
,
y
,
z
);
}
};
function
pushNormal
(
x
,
y
,
z
)
{
var
pushUv
=
function
(
x
,
y
)
{
normals
.
push
(
x
,
y
,
z
);
uvs
.
push
(
x
,
y
);
}
};
function
pushUv
(
x
,
y
)
{
var
checkTriangleVisibility
=
function
(
v1
,
v2
,
v3
)
{
uvs
.
push
(
x
,
y
);
if
(
v1
.
visible
===
true
||
v2
.
visible
===
true
||
v3
.
visible
===
true
)
return
true
;
}
_points3
[
0
]
=
v1
.
positionScreen
;
_points3
[
1
]
=
v2
.
positionScreen
;
_points3
[
2
]
=
v3
.
positionScreen
;
function
checkTriangleVisibility
(
v1
,
v2
,
v3
)
{
return
_clipBox
.
isIntersectionBox
(
_boundingBox
.
setFromPoints
(
_points3
)
)
;
if
(
v1
.
visible
===
true
||
v2
.
visible
===
true
||
v3
.
visible
===
true
)
return
true
;
};
_points3
[
0
]
=
v1
.
positionScreen
;
_points3
[
1
]
=
v2
.
positionScreen
;
_points3
[
2
]
=
v3
.
positionScreen
;
var
checkBackfaceCulling
=
function
(
v1
,
v2
,
v3
)
{
return
_clipBox
.
intersectsBox
(
_boundingBox
.
setFromPoints
(
_points3
)
);
return
(
(
v3
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
*
(
v2
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
-
(
v3
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
*
(
v2
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
)
<
0
;
}
};
function
checkBackfaceCulling
(
v1
,
v2
,
v3
)
{
var
pushLine
=
function
(
a
,
b
)
{
return
(
(
v3
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
*
(
v2
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
-
(
v3
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
*
(
v2
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
)
<
0
;
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
}
_line
=
getNextLineInPool
();
function
pushLine
(
a
,
b
)
{
_line
.
id
=
object
.
id
;
_line
.
v1
.
copy
(
v1
);
_line
.
v2
.
copy
(
v2
);
_line
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
)
/
2
;
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
_line
.
material
=
object
.
material
;
_line
=
getNextLineInPool
()
;
_renderData
.
elements
.
push
(
_line
);
_line
.
id
=
object
.
id
;
_line
.
v1
.
copy
(
v1
);
_line
.
v2
.
copy
(
v2
);
_line
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
)
/
2
;
_line
.
renderOrder
=
object
.
renderOrder
;
}
;
_line
.
material
=
object
.
material
;
var
pushTriangle
=
function
(
a
,
b
,
c
)
{
_renderData
.
elements
.
push
(
_line
);
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
var
v3
=
_vertexPool
[
c
];
}
if
(
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
return
;
function
pushTriangle
(
a
,
b
,
c
)
{
if
(
material
.
side
===
THREE
.
DoubleSide
||
checkBackfaceCulling
(
v1
,
v2
,
v3
)
===
true
)
{
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
var
v3
=
_vertexPool
[
c
];
_face
=
getNextFaceInPool
()
;
if
(
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
return
;
_face
.
id
=
object
.
id
;
_face
.
priority
=
face
.
priority
;
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
if
(
material
.
side
===
THREE
.
DoubleSide
||
checkBackfaceCulling
(
v1
,
v2
,
v3
)
===
true
)
{
for
(
var
i
=
0
;
i
<
3
;
i
++
)
{
_face
=
getNextFaceInPool
();
var
offset
=
arguments
[
i
]
*
3
;
var
normal
=
_face
.
vertexNormalsModel
[
i
];
_face
.
id
=
object
.
id
;
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
renderOrder
=
object
.
renderOrder
;
normal
.
set
(
normals
[
offset
],
normals
[
offset
+
1
],
normals
[
offset
+
2
]
);
normal
.
applyMatrix3
(
normalMatrix
).
normalize
();
// use first vertex normal as face normal
var
offset2
=
arguments
[
i
]
*
2
;
_face
.
normalModel
.
fromArray
(
normals
,
a
*
3
);
_face
.
normalModel
.
applyMatrix3
(
normalMatrix
).
normalize
();
var
uv
=
_face
.
uvs
[
i
];
uv
.
set
(
uvs
[
offset2
],
uvs
[
offset2
+
1
]
);
for
(
var
i
=
0
;
i
<
3
;
i
++
)
{
}
var
normal
=
_face
.
vertexNormalsModel
[
i
];
normal
.
fromArray
(
normals
,
arguments
[
i
]
*
3
);
normal
.
applyMatrix3
(
normalMatrix
).
normalize
();
_face
.
vertexNormalsLength
=
3
;
var
uv
=
_face
.
uvs
[
i
];
uv
.
fromArray
(
uvs
,
arguments
[
i
]
*
2
);
_face
.
material
=
object
.
material
;
}
_renderData
.
elements
.
push
(
_face
)
;
_face
.
vertexNormalsLength
=
3
;
}
_face
.
material
=
object
.
material
;
}
;
_renderData
.
elements
.
push
(
_face
)
;
return
{
setObject
:
setObject
,
projectVertex
:
projectVertex
,
checkTriangleVisibility
:
checkTriangleVisibility
,
checkBackfaceCulling
:
checkBackfaceCulling
,
pushVertex
:
pushVertex
,
pushNormal
:
pushNormal
,
pushUv
:
pushUv
,
pushLine
:
pushLine
,
pushTriangle
:
pushTriangle
};
}
};
}
var
renderList
=
new
RenderList
();
return
{
setObject
:
setObject
,
projectVertex
:
projectVertex
,
checkTriangleVisibility
:
checkTriangleVisibility
,
checkBackfaceCulling
:
checkBackfaceCulling
,
pushVertex
:
pushVertex
,
pushNormal
:
pushNormal
,
pushUv
:
pushUv
,
pushLine
:
pushLine
,
pushTriangle
:
pushTriangle
}
this
.
projectScene
=
function
(
scene
,
camera
,
sortObjects
,
sortElements
)
{
};
_faceCount
=
0
;
_lineCount
=
0
;
_spriteCount
=
0
;
var
renderList
=
new
RenderList
();
_renderData
.
elements
.
length
=
0
;
_camera
=
camera
;
this
.
projectScene
=
function
(
scene
,
camera
,
sortObjects
,
sortElements
)
{
if
(
scene
.
autoUpdate
===
true
)
scene
.
updateMatrixWorld
();
if
(
camera
.
parent
===
undefined
)
camera
.
updateMatrixWorld
();
_faceCount
=
0
;
_lineCount
=
0
;
_spriteCount
=
0
;
_viewMatrix
.
copy
(
camera
.
matrixWorldInverse
.
getInverse
(
camera
.
matrixWorld
)
);
_viewProjectionMatrix
.
multiplyMatrices
(
camera
.
projectionMatrix
,
_viewMatrix
);
_renderData
.
elements
.
length
=
0
;
_camera
=
camera
;
_frustum
.
setFromMatrix
(
_viewProjectionMatrix
);
if
(
scene
.
autoUpdate
===
true
)
scene
.
updateMatrixWorld
();
if
(
camera
.
parent
===
null
)
camera
.
updateMatrixWorld
();
_objectCount
=
0
;
_viewMatrix
.
copy
(
camera
.
matrixWorldInverse
.
getInverse
(
camera
.
matrixWorld
)
);
_viewProjectionMatrix
.
multiplyMatrices
(
camera
.
projectionMatrix
,
_viewMatrix
);
_renderData
.
objects
.
length
=
0
;
_renderData
.
lights
.
length
=
0
;
_frustum
.
setFromMatrix
(
_viewProjectionMatrix
);
//
_objectCount
=
0
;
_renderData
.
objects
.
length
=
0
;
_renderData
.
lights
.
length
=
0
;
function
addObject
(
object
)
{
scene
.
traverseVisible
(
function
(
object
)
{
_object
=
getNextObjectInPool
();
_object
.
id
=
object
.
id
;
_object
.
object
=
object
;
if
(
object
instanceof
THREE
.
Light
)
{
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
applyProjection
(
_viewProjectionMatrix
);
_object
.
z
=
_vector3
.
z
;
_object
.
renderOrder
=
object
.
renderOrder
;
_renderData
.
objects
.
push
(
_object
);
}
_renderData
.
lights
.
push
(
object
);
scene
.
traverseVisible
(
function
(
object
)
{
}
else
if
(
object
instanceof
THREE
.
Mesh
||
object
instanceof
THREE
.
Line
||
object
instanceof
THREE
.
Sprite
)
{
if
(
object
instanceof
THREE
.
Light
)
{
if
(
object
.
material
.
visible
===
false
)
return
;
_renderData
.
lights
.
push
(
object
)
;
if
(
object
.
frustumCulled
===
false
||
_frustum
.
intersectsObject
(
object
)
===
tru
e
)
{
}
else
if
(
object
instanceof
THREE
.
Mesh
||
object
instanceof
THREE
.
Lin
e
)
{
_object
=
getNextObjectInPool
();
_object
.
id
=
object
.
id
;
_object
.
object
=
object
;
if
(
object
.
material
.
visible
===
false
)
return
;
if
(
object
.
frustumCulled
===
true
&&
_frustum
.
intersectsObject
(
object
)
===
false
)
return
;
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
applyProjection
(
_viewProjectionMatrix
);
_object
.
z
=
_vector3
.
z
;
addObject
(
object
);
_renderData
.
objects
.
push
(
_object
);
}
else
if
(
object
instanceof
THREE
.
Sprite
)
{
}
if
(
object
.
material
.
visible
===
false
)
return
;
if
(
object
.
frustumCulled
===
true
&&
_frustum
.
intersectsSprite
(
object
)
===
false
)
return
;
}
addObject
(
object
);
}
);
}
}
);
if
(
sortObjects
===
true
)
{
_renderData
.
objects
.
sort
(
painterSort
);
}
if
(
sortObjects
===
true
)
{
//
_renderData
.
objects
.
sort
(
customSort
);
for
(
var
o
=
0
,
ol
=
_renderData
.
objects
.
length
;
o
<
ol
;
o
++
)
{
}
var
object
=
_renderData
.
objects
[
o
].
object
;
var
geometry
=
object
.
geometry
;
for
(
var
o
=
0
,
ol
=
_renderData
.
objects
.
length
;
o
<
ol
;
o
++
)
{
renderList
.
setObject
(
object
);
var
object
=
_renderData
.
objects
[
o
].
object
;
var
geometry
=
object
.
geometry
;
_modelMatrix
=
object
.
matrixWorld
;
renderList
.
setObject
(
object
)
;
_vertexCount
=
0
;
_modelMatrix
=
object
.
matrixWorld
;
if
(
object
instanceof
THREE
.
Mesh
)
{
_vertexCount
=
0
;
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
if
(
object
instanceof
THREE
.
Mesh
)
{
var
attributes
=
geometry
.
attributes
;
var
groups
=
geometry
.
groups
;
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
if
(
attributes
.
position
===
undefined
)
continue
;
var
attributes
=
geometry
.
attributes
;
var
offsets
=
geometry
.
offsets
;
var
positions
=
attributes
.
position
.
array
;
if
(
attributes
.
position
===
undefined
)
continue
;
for
(
var
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
var
positions
=
attributes
.
position
.
array
;
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
)
;
for
(
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
}
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
if
(
attributes
.
normal
!==
undefined
)
{
}
var
normals
=
attributes
.
normal
.
array
;
if
(
attributes
.
normal
!==
undefined
)
{
for
(
var
i
=
0
,
l
=
normals
.
length
;
i
<
l
;
i
+=
3
)
{
var
normals
=
attributes
.
normal
.
array
;
renderList
.
pushNormal
(
normals
[
i
],
normals
[
i
+
1
],
normals
[
i
+
2
]
)
;
for
(
i
=
0
,
l
=
normals
.
length
;
i
<
l
;
i
+=
3
)
{
}
renderList
.
pushNormal
(
normals
[
i
],
normals
[
i
+
1
],
normals
[
i
+
2
]
);
}
}
if
(
attributes
.
uv
!==
undefined
)
{
}
var
uvs
=
attributes
.
uv
.
array
;
if
(
attributes
.
uv
!==
undefined
)
{
for
(
var
i
=
0
,
l
=
uvs
.
length
;
i
<
l
;
i
+=
2
)
{
var
uvs
=
attributes
.
uv
.
array
;
renderList
.
pushUv
(
uvs
[
i
],
uvs
[
i
+
1
]
)
;
for
(
i
=
0
,
l
=
uvs
.
length
;
i
<
l
;
i
+=
2
)
{
}
renderList
.
pushUv
(
uvs
[
i
],
uvs
[
i
+
1
]
);
}
}
if
(
geometry
.
index
!==
null
)
{
}
var
indices
=
geometry
.
index
.
array
;
if
(
attributes
.
index
!==
undefined
)
{
if
(
groups
.
length
>
0
)
{
var
indices
=
attributes
.
index
.
array
;
for
(
var
o
=
0
;
o
<
groups
.
length
;
o
++
)
{
if
(
offsets
.
length
>
0
)
{
var
group
=
groups
[
o
];
for
(
o
=
0
;
o
<
offsets
.
length
;
o
++
)
{
for
(
var
i
=
group
.
start
,
l
=
group
.
start
+
group
.
count
;
i
<
l
;
i
+=
3
)
{
var
offset
=
offsets
[
o
];
var
index
=
offset
.
index
;
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
for
(
i
=
offset
.
start
,
l
=
offset
.
start
+
offset
.
count
;
i
<
l
;
i
+=
3
)
{
}
renderList
.
pushTriangle
(
indices
[
i
]
+
index
,
indices
[
i
+
1
]
+
index
,
indices
[
i
+
2
]
+
index
);
}
}
}
else
{
}
for
(
var
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
3
)
{
}
else
{
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
for
(
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
3
)
{
}
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
}
}
}
else
{
}
for
(
var
i
=
0
,
l
=
positions
.
length
/
3
;
i
<
l
;
i
+=
3
)
{
}
else
{
renderList
.
pushTriangle
(
i
,
i
+
1
,
i
+
2
);
for
(
i
=
0
,
l
=
positions
.
length
/
3
;
i
<
l
;
i
+=
3
)
{
}
renderList
.
pushTriangle
(
i
,
i
+
1
,
i
+
2
);
}
}
}
else
if
(
geometry
instanceof
THREE
.
Geometry
)
{
}
var
vertices
=
geometry
.
vertices
;
var
faces
=
geometry
.
faces
;
var
faceVertexUvs
=
geometry
.
faceVertexUvs
[
0
];
}
else
if
(
geometry
instanceof
THREE
.
Geometry
)
{
_normalMatrix
.
getNormalMatrix
(
_modelMatrix
);
var
vertices
=
geometry
.
vertices
;
var
faces
=
geometry
.
faces
;
var
faceVertexUvs
=
geometry
.
faceVertexUvs
[
0
];
var
material
=
object
.
material
;
_normalMatrix
.
getNormalMatrix
(
_modelMatrix
);
var
isFaceMaterial
=
material
instanceof
THREE
.
MultiMaterial
;
var
objectMaterials
=
isFaceMaterial
===
true
?
object
.
material
:
null
;
var
isFaceMaterial
=
object
.
material
instanceof
THREE
.
MeshFaceMaterial
;
var
objectMaterials
=
isFaceMaterial
===
true
?
object
.
material
:
null
;
for
(
var
v
=
0
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
for
(
var
v
=
0
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
var
vertex
=
vertices
[
v
];
var
vertex
=
vertices
[
v
];
renderList
.
pushVertex
(
vertex
.
x
,
vertex
.
y
,
vertex
.
z
);
_vector3
.
copy
(
vertex
);
}
if
(
material
.
morphTargets
===
true
)
{
for
(
var
f
=
0
,
fl
=
faces
.
length
;
f
<
fl
;
f
++
)
{
var
morphTargets
=
geometry
.
morphTargets
;
var
morphInfluences
=
object
.
morphTargetInfluences
;
var
face
=
faces
[
f
];
for
(
var
t
=
0
,
tl
=
morphTargets
.
length
;
t
<
tl
;
t
++
)
{
var
material
;
if
(
isFaceMaterial
===
true
){
material
=
objectMaterials
.
materials
[
face
.
materialIndex
];
}
else
{
material
=
object
.
material
;
}
var
influence
=
morphInfluences
[
t
];
if
(
material
===
undefined
)
continue
;
if
(
influence
===
0
)
continue
;
var
side
=
material
.
side
;
var
target
=
morphTargets
[
t
];
var
targetVertex
=
target
.
vertices
[
v
];
var
v1
=
_vertexPool
[
face
.
a
]
;
var
v2
=
_vertexPool
[
face
.
b
]
;
var
v3
=
_vertexPool
[
face
.
c
]
;
_vector3
.
x
+=
(
targetVertex
.
x
-
vertex
.
x
)
*
influence
;
_vector3
.
y
+=
(
targetVertex
.
y
-
vertex
.
y
)
*
influence
;
_vector3
.
z
+=
(
targetVertex
.
z
-
vertex
.
z
)
*
influence
;
if
(
material
.
morphTargets
===
true
)
{
}
var
morphTargets
=
geometry
.
morphTargets
;
var
morphInfluences
=
object
.
morphTargetInfluences
;
}
var
v1p
=
v1
.
position
;
var
v2p
=
v2
.
position
;
var
v3p
=
v3
.
position
;
renderList
.
pushVertex
(
_vector3
.
x
,
_vector3
.
y
,
_vector3
.
z
);
_vA
.
set
(
0
,
0
,
0
);
_vB
.
set
(
0
,
0
,
0
);
_vC
.
set
(
0
,
0
,
0
);
}
for
(
var
t
=
0
,
tl
=
morphTargets
.
length
;
t
<
tl
;
t
++
)
{
for
(
var
f
=
0
,
fl
=
faces
.
length
;
f
<
fl
;
f
++
)
{
var
influence
=
morphInfluences
[
t
];
var
face
=
faces
[
f
];
if
(
influence
===
0
)
continue
;
material
=
isFaceMaterial
===
true
?
objectMaterials
.
materials
[
face
.
materialIndex
]
:
object
.
material
;
var
targets
=
morphTargets
[
t
].
vertices
;
if
(
material
===
undefined
)
continue
;
_vA
.
x
+=
(
targets
[
face
.
a
].
x
-
v1p
.
x
)
*
influence
;
_vA
.
y
+=
(
targets
[
face
.
a
].
y
-
v1p
.
y
)
*
influence
;
_vA
.
z
+=
(
targets
[
face
.
a
].
z
-
v1p
.
z
)
*
influence
;
var
side
=
material
.
side
;
_vB
.
x
+=
(
targets
[
face
.
b
].
x
-
v2p
.
x
)
*
influence
;
_vB
.
y
+=
(
targets
[
face
.
b
].
y
-
v2p
.
y
)
*
influence
;
_vB
.
z
+=
(
targets
[
face
.
b
].
z
-
v2p
.
z
)
*
influence
;
var
v1
=
_vertexPool
[
face
.
a
]
;
var
v2
=
_vertexPool
[
face
.
b
]
;
var
v3
=
_vertexPool
[
face
.
c
]
;
_vC
.
x
+=
(
targets
[
face
.
c
].
x
-
v3p
.
x
)
*
influence
;
_vC
.
y
+=
(
targets
[
face
.
c
].
y
-
v3p
.
y
)
*
influence
;
_vC
.
z
+=
(
targets
[
face
.
c
].
z
-
v3p
.
z
)
*
influence
;
if
(
renderList
.
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
continue
;
}
var
visible
=
renderList
.
checkBackfaceCulling
(
v1
,
v2
,
v3
);
v1
.
position
.
add
(
_vA
);
v2
.
position
.
add
(
_vB
);
v3
.
position
.
add
(
_vC
);
if
(
side
!==
THREE
.
DoubleSide
)
{
renderList
.
projectVertex
(
v1
);
renderList
.
projectVertex
(
v2
);
renderList
.
projectVertex
(
v3
);
if
(
side
===
THREE
.
FrontSide
&&
visible
===
false
)
continue
;
if
(
side
===
THREE
.
BackSide
&&
visible
===
true
)
continue
;
}
}
if
(
renderList
.
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
continue
;
_face
=
getNextFaceInPool
()
;
var
visible
=
renderList
.
checkBackfaceCulling
(
v1
,
v2
,
v3
);
_face
.
id
=
object
.
id
;
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
if
(
side
!==
THREE
.
DoubleSide
)
{
if
(
side
===
THREE
.
FrontSide
&&
visible
===
false
)
continue
;
if
(
side
===
THREE
.
BackSide
&&
visible
===
true
)
continue
;
}
_face
.
normalModel
.
copy
(
face
.
normal
);
_face
=
getNextFaceInPool
();
if
(
visible
===
false
&&
(
side
===
THREE
.
BackSide
||
side
===
THREE
.
DoubleSide
)
)
{
_face
.
id
=
object
.
id
;
_face
.
priority
=
face
.
priority
;
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
_face
.
normalModel
.
negate
();
_face
.
normalModel
.
copy
(
face
.
normal
);
}
if
(
visible
===
false
&&
(
side
===
THREE
.
BackSide
||
side
===
THREE
.
DoubleSide
)
)
{
_face
.
normalModel
.
applyMatrix3
(
_normalMatrix
).
normalize
();
_face
.
normalModel
.
negate
()
;
var
faceVertexNormals
=
face
.
vertexNormals
;
}
for
(
var
n
=
0
,
nl
=
Math
.
min
(
faceVertexNormals
.
length
,
3
);
n
<
nl
;
n
++
)
{
_face
.
normalModel
.
applyMatrix3
(
_normalMatrix
).
normalize
();
var
normalModel
=
_face
.
vertexNormalsModel
[
n
];
normalModel
.
copy
(
faceVertexNormals
[
n
]
);
var
faceVertexNormals
=
face
.
vertexNormals
;
if
(
visible
===
false
&&
(
side
===
THREE
.
BackSide
||
side
===
THREE
.
DoubleSide
)
)
{
for
(
var
n
=
0
,
nl
=
Math
.
min
(
faceVertexNormals
.
length
,
3
);
n
<
nl
;
n
++
)
{
normalModel
.
negate
();
var
normalModel
=
_face
.
vertexNormalsModel
[
n
];
normalModel
.
copy
(
faceVertexNormals
[
n
]
);
}
if
(
visible
===
false
&&
(
side
===
THREE
.
BackSide
||
side
===
THREE
.
DoubleSide
)
)
{
normalModel
.
applyMatrix3
(
_normalMatrix
).
normalize
();
normalModel
.
negate
();
}
}
_face
.
vertexNormalsLength
=
faceVertexNormals
.
length
;
normalModel
.
applyMatrix3
(
_normalMatrix
).
normalize
()
;
var
vertexUvs
=
faceVertexUvs
[
f
]
;
}
if
(
vertexUvs
!==
undefined
)
{
_face
.
vertexNormalsLength
=
faceVertexNormals
.
length
;
for
(
var
u
=
0
;
u
<
3
;
u
++
)
{
var
vertexUvs
=
faceVertexUvs
[
f
]
;
_face
.
uvs
[
u
].
copy
(
vertexUvs
[
u
]
)
;
if
(
vertexUvs
!==
undefined
)
{
}
for
(
var
u
=
0
;
u
<
3
;
u
++
)
{
}
_face
.
uvs
[
u
].
copy
(
vertexUvs
[
u
]
);
_face
.
color
=
face
.
color
;
_face
.
material
=
material
;
}
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
renderOrder
=
object
.
renderOrder
;
}
_renderData
.
elements
.
push
(
_face
);
_face
.
color
=
face
.
color
;
_face
.
material
=
material
;
}
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
}
_renderData
.
elements
.
push
(
_face
);
}
else
if
(
object
instanceof
THREE
.
Line
)
{
}
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
}
var
attributes
=
geometry
.
attributes
;
}
else
if
(
object
instanceof
THREE
.
Line
)
{
if
(
attributes
.
position
!==
undefined
)
{
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
var
positions
=
attributes
.
position
.
array
;
var
attributes
=
geometry
.
attributes
;
for
(
var
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
if
(
attributes
.
position
!==
undefined
)
{
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
var
positions
=
attributes
.
position
.
array
;
}
for
(
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
if
(
geometry
.
index
!==
null
)
{
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
)
;
var
indices
=
geometry
.
index
.
array
;
}
for
(
var
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
2
)
{
if
(
attributes
.
index
!==
undefined
)
{
renderList
.
pushLine
(
indices
[
i
],
indices
[
i
+
1
]
);
var
indices
=
attributes
.
index
.
array
;
}
for
(
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
2
)
{
}
else
{
renderList
.
pushLine
(
indices
[
i
],
indices
[
i
+
1
]
)
;
var
step
=
object
instanceof
THREE
.
LineSegments
?
2
:
1
;
}
for
(
var
i
=
0
,
l
=
(
positions
.
length
/
3
)
-
1
;
i
<
l
;
i
+=
step
)
{
}
else
{
renderList
.
pushLine
(
i
,
i
+
1
);
var
step
=
object
.
mode
===
THREE
.
LinePieces
?
2
:
1
;
}
for
(
i
=
0
,
l
=
(
positions
.
length
/
3
)
-
1
;
i
<
l
;
i
+=
step
)
{
}
renderList
.
pushLine
(
i
,
i
+
1
);
}
}
}
else
if
(
geometry
instanceof
THREE
.
Geometry
)
{
}
_modelViewProjectionMatrix
.
multiplyMatrices
(
_viewProjectionMatrix
,
_modelMatrix
);
}
var
vertices
=
object
.
geometry
.
vertices
;
}
else
if
(
geometry
instanceof
THREE
.
Geometry
)
{
if
(
vertices
.
length
===
0
)
continue
;
_modelViewProjectionMatrix
.
multiplyMatrices
(
_viewProjectionMatrix
,
_modelMatrix
);
v1
=
getNextVertexInPool
();
v1
.
positionScreen
.
copy
(
vertices
[
0
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
var
vertices
=
object
.
geometry
.
vertices
;
var
step
=
object
instanceof
THREE
.
LineSegments
?
2
:
1
;
if
(
vertices
.
length
===
0
)
continue
;
for
(
var
v
=
1
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
var
v1
=
getNextVertexInPool
();
v1
.
positionWorld
.
copy
(
vertices
[
0
]
);
v1
.
positionScreen
.
copy
(
vertices
[
0
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
v1
=
getNextVertexInPool
();
v1
.
positionScreen
.
copy
(
vertices
[
v
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
// Handle LineStrip and LinePieces
var
step
=
object
.
mode
===
THREE
.
LinePieces
?
2
:
1
;
if
(
(
v
+
1
)
%
step
>
0
)
continue
;
for
(
var
v
=
1
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
v2
=
_vertexPool
[
_vertexCount
-
2
];
v1
=
getNextVertexInPool
();
v1
.
positionWorld
.
copy
(
vertices
[
v
]
);
v1
.
positionScreen
.
copy
(
vertices
[
v
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
_clippedVertex1PositionScreen
.
copy
(
v1
.
positionScreen
);
_clippedVertex2PositionScreen
.
copy
(
v2
.
positionScreen
);
if
(
(
v
+
1
)
%
step
>
0
)
continue
;
if
(
clipLine
(
_clippedVertex1PositionScreen
,
_clippedVertex2PositionScreen
)
===
true
)
{
v2
=
_vertexPool
[
_vertexCount
-
2
];
// Perform the perspective divide
_clippedVertex1PositionScreen
.
multiplyScalar
(
1
/
_clippedVertex1PositionScreen
.
w
);
_clippedVertex2PositionScreen
.
multiplyScalar
(
1
/
_clippedVertex2PositionScreen
.
w
);
_clippedVertex1PositionScreen
.
copy
(
v1
.
positionScreen
);
_clippedVertex2PositionScreen
.
copy
(
v2
.
positionScreen
);
_line
=
getNextLineInPool
();
if
(
clipLine
(
_clippedVertex1PositionScreen
,
_clippedVertex2PositionScreen
)
===
true
)
{
_line
.
id
=
object
.
id
;
_line
.
v1
.
positionScreen
.
copy
(
_clippedVertex1PositionScreen
);
_line
.
v2
.
positionScreen
.
copy
(
_clippedVertex2PositionScreen
);
// Perform the perspective divide
_clippedVertex1PositionScreen
.
multiplyScalar
(
1
/
_clippedVertex1PositionScreen
.
w
);
_clippedVertex2PositionScreen
.
multiplyScalar
(
1
/
_clippedVertex2PositionScreen
.
w
);
_line
.
z
=
Math
.
max
(
_clippedVertex1PositionScreen
.
z
,
_clippedVertex2PositionScreen
.
z
);
_line
.
renderOrder
=
object
.
renderOrder
;
_line
=
getNextLineInPool
()
;
_line
.
material
=
object
.
material
;
_line
.
id
=
object
.
id
;
_line
.
v1
.
positionScreen
.
copy
(
_clippedVertex1PositionScreen
);
_line
.
v1
.
positionWorld
.
copy
(
v1
.
positionWorld
);
_line
.
v2
.
positionScreen
.
copy
(
_clippedVertex2PositionScreen
);
_line
.
v2
.
positionWorld
.
copy
(
v2
.
positionWorld
);
if
(
object
.
material
.
vertexColors
===
THREE
.
VertexColors
)
{
_line
.
z
=
Math
.
max
(
_clippedVertex1PositionScreen
.
z
,
_clippedVertex2PositionScreen
.
z
);
_line
.
vertexColors
[
0
].
copy
(
object
.
geometry
.
colors
[
v
]
);
_line
.
vertexColors
[
1
].
copy
(
object
.
geometry
.
colors
[
v
-
1
]
);
_line
.
material
=
object
.
material
;
}
if
(
object
.
material
.
vertexColors
===
THREE
.
VertexColors
)
{
_renderData
.
elements
.
push
(
_line
);
_line
.
vertexColors
[
0
].
copy
(
object
.
geometry
.
colors
[
v
]
);
_line
.
vertexColors
[
1
].
copy
(
object
.
geometry
.
colors
[
v
-
1
]
);
}
}
}
_renderData
.
elements
.
push
(
_line
);
}
}
}
else
if
(
object
instanceof
THREE
.
Sprite
)
{
}
_vector4
.
set
(
_modelMatrix
.
elements
[
12
],
_modelMatrix
.
elements
[
13
],
_modelMatrix
.
elements
[
14
],
1
);
_vector4
.
applyMatrix4
(
_viewProjectionMatrix
);
}
var
invW
=
1
/
_vector4
.
w
;
_vector4
.
z
*=
invW
;
if
(
_vector4
.
z
>=
-
1
&&
_vector4
.
z
<=
1
)
{
_sprite
=
getNextSpriteInPool
();
_sprite
.
id
=
object
.
id
;
_sprite
.
x
=
_vector4
.
x
*
invW
;
_sprite
.
y
=
_vector4
.
y
*
invW
;
_sprite
.
z
=
_vector4
.
z
;
_sprite
.
renderOrder
=
object
.
renderOrder
;
_sprite
.
object
=
object
;
_sprite
.
rotation
=
object
.
rotation
;
_sprite
.
scale
.
x
=
object
.
scale
.
x
*
Math
.
abs
(
_sprite
.
x
-
(
_vector4
.
x
+
camera
.
projectionMatrix
.
elements
[
0
]
)
/
(
_vector4
.
w
+
camera
.
projectionMatrix
.
elements
[
12
]
)
);
_sprite
.
scale
.
y
=
object
.
scale
.
y
*
Math
.
abs
(
_sprite
.
y
-
(
_vector4
.
y
+
camera
.
projectionMatrix
.
elements
[
5
]
)
/
(
_vector4
.
w
+
camera
.
projectionMatrix
.
elements
[
13
]
)
);
_sprite
.
material
=
object
.
material
;
_renderData
.
elements
.
push
(
_sprite
);
}
}
}
}
else
if
(
object
instanceof
THREE
.
Sprit
e
)
{
if
(
sortElements
===
tru
e
)
{
_vector4
.
set
(
_modelMatrix
.
elements
[
12
],
_modelMatrix
.
elements
[
13
],
_modelMatrix
.
elements
[
14
],
1
);
_vector4
.
applyMatrix4
(
_viewProjectionMatrix
);
_renderData
.
elements
.
sort
(
painterSort
);
var
invW
=
1
/
_vector4
.
w
;
}
_vector4
.
z
*=
invW
;
//
// Build the BSP tree
var
btree
=
new
BSPTree
(
_renderData
.
elements
);
_renderData
.
elements
=
btree
.
toArray
();
//_renderData.elements.length = 15;
if
(
_vector4
.
z
>=
-
1
&&
_vector4
.
z
<=
1
)
{
return
_renderData
;
_sprite
=
getNextSpriteInPool
();
_sprite
.
id
=
object
.
id
;
_sprite
.
x
=
_vector4
.
x
*
invW
;
_sprite
.
y
=
_vector4
.
y
*
invW
;
_sprite
.
z
=
_vector4
.
z
;
_sprite
.
object
=
object
;
};
_sprite
.
rotation
=
object
.
rotation
;
// Pools
_sprite
.
scale
.
x
=
object
.
scale
.
x
*
Math
.
abs
(
_sprite
.
x
-
(
_vector4
.
x
+
camera
.
projectionMatrix
.
elements
[
0
]
)
/
(
_vector4
.
w
+
camera
.
projectionMatrix
.
elements
[
12
]
)
);
_sprite
.
scale
.
y
=
object
.
scale
.
y
*
Math
.
abs
(
_sprite
.
y
-
(
_vector4
.
y
+
camera
.
projectionMatrix
.
elements
[
5
]
)
/
(
_vector4
.
w
+
camera
.
projectionMatrix
.
elements
[
13
]
)
);
function
getNextObjectInPool
()
{
_sprite
.
material
=
object
.
material
;
if
(
_objectCount
===
_objectPoolLength
)
{
_renderData
.
elements
.
push
(
_sprite
);
var
object
=
new
THREE
.
RenderableObject
();
_objectPool
.
push
(
object
);
_objectPoolLength
++
;
_objectCount
++
;
return
object
;
}
}
}
return
_objectPool
[
_objectCount
++
];
}
}
if
(
sortElements
===
true
)
{
function
getNextVertexInPool
(
)
{
//_renderData.elements.sort( customSort );
if
(
_vertexCount
===
_vertexPoolLength
)
{
}
// Build the BSP tree
var
btree
=
new
BSPTree
(
_renderData
.
elements
);
_renderData
.
elements
=
btree
.
toArray
();
//_renderData.elements.length = 15;
var
vertex
=
new
THREE
.
RenderableVertex
();
_vertexPool
.
push
(
vertex
);
_vertexPoolLength
++
;
_vertexCount
++
;
return
vertex
;
return
_renderData
;
}
};
return
_vertexPool
[
_vertexCount
++
];
// Pools
}
function
getNextObject
InPool
()
{
function
getNextFace
InPool
()
{
if
(
_objectCount
===
_object
PoolLength
)
{
if
(
_faceCount
===
_face
PoolLength
)
{
var
object
=
new
Projector
.
RenderableObject
();
_objectPool
.
push
(
object
);
_object
PoolLength
++
;
_object
Count
++
;
return
object
;
var
face
=
new
THREE
.
RenderableFace
();
_facePool
.
push
(
face
);
_face
PoolLength
++
;
_face
Count
++
;
return
face
;
}
}
return
_objectPool
[
_object
Count
++
];
return
_facePool
[
_face
Count
++
];
}
function
getNextVertexInPool
()
{
}
if
(
_vertexCount
===
_vertexPoolLength
)
{
function
getNextLineInPool
(
)
{
var
vertex
=
new
Projector
.
RenderableVertex
();
_vertexPool
.
push
(
vertex
);
_vertexPoolLength
++
;
_vertexCount
++
;
return
vertex
;
if
(
_lineCount
===
_linePoolLength
)
{
}
var
line
=
new
THREE
.
RenderableLine
();
_linePool
.
push
(
line
);
_linePoolLength
++
;
_lineCount
++
;
return
line
;
return
_vertexPool
[
_vertexCount
++
];
}
}
return
_linePool
[
_lineCount
++
];
function
getNextFaceInPool
()
{
}
if
(
_faceCount
===
_facePoolLength
)
{
function
getNextSpriteInPool
(
)
{
var
face
=
new
Projector
.
RenderableFace
();
_facePool
.
push
(
face
);
_facePoolLength
++
;
_faceCount
++
;
return
face
;
if
(
_spriteCount
===
_spritePoolLength
)
{
}
var
sprite
=
new
THREE
.
RenderableSprite
();
_spritePool
.
push
(
sprite
);
_spritePoolLength
++
;
_spriteCount
++
;
return
sprite
;
return
_facePool
[
_faceCount
++
];
}
return
_spritePool
[
_spriteCount
++
];
}
}
function
getNextLineInPool
()
{
//
if
(
_lineCount
===
_linePoolLength
)
{
function
painterSort
(
a
,
b
)
{
var
line
=
new
Projector
.
RenderableLine
();
_linePool
.
push
(
line
);
_linePoolLength
++
;
_lineCount
++
;
return
line
;
if
(
a
.
renderOrder
!==
b
.
renderOrder
)
{
}
return
a
.
renderOrder
-
b
.
renderOrder
;
return
_linePool
[
_lineCount
++
];
}
else
if
(
a
.
z
!==
b
.
z
)
{
}
return
b
.
z
-
a
.
z
;
function
getNextSpriteInPool
(
)
{
}
else
if
(
a
.
id
!==
b
.
id
)
{
if
(
_spriteCount
===
_spritePoolLength
)
{
return
a
.
id
-
b
.
id
;
var
sprite
=
new
Projector
.
RenderableSprite
();
_spritePool
.
push
(
sprite
);
_spritePoolLength
++
;
_spriteCount
++
;
return
sprite
;
}
else
{
}
return
0
;
return
_spritePool
[
_spriteCount
++
];
}
}
function
BSPTree
(
data
){
}
//
function
BSPTree
(
data
){
if
(
data
.
length
){
this
.
root
=
BSPTree
.
utils
.
createNode
(
data
[
0
]);
for
(
var
i
=
1
;
i
<
data
.
length
;
i
++
){
...
...
@@ -907,12 +939,12 @@ define(['three'], function(THREE, BSPTree){
}
if
(
comparison
===
1
){
if
(
!
compareWith
.
back
){
compareWith
.
back
=
node
;
}
else
{
this
.
insert
(
node
,
compareWith
.
back
);
}
}
else
{
if
(
!
compareWith
.
back
){
compareWith
.
back
=
node
;
}
else
{
this
.
insert
(
node
,
compareWith
.
back
);
}
}
else
{
if
(
!
compareWith
.
front
){
compareWith
.
front
=
node
;
}
else
{
...
...
@@ -924,11 +956,11 @@ define(['three'], function(THREE, BSPTree){
BSPTree
.
prototype
.
toArray
=
function
(){
var
output
=
[];
if
(
this
.
root
){
this
.
root
.
traverse
(
function
(
elem
){
output
.
push
(
elem
);
});
}
if
(
this
.
root
){
this
.
root
.
traverse
(
function
(
elem
){
output
.
push
(
elem
);
});
}
return
output
;
}
...
...
@@ -1030,21 +1062,21 @@ define(['three'], function(THREE, BSPTree){
}
}
BSPTree
.
Node
.
prototype
.
traverse
=
function
(
callback
){
if
(
!
callback
){
return
;
}
BSPTree
.
Node
.
prototype
.
traverse
=
function
(
callback
){
if
(
!
callback
){
return
;
}
if
(
this
.
back
){
this
.
back
.
traverse
(
callback
);
}
if
(
this
.
back
){
this
.
back
.
traverse
(
callback
);
}
callback
(
this
.
element
);
callback
(
this
.
element
);
if
(
this
.
front
){
this
.
front
.
traverse
(
callback
);
}
}
if
(
this
.
front
){
this
.
front
.
traverse
(
callback
);
}
}
BSPTree
.
LineNode
=
function
(
element
){
...
...
@@ -1067,22 +1099,22 @@ define(['three'], function(THREE, BSPTree){
}
BSPTree
.
LineNode
.
prototype
.
getSign
=
function
(
normal
,
pointOnPlane
){
var
s1
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v1
.
positionWorld
,
pointOnPlane
);
var
s2
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v2
.
positionWorld
,
pointOnPlane
);
var
s1
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v1
.
positionWorld
,
pointOnPlane
);
var
s2
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v2
.
positionWorld
,
pointOnPlane
);
var
sMax
=
Math
.
max
(
s1
,
s2
);
var
sMin
=
Math
.
min
(
s1
,
s2
);
switch
(
Math
.
abs
(
sMax
-
sMin
)){
case
0
:
return
sMax
;
case
1
:
return
sMax
||
sMin
;
case
2
:
return
undefined
;
default
:
throw
new
Error
(
'It looks like some unexpected FP error!'
);
}
var
sMin
=
Math
.
min
(
s1
,
s2
);
switch
(
Math
.
abs
(
sMax
-
sMin
)){
case
0
:
return
sMax
;
case
1
:
return
sMax
||
sMin
;
case
2
:
return
undefined
;
default
:
throw
new
Error
(
'It looks like some unexpected FP error!'
);
}
}
BSPTree
.
LineNode
.
prototype
.
separate
=
function
(
normal
,
point
){
...
...
@@ -1130,19 +1162,19 @@ define(['three'], function(THREE, BSPTree){
var
s2
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v2
.
positionWorld
,
pointOnPlane
);
var
s3
=
BSPTree
.
utils
.
getPointSign
(
normal
,
this
.
element
.
v3
.
positionWorld
,
pointOnPlane
);
var
sMax
=
Math
.
max
(
s1
,
s2
,
s3
);
var
sMin
=
Math
.
min
(
s1
,
s2
,
s3
);
switch
(
Math
.
abs
(
sMax
-
sMin
)){
case
0
:
return
sMax
;
case
1
:
return
sMax
||
sMin
;
case
2
:
return
undefined
;
default
:
throw
new
Error
(
'It looks like some unexpected FP error!'
);
}
var
sMax
=
Math
.
max
(
s1
,
s2
,
s3
);
var
sMin
=
Math
.
min
(
s1
,
s2
,
s3
);
switch
(
Math
.
abs
(
sMax
-
sMin
)){
case
0
:
return
sMax
;
case
1
:
return
sMax
||
sMin
;
case
2
:
return
undefined
;
default
:
throw
new
Error
(
'It looks like some unexpected FP error!'
);
}
}
BSPTree
.
TriangleNode
.
prototype
.
separate
=
function
(
normal
,
pointOnPlane
){
...
...
@@ -1172,19 +1204,19 @@ define(['three'], function(THREE, BSPTree){
if
(
BSPTree
.
utils
.
pointsEqual
(
i12
,
i23
)){
vertex
.
position
=
i31
;
BSPTree
.
utils
.
projectVertex
(
vertex
);
BSPTree
.
utils
.
projectVertex
(
vertex
);
this
.
element
.
v3
.
copy
(
vertex
);
newTriangle
.
v1
=
vertex
;
}
else
if
(
BSPTree
.
utils
.
pointsEqual
(
i23
,
i31
)){
vertex
.
position
=
i12
;
BSPTree
.
utils
.
projectVertex
(
vertex
);
BSPTree
.
utils
.
projectVertex
(
vertex
);
this
.
element
.
v1
.
copy
(
vertex
);
newTriangle
.
v2
=
vertex
;
}
else
{
vertex
.
position
=
i23
;
BSPTree
.
utils
.
projectVertex
(
vertex
);
BSPTree
.
utils
.
projectVertex
(
vertex
);
this
.
element
.
v2
.
copy
(
vertex
);
newTriangle
.
v3
=
vertex
;
...
...
@@ -1205,8 +1237,8 @@ define(['three'], function(THREE, BSPTree){
if
(
!
i12
){
this
.
element
.
v1
.
position
=
i31
;
this
.
element
.
v2
.
position
=
i23
;
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v1
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v2
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v1
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v2
);
t1
.
v2
.
copy
(
this
.
element
.
v2
);
t1
.
v3
.
copy
(
this
.
element
.
v1
);
...
...
@@ -1214,24 +1246,24 @@ define(['three'], function(THREE, BSPTree){
t2
.
v3
.
copy
(
this
.
element
.
v2
);
}
else
if
(
!
i23
){
this
.
element
.
v2
.
position
=
i12
;
this
.
element
.
v3
.
position
=
i31
;
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v2
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v3
);
t1
.
v1
.
copy
(
this
.
element
.
v2
);
t1
.
v3
.
copy
(
this
.
element
.
v3
);
t2
.
v1
.
copy
(
this
.
element
.
v3
);
this
.
element
.
v3
.
position
=
i31
;
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v2
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v3
);
t1
.
v1
.
copy
(
this
.
element
.
v2
);
t1
.
v3
.
copy
(
this
.
element
.
v3
);
t2
.
v1
.
copy
(
this
.
element
.
v3
);
}
else
{
this
.
element
.
v1
.
position
=
i12
;
this
.
element
.
v3
.
position
=
i23
;
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v1
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v3
);
t1
.
v1
.
copy
(
this
.
element
.
v1
);
t1
.
v2
.
copy
(
this
.
element
.
v3
);
t2
.
v2
.
copy
(
this
.
element
.
v1
);
this
.
element
.
v3
.
position
=
i23
;
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v1
);
BSPTree
.
utils
.
projectVertex
(
this
.
element
.
v3
);
t1
.
v1
.
copy
(
this
.
element
.
v1
);
t1
.
v2
.
copy
(
this
.
element
.
v3
);
t2
.
v2
.
copy
(
this
.
element
.
v1
);
}
return
[
...
...
@@ -1241,99 +1273,82 @@ define(['three'], function(THREE, BSPTree){
]
}
}
function
painterSort
(
a
,
b
){
if
(
a
.
z
!==
b
.
z
)
{
return
b
.
z
-
a
.
z
;
// Fallback: compare ids
}
else
if
(
a
.
id
!==
b
.
id
)
{
return
a
.
id
-
b
.
id
;
}
else
{
// Faces seem to be equal!
return
0
;
}
}
//
function
clipLine
(
s1
,
s2
)
{
function
clipLine
(
s1
,
s2
)
{
var
alpha1
=
0
,
alpha2
=
1
,
var
alpha1
=
0
,
alpha2
=
1
,
// Calculate the boundary coordinate of each vertex for the near and far clip planes,
// Z = -1 and Z = +1, respectively.
bc1near
=
s1
.
z
+
s1
.
w
,
bc2near
=
s2
.
z
+
s2
.
w
,
bc1far
=
-
s1
.
z
+
s1
.
w
,
bc2far
=
-
s2
.
z
+
s2
.
w
;
// Calculate the boundary coordinate of each vertex for the near and far clip planes,
// Z = -1 and Z = +1, respectively.
bc1near
=
s1
.
z
+
s1
.
w
,
bc2near
=
s2
.
z
+
s2
.
w
,
bc1far
=
-
s1
.
z
+
s1
.
w
,
bc2far
=
-
s2
.
z
+
s2
.
w
;
if
(
bc1near
>=
0
&&
bc2near
>=
0
&&
bc1far
>=
0
&&
bc2far
>=
0
)
{
if
(
bc1near
>=
0
&&
bc2near
>=
0
&&
bc1far
>=
0
&&
bc2far
>=
0
)
{
// Both vertices lie entirely within all clip planes.
return
true
;
// Both vertices lie entirely within all clip planes.
return
true
;
}
else
if
(
(
bc1near
<
0
&&
bc2near
<
0
)
||
(
bc1far
<
0
&&
bc2far
<
0
)
)
{
}
else
if
(
(
bc1near
<
0
&&
bc2near
<
0
)
||
(
bc1far
<
0
&&
bc2far
<
0
)
)
{
// Both vertices lie entirely outside one of the clip planes.
return
false
;
// Both vertices lie entirely outside one of the clip planes.
return
false
;
}
else
{
}
else
{
// The line segment spans at least one clip plane.
// The line segment spans at least one clip plane.
if
(
bc1near
<
0
)
{
if
(
bc1near
<
0
)
{
// v1 lies outside the near plane, v2 inside
alpha1
=
Math
.
max
(
alpha1
,
bc1near
/
(
bc1near
-
bc2near
)
);
// v1 lies outside the near plane, v2 inside
alpha1
=
Math
.
max
(
alpha1
,
bc1near
/
(
bc1near
-
bc2near
)
);
}
else
if
(
bc2near
<
0
)
{
}
else
if
(
bc2near
<
0
)
{
// v2 lies outside the near plane, v1 inside
alpha2
=
Math
.
min
(
alpha2
,
bc1near
/
(
bc1near
-
bc2near
)
);
// v2 lies outside the near plane, v1 inside
alpha2
=
Math
.
min
(
alpha2
,
bc1near
/
(
bc1near
-
bc2near
)
);
}
}
if
(
bc1far
<
0
)
{
if
(
bc1far
<
0
)
{
// v1 lies outside the far plane, v2 inside
alpha1
=
Math
.
max
(
alpha1
,
bc1far
/
(
bc1far
-
bc2far
)
);
// v1 lies outside the far plane, v2 inside
alpha1
=
Math
.
max
(
alpha1
,
bc1far
/
(
bc1far
-
bc2far
)
);
}
else
if
(
bc2far
<
0
)
{
}
else
if
(
bc2far
<
0
)
{
// v2 lies outside the far plane, v2 inside
alpha2
=
Math
.
min
(
alpha2
,
bc1far
/
(
bc1far
-
bc2far
)
);
// v2 lies outside the far plane, v2 inside
alpha2
=
Math
.
min
(
alpha2
,
bc1far
/
(
bc1far
-
bc2far
)
);
}
}
if
(
alpha2
<
alpha1
)
{
if
(
alpha2
<
alpha1
)
{
// The line segment spans two boundaries, but is outside both of them.
// (This can't happen when we're only clipping against just near/far but good
// to leave the check here for future usage if other clip planes are added.)
return
false
;
// The line segment spans two boundaries, but is outside both of them.
// (This can't happen when we're only clipping against just near/far but good
// to leave the check here for future usage if other clip planes are added.)
return
false
;
}
else
{
}
else
{
// Update the s1 and s2 vertices to match the clipped line segment.
s1
.
lerp
(
s2
,
alpha1
);
s2
.
lerp
(
s1
,
1
-
alpha2
);
// Update the s1 and s2 vertices to match the clipped line segment.
s1
.
lerp
(
s2
,
alpha1
);
s2
.
lerp
(
s1
,
1
-
alpha2
);
return
true
;
return
true
;
}
}
}
}
}
}
};
};
return
Projector
;
return
{
Projector
:
THREE
.
Projector
}
;
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment