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
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
180 additions
and
165 deletions
+180
-165
index.js
index.js
+180
-165
No files found.
index.js
View file @
3dbee6b2
...
@@ -9,16 +9,19 @@ define(['three'], function(THREE, BSPTree){
...
@@ -9,16 +9,19 @@ define(['three'], function(THREE, BSPTree){
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
.
object
=
null
;
this
.
z
=
0
;
this
.
z
=
0
;
this
.
renderOrder
=
0
;
};
};
Projector
.
RenderableFace
=
function
()
{
//
THREE
.
RenderableFace
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
...
@@ -34,13 +37,15 @@ define(['three'], function(THREE, BSPTree){
...
@@ -34,13 +37,15 @@ define(['three'], function(THREE, BSPTree){
this
.
color
=
new
THREE
.
Color
();
this
.
color
=
new
THREE
.
Color
();
this
.
material
=
null
;
this
.
material
=
null
;
this
.
uvs
=
[
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
()
];
this
.
uvs
=
[
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
(),
new
THREE
.
Vector2
()
];
this
.
priority
=
null
;
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
.
v1
.
copy
(
face
.
v1
);
this
.
v2
.
copy
(
face
.
v2
);
this
.
v2
.
copy
(
face
.
v2
);
this
.
v3
.
copy
(
face
.
v3
);
this
.
v3
.
copy
(
face
.
v3
);
...
@@ -53,10 +58,10 @@ define(['three'], function(THREE, BSPTree){
...
@@ -53,10 +58,10 @@ define(['three'], function(THREE, BSPTree){
this
.
color
=
face
.
color
;
this
.
color
=
face
.
color
;
this
.
material
=
face
.
material
;
this
.
material
=
face
.
material
;
this
.
uvs
=
face
.
uvs
;
this
.
uvs
=
face
.
uvs
;
this
.
priority
=
face
.
priority
;
this
.
renderOrder
=
face
.
renderOrder
;
};
};
Projector
.
RenderableVertex
=
function
()
{
THREE
.
RenderableVertex
=
function
()
{
this
.
position
=
new
THREE
.
Vector3
();
this
.
position
=
new
THREE
.
Vector3
();
this
.
positionWorld
=
new
THREE
.
Vector3
();
this
.
positionWorld
=
new
THREE
.
Vector3
();
...
@@ -66,28 +71,31 @@ define(['three'], function(THREE, BSPTree){
...
@@ -66,28 +71,31 @@ define(['three'], function(THREE, BSPTree){
};
};
Projector
.
RenderableVertex
.
prototype
.
copy
=
function
(
vertex
)
{
THREE
.
RenderableVertex
.
prototype
.
copy
=
function
(
vertex
)
{
this
.
positionWorld
.
copy
(
vertex
.
positionWorld
);
this
.
positionWorld
.
copy
(
vertex
.
positionWorld
);
this
.
positionScreen
.
copy
(
vertex
.
positionScreen
);
this
.
positionScreen
.
copy
(
vertex
.
positionScreen
);
};
};
Projector
.
RenderableLine
=
function
()
{
//
THREE
.
RenderableLine
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
this
.
v1
=
new
Projector
.
RenderableVertex
();
this
.
v1
=
new
THREE
.
RenderableVertex
();
this
.
v2
=
new
Projector
.
RenderableVertex
();
this
.
v2
=
new
THREE
.
RenderableVertex
();
this
.
vertexColors
=
[
new
THREE
.
Color
(),
new
THREE
.
Color
()
];
this
.
vertexColors
=
[
new
THREE
.
Color
(),
new
THREE
.
Color
()
];
this
.
material
=
null
;
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
.
v1
.
copy
(
line
.
v1
);
this
.
v2
.
copy
(
line
.
v2
);
this
.
v2
.
copy
(
line
.
v2
);
...
@@ -95,7 +103,9 @@ define(['three'], function(THREE, BSPTree){
...
@@ -95,7 +103,9 @@ define(['three'], function(THREE, BSPTree){
this
.
material
=
line
.
material
;
this
.
material
=
line
.
material
;
};
};
Projector
.
RenderableSprite
=
function
()
{
//
THREE
.
RenderableSprite
=
function
()
{
this
.
id
=
0
;
this
.
id
=
0
;
...
@@ -109,10 +119,13 @@ define(['three'], function(THREE, BSPTree){
...
@@ -109,10 +119,13 @@ define(['three'], function(THREE, BSPTree){
this
.
scale
=
new
THREE
.
Vector2
();
this
.
scale
=
new
THREE
.
Vector2
();
this
.
material
=
null
;
this
.
material
=
null
;
this
.
renderOrder
=
0
;
};
};
Projector
.
Projector
=
function
()
{
//
THREE
.
Projector
=
function
()
{
var
_object
,
_objectCount
,
_objectPool
=
[],
_objectPoolLength
=
0
,
var
_object
,
_objectCount
,
_objectPool
=
[],
_objectPoolLength
=
0
,
_vertex
,
_camera
,
_vertexCount
,
_vertexPool
=
[],
_vertexPoolLength
=
0
,
_vertex
,
_camera
,
_vertexCount
,
_vertexPool
=
[],
_vertexPoolLength
=
0
,
...
@@ -122,10 +135,6 @@ define(['three'], function(THREE, BSPTree){
...
@@ -122,10 +135,6 @@ define(['three'], function(THREE, BSPTree){
_renderData
=
{
objects
:
[],
lights
:
[],
elements
:
[]
},
_renderData
=
{
objects
:
[],
lights
:
[],
elements
:
[]
},
_vA
=
new
THREE
.
Vector3
(),
_vB
=
new
THREE
.
Vector3
(),
_vC
=
new
THREE
.
Vector3
(),
_vector3
=
new
THREE
.
Vector3
(),
_vector3
=
new
THREE
.
Vector3
(),
_vector4
=
new
THREE
.
Vector4
(),
_vector4
=
new
THREE
.
Vector4
(),
...
@@ -147,26 +156,30 @@ define(['three'], function(THREE, BSPTree){
...
@@ -147,26 +156,30 @@ define(['three'], function(THREE, BSPTree){
_clippedVertex1PositionScreen
=
new
THREE
.
Vector4
(),
_clippedVertex1PositionScreen
=
new
THREE
.
Vector4
(),
_clippedVertex2PositionScreen
=
new
THREE
.
Vector4
();
_clippedVertex2PositionScreen
=
new
THREE
.
Vector4
();
//
this
.
projectVector
=
function
(
vector
,
camera
)
{
this
.
projectVector
=
function
(
vector
,
camera
)
{
logger
.
warn
(
'THREE.Projector: .projectVector() is now vector.project().'
);
console
.
warn
(
'THREE.Projector: .projectVector() is now vector.project().'
);
vector
.
project
(
camera
);
vector
.
project
(
camera
);
};
};
this
.
unprojectVector
=
function
(
vector
,
camera
)
{
this
.
unprojectVector
=
function
(
vector
,
camera
)
{
logger
.
warn
(
'THREE.Projector: .unprojectVector() is now vector.unproject().'
);
console
.
warn
(
'THREE.Projector: .unprojectVector() is now vector.unproject().'
);
vector
.
unproject
(
camera
);
vector
.
unproject
(
camera
);
};
};
this
.
pickingRay
=
function
(
vector
,
camera
)
{
this
.
pickingRay
=
function
(
vector
,
camera
)
{
logger
.
error
(
'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().'
);
console
.
error
(
'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().'
);
};
};
//
var
RenderList
=
function
()
{
var
RenderList
=
function
()
{
var
normals
=
[];
var
normals
=
[];
...
@@ -177,7 +190,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -177,7 +190,7 @@ define(['three'], function(THREE, BSPTree){
var
normalMatrix
=
new
THREE
.
Matrix3
();
var
normalMatrix
=
new
THREE
.
Matrix3
();
var
setObject
=
function
(
value
)
{
function
setObject
(
value
)
{
object
=
value
;
object
=
value
;
material
=
object
.
material
;
material
=
object
.
material
;
...
@@ -187,9 +200,9 @@ define(['three'], function(THREE, BSPTree){
...
@@ -187,9 +200,9 @@ define(['three'], function(THREE, BSPTree){
normals
.
length
=
0
;
normals
.
length
=
0
;
uvs
.
length
=
0
;
uvs
.
length
=
0
;
};
}
var
projectVertex
=
function
(
vertex
)
{
function
projectVertex
(
vertex
)
{
var
position
=
vertex
.
position
;
var
position
=
vertex
.
position
;
var
positionWorld
=
vertex
.
positionWorld
;
var
positionWorld
=
vertex
.
positionWorld
;
...
@@ -208,30 +221,30 @@ define(['three'], function(THREE, BSPTree){
...
@@ -208,30 +221,30 @@ define(['three'], function(THREE, BSPTree){
positionScreen
.
y
>=
-
1
&&
positionScreen
.
y
<=
1
&&
positionScreen
.
y
>=
-
1
&&
positionScreen
.
y
<=
1
&&
positionScreen
.
z
>=
-
1
&&
positionScreen
.
z
<=
1
;
positionScreen
.
z
>=
-
1
&&
positionScreen
.
z
<=
1
;
};
}
var
pushVertex
=
function
(
x
,
y
,
z
)
{
function
pushVertex
(
x
,
y
,
z
)
{
_vertex
=
getNextVertexInPool
();
_vertex
=
getNextVertexInPool
();
_vertex
.
position
.
set
(
x
,
y
,
z
);
_vertex
.
position
.
set
(
x
,
y
,
z
);
projectVertex
(
_vertex
);
projectVertex
(
_vertex
);
};
}
var
pushNormal
=
function
(
x
,
y
,
z
)
{
function
pushNormal
(
x
,
y
,
z
)
{
normals
.
push
(
x
,
y
,
z
);
normals
.
push
(
x
,
y
,
z
);
};
}
var
pushUv
=
function
(
x
,
y
)
{
function
pushUv
(
x
,
y
)
{
uvs
.
push
(
x
,
y
);
uvs
.
push
(
x
,
y
);
};
}
var
checkTriangleVisibility
=
function
(
v1
,
v2
,
v3
)
{
function
checkTriangleVisibility
(
v1
,
v2
,
v3
)
{
if
(
v1
.
visible
===
true
||
v2
.
visible
===
true
||
v3
.
visible
===
true
)
return
true
;
if
(
v1
.
visible
===
true
||
v2
.
visible
===
true
||
v3
.
visible
===
true
)
return
true
;
...
@@ -239,20 +252,20 @@ define(['three'], function(THREE, BSPTree){
...
@@ -239,20 +252,20 @@ define(['three'], function(THREE, BSPTree){
_points3
[
1
]
=
v2
.
positionScreen
;
_points3
[
1
]
=
v2
.
positionScreen
;
_points3
[
2
]
=
v3
.
positionScreen
;
_points3
[
2
]
=
v3
.
positionScreen
;
return
_clipBox
.
isIntersection
Box
(
_boundingBox
.
setFromPoints
(
_points3
)
);
return
_clipBox
.
intersects
Box
(
_boundingBox
.
setFromPoints
(
_points3
)
);
};
}
var
checkBackfaceCulling
=
function
(
v1
,
v2
,
v3
)
{
function
checkBackfaceCulling
(
v1
,
v2
,
v3
)
{
return
(
(
v3
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
*
return
(
(
v3
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
*
(
v2
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
-
(
v2
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
-
(
v3
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
*
(
v3
.
positionScreen
.
y
-
v1
.
positionScreen
.
y
)
*
(
v2
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
)
<
0
;
(
v2
.
positionScreen
.
x
-
v1
.
positionScreen
.
x
)
)
<
0
;
};
}
var
pushLine
=
function
(
a
,
b
)
{
function
pushLine
(
a
,
b
)
{
var
v1
=
_vertexPool
[
a
];
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
var
v2
=
_vertexPool
[
b
];
...
@@ -263,14 +276,15 @@ define(['three'], function(THREE, BSPTree){
...
@@ -263,14 +276,15 @@ define(['three'], function(THREE, BSPTree){
_line
.
v1
.
copy
(
v1
);
_line
.
v1
.
copy
(
v1
);
_line
.
v2
.
copy
(
v2
);
_line
.
v2
.
copy
(
v2
);
_line
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
)
/
2
;
_line
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
)
/
2
;
_line
.
renderOrder
=
object
.
renderOrder
;
_line
.
material
=
object
.
material
;
_line
.
material
=
object
.
material
;
_renderData
.
elements
.
push
(
_line
);
_renderData
.
elements
.
push
(
_line
);
};
}
var
pushTriangle
=
function
(
a
,
b
,
c
)
{
function
pushTriangle
(
a
,
b
,
c
)
{
var
v1
=
_vertexPool
[
a
];
var
v1
=
_vertexPool
[
a
];
var
v2
=
_vertexPool
[
b
];
var
v2
=
_vertexPool
[
b
];
...
@@ -283,24 +297,25 @@ define(['three'], function(THREE, BSPTree){
...
@@ -283,24 +297,25 @@ define(['three'], function(THREE, BSPTree){
_face
=
getNextFaceInPool
();
_face
=
getNextFaceInPool
();
_face
.
id
=
object
.
id
;
_face
.
id
=
object
.
id
;
_face
.
priority
=
face
.
priority
;
_face
.
v1
.
copy
(
v1
);
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
_face
.
v3
.
copy
(
v3
);
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
renderOrder
=
object
.
renderOrder
;
// use first vertex normal as face normal
_face
.
normalModel
.
fromArray
(
normals
,
a
*
3
);
_face
.
normalModel
.
applyMatrix3
(
normalMatrix
).
normalize
();
for
(
var
i
=
0
;
i
<
3
;
i
++
)
{
for
(
var
i
=
0
;
i
<
3
;
i
++
)
{
var
offset
=
arguments
[
i
]
*
3
;
var
normal
=
_face
.
vertexNormalsModel
[
i
];
var
normal
=
_face
.
vertexNormalsModel
[
i
];
normal
.
fromArray
(
normals
,
arguments
[
i
]
*
3
);
normal
.
set
(
normals
[
offset
],
normals
[
offset
+
1
],
normals
[
offset
+
2
]
);
normal
.
applyMatrix3
(
normalMatrix
).
normalize
();
normal
.
applyMatrix3
(
normalMatrix
).
normalize
();
var
offset2
=
arguments
[
i
]
*
2
;
var
uv
=
_face
.
uvs
[
i
];
var
uv
=
_face
.
uvs
[
i
];
uv
.
set
(
uvs
[
offset2
],
uvs
[
offset2
+
1
]
);
uv
.
fromArray
(
uvs
,
arguments
[
i
]
*
2
);
}
}
...
@@ -312,7 +327,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -312,7 +327,7 @@ define(['three'], function(THREE, BSPTree){
}
}
};
}
return
{
return
{
setObject
:
setObject
,
setObject
:
setObject
,
...
@@ -324,7 +339,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -324,7 +339,7 @@ define(['three'], function(THREE, BSPTree){
pushUv
:
pushUv
,
pushUv
:
pushUv
,
pushLine
:
pushLine
,
pushLine
:
pushLine
,
pushTriangle
:
pushTriangle
pushTriangle
:
pushTriangle
};
}
};
};
...
@@ -341,29 +356,21 @@ define(['three'], function(THREE, BSPTree){
...
@@ -341,29 +356,21 @@ define(['three'], function(THREE, BSPTree){
_camera
=
camera
;
_camera
=
camera
;
if
(
scene
.
autoUpdate
===
true
)
scene
.
updateMatrixWorld
();
if
(
scene
.
autoUpdate
===
true
)
scene
.
updateMatrixWorld
();
if
(
camera
.
parent
===
undefined
)
camera
.
updateMatrixWorld
();
if
(
camera
.
parent
===
null
)
camera
.
updateMatrixWorld
();
_viewMatrix
.
copy
(
camera
.
matrixWorldInverse
.
getInverse
(
camera
.
matrixWorld
)
);
_viewMatrix
.
copy
(
camera
.
matrixWorldInverse
.
getInverse
(
camera
.
matrixWorld
)
);
_viewProjectionMatrix
.
multiplyMatrices
(
camera
.
projectionMatrix
,
_viewMatrix
);
_viewProjectionMatrix
.
multiplyMatrices
(
camera
.
projectionMatrix
,
_viewMatrix
);
_frustum
.
setFromMatrix
(
_viewProjectionMatrix
);
_frustum
.
setFromMatrix
(
_viewProjectionMatrix
);
//
_objectCount
=
0
;
_objectCount
=
0
;
_renderData
.
objects
.
length
=
0
;
_renderData
.
objects
.
length
=
0
;
_renderData
.
lights
.
length
=
0
;
_renderData
.
lights
.
length
=
0
;
scene
.
traverseVisible
(
function
(
object
)
{
function
addObject
(
object
)
{
if
(
object
instanceof
THREE
.
Light
)
{
_renderData
.
lights
.
push
(
object
);
}
else
if
(
object
instanceof
THREE
.
Mesh
||
object
instanceof
THREE
.
Line
||
object
instanceof
THREE
.
Sprite
)
{
if
(
object
.
material
.
visible
===
false
)
return
;
if
(
object
.
frustumCulled
===
false
||
_frustum
.
intersectsObject
(
object
)
===
true
)
{
_object
=
getNextObjectInPool
();
_object
=
getNextObjectInPool
();
_object
.
id
=
object
.
id
;
_object
.
id
=
object
.
id
;
...
@@ -372,21 +379,44 @@ define(['three'], function(THREE, BSPTree){
...
@@ -372,21 +379,44 @@ define(['three'], function(THREE, BSPTree){
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
setFromMatrixPosition
(
object
.
matrixWorld
);
_vector3
.
applyProjection
(
_viewProjectionMatrix
);
_vector3
.
applyProjection
(
_viewProjectionMatrix
);
_object
.
z
=
_vector3
.
z
;
_object
.
z
=
_vector3
.
z
;
_object
.
renderOrder
=
object
.
renderOrder
;
_renderData
.
objects
.
push
(
_object
);
_renderData
.
objects
.
push
(
_object
);
}
}
scene
.
traverseVisible
(
function
(
object
)
{
if
(
object
instanceof
THREE
.
Light
)
{
_renderData
.
lights
.
push
(
object
);
}
else
if
(
object
instanceof
THREE
.
Mesh
||
object
instanceof
THREE
.
Line
)
{
if
(
object
.
material
.
visible
===
false
)
return
;
if
(
object
.
frustumCulled
===
true
&&
_frustum
.
intersectsObject
(
object
)
===
false
)
return
;
addObject
(
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
)
{
if
(
sortObjects
===
true
)
{
_renderData
.
objects
.
sort
(
custom
Sort
);
_renderData
.
objects
.
sort
(
painter
Sort
);
}
}
//
for
(
var
o
=
0
,
ol
=
_renderData
.
objects
.
length
;
o
<
ol
;
o
++
)
{
for
(
var
o
=
0
,
ol
=
_renderData
.
objects
.
length
;
o
<
ol
;
o
++
)
{
var
object
=
_renderData
.
objects
[
o
].
object
;
var
object
=
_renderData
.
objects
[
o
].
object
;
...
@@ -403,13 +433,13 @@ define(['three'], function(THREE, BSPTree){
...
@@ -403,13 +433,13 @@ define(['three'], function(THREE, BSPTree){
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
if
(
geometry
instanceof
THREE
.
BufferGeometry
)
{
var
attributes
=
geometry
.
attributes
;
var
attributes
=
geometry
.
attributes
;
var
offsets
=
geometry
.
offset
s
;
var
groups
=
geometry
.
group
s
;
if
(
attributes
.
position
===
undefined
)
continue
;
if
(
attributes
.
position
===
undefined
)
continue
;
var
positions
=
attributes
.
position
.
array
;
var
positions
=
attributes
.
position
.
array
;
for
(
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
...
@@ -419,7 +449,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -419,7 +449,7 @@ define(['three'], function(THREE, BSPTree){
var
normals
=
attributes
.
normal
.
array
;
var
normals
=
attributes
.
normal
.
array
;
for
(
i
=
0
,
l
=
normals
.
length
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
0
,
l
=
normals
.
length
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushNormal
(
normals
[
i
],
normals
[
i
+
1
],
normals
[
i
+
2
]
);
renderList
.
pushNormal
(
normals
[
i
],
normals
[
i
+
1
],
normals
[
i
+
2
]
);
...
@@ -431,7 +461,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -431,7 +461,7 @@ define(['three'], function(THREE, BSPTree){
var
uvs
=
attributes
.
uv
.
array
;
var
uvs
=
attributes
.
uv
.
array
;
for
(
i
=
0
,
l
=
uvs
.
length
;
i
<
l
;
i
+=
2
)
{
for
(
var
i
=
0
,
l
=
uvs
.
length
;
i
<
l
;
i
+=
2
)
{
renderList
.
pushUv
(
uvs
[
i
],
uvs
[
i
+
1
]
);
renderList
.
pushUv
(
uvs
[
i
],
uvs
[
i
+
1
]
);
...
@@ -439,20 +469,19 @@ define(['three'], function(THREE, BSPTree){
...
@@ -439,20 +469,19 @@ define(['three'], function(THREE, BSPTree){
}
}
if
(
attributes
.
index
!==
undefined
)
{
if
(
geometry
.
index
!==
null
)
{
var
indices
=
attributes
.
index
.
array
;
var
indices
=
geometry
.
index
.
array
;
if
(
offset
s
.
length
>
0
)
{
if
(
group
s
.
length
>
0
)
{
for
(
o
=
0
;
o
<
offset
s
.
length
;
o
++
)
{
for
(
var
o
=
0
;
o
<
group
s
.
length
;
o
++
)
{
var
offset
=
offsets
[
o
];
var
group
=
groups
[
o
];
var
index
=
offset
.
index
;
for
(
i
=
offset
.
start
,
l
=
offset
.
start
+
offset
.
count
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
group
.
start
,
l
=
group
.
start
+
group
.
count
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushTriangle
(
indices
[
i
]
+
index
,
indices
[
i
+
1
]
+
index
,
indices
[
i
+
2
]
+
index
);
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
}
}
...
@@ -460,7 +489,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -460,7 +489,7 @@ define(['three'], function(THREE, BSPTree){
}
else
{
}
else
{
for
(
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
renderList
.
pushTriangle
(
indices
[
i
],
indices
[
i
+
1
],
indices
[
i
+
2
]
);
...
@@ -470,7 +499,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -470,7 +499,7 @@ define(['three'], function(THREE, BSPTree){
}
else
{
}
else
{
for
(
i
=
0
,
l
=
positions
.
length
/
3
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
0
,
l
=
positions
.
length
/
3
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushTriangle
(
i
,
i
+
1
,
i
+
2
);
renderList
.
pushTriangle
(
i
,
i
+
1
,
i
+
2
);
...
@@ -486,93 +515,73 @@ define(['three'], function(THREE, BSPTree){
...
@@ -486,93 +515,73 @@ define(['three'], function(THREE, BSPTree){
_normalMatrix
.
getNormalMatrix
(
_modelMatrix
);
_normalMatrix
.
getNormalMatrix
(
_modelMatrix
);
var
isFaceMaterial
=
object
.
material
instanceof
THREE
.
MeshFaceMaterial
;
var
material
=
object
.
material
;
var
isFaceMaterial
=
material
instanceof
THREE
.
MultiMaterial
;
var
objectMaterials
=
isFaceMaterial
===
true
?
object
.
material
:
null
;
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
);
}
for
(
var
f
=
0
,
fl
=
faces
.
length
;
f
<
fl
;
f
++
)
{
_vector3
.
copy
(
vertex
);
var
face
=
faces
[
f
];
var
material
;
if
(
isFaceMaterial
===
true
){
material
=
objectMaterials
.
materials
[
face
.
materialIndex
];
}
else
{
material
=
object
.
material
;
}
if
(
material
===
undefined
)
continue
;
var
side
=
material
.
side
;
var
v1
=
_vertexPool
[
face
.
a
];
var
v2
=
_vertexPool
[
face
.
b
];
var
v3
=
_vertexPool
[
face
.
c
];
if
(
material
.
morphTargets
===
true
)
{
if
(
material
.
morphTargets
===
true
)
{
var
morphTargets
=
geometry
.
morphTargets
;
var
morphTargets
=
geometry
.
morphTargets
;
var
morphInfluences
=
object
.
morphTargetInfluences
;
var
morphInfluences
=
object
.
morphTargetInfluences
;
var
v1p
=
v1
.
position
;
var
v2p
=
v2
.
position
;
var
v3p
=
v3
.
position
;
_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
t
=
0
,
tl
=
morphTargets
.
length
;
t
<
tl
;
t
++
)
{
var
influence
=
morphInfluences
[
t
];
var
influence
=
morphInfluences
[
t
];
if
(
influence
===
0
)
continue
;
if
(
influence
===
0
)
continue
;
var
targets
=
morphTargets
[
t
].
vertices
;
var
target
=
morphTargets
[
t
];
var
targetVertex
=
target
.
vertices
[
v
];
_vA
.
x
+=
(
targets
[
face
.
a
].
x
-
v1p
.
x
)
*
influence
;
_vector3
.
x
+=
(
targetVertex
.
x
-
vertex
.
x
)
*
influence
;
_vA
.
y
+=
(
targets
[
face
.
a
].
y
-
v1p
.
y
)
*
influence
;
_vector3
.
y
+=
(
targetVertex
.
y
-
vertex
.
y
)
*
influence
;
_vA
.
z
+=
(
targets
[
face
.
a
].
z
-
v1p
.
z
)
*
influence
;
_vector3
.
z
+=
(
targetVertex
.
z
-
vertex
.
z
)
*
influence
;
_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
;
}
_vC
.
x
+=
(
targets
[
face
.
c
].
x
-
v3p
.
x
)
*
influence
;
renderList
.
pushVertex
(
_vector3
.
x
,
_vector3
.
y
,
_vector3
.
z
);
_vC
.
y
+=
(
targets
[
face
.
c
].
y
-
v3p
.
y
)
*
influence
;
_vC
.
z
+=
(
targets
[
face
.
c
].
z
-
v3p
.
z
)
*
influence
;
}
}
v1
.
position
.
add
(
_vA
);
for
(
var
f
=
0
,
fl
=
faces
.
length
;
f
<
fl
;
f
++
)
{
v2
.
position
.
add
(
_vB
);
v3
.
position
.
add
(
_vC
)
;
var
face
=
faces
[
f
]
;
renderList
.
projectVertex
(
v1
);
material
=
isFaceMaterial
===
true
renderList
.
projectVertex
(
v2
);
?
objectMaterials
.
materials
[
face
.
materialIndex
]
renderList
.
projectVertex
(
v3
)
;
:
object
.
material
;
}
if
(
material
===
undefined
)
continue
;
var
side
=
material
.
side
;
var
v1
=
_vertexPool
[
face
.
a
];
var
v2
=
_vertexPool
[
face
.
b
];
var
v3
=
_vertexPool
[
face
.
c
];
if
(
renderList
.
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
continue
;
if
(
renderList
.
checkTriangleVisibility
(
v1
,
v2
,
v3
)
===
false
)
continue
;
var
visible
=
renderList
.
checkBackfaceCulling
(
v1
,
v2
,
v3
);
var
visible
=
renderList
.
checkBackfaceCulling
(
v1
,
v2
,
v3
);
if
(
side
!==
THREE
.
DoubleSide
)
{
if
(
side
!==
THREE
.
DoubleSide
)
{
if
(
side
===
THREE
.
FrontSide
&&
visible
===
false
)
continue
;
if
(
side
===
THREE
.
FrontSide
&&
visible
===
false
)
continue
;
if
(
side
===
THREE
.
BackSide
&&
visible
===
true
)
continue
;
if
(
side
===
THREE
.
BackSide
&&
visible
===
true
)
continue
;
}
}
_face
=
getNextFaceInPool
();
_face
=
getNextFaceInPool
();
_face
.
id
=
object
.
id
;
_face
.
id
=
object
.
id
;
_face
.
priority
=
face
.
priority
;
_face
.
v1
.
copy
(
v1
);
_face
.
v1
.
copy
(
v1
);
_face
.
v2
.
copy
(
v2
);
_face
.
v2
.
copy
(
v2
);
_face
.
v3
.
copy
(
v3
);
_face
.
v3
.
copy
(
v3
);
...
@@ -622,6 +631,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -622,6 +631,7 @@ define(['three'], function(THREE, BSPTree){
_face
.
material
=
material
;
_face
.
material
=
material
;
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
z
=
(
v1
.
positionScreen
.
z
+
v2
.
positionScreen
.
z
+
v3
.
positionScreen
.
z
)
/
3
;
_face
.
renderOrder
=
object
.
renderOrder
;
_renderData
.
elements
.
push
(
_face
);
_renderData
.
elements
.
push
(
_face
);
...
@@ -639,17 +649,17 @@ define(['three'], function(THREE, BSPTree){
...
@@ -639,17 +649,17 @@ define(['three'], function(THREE, BSPTree){
var
positions
=
attributes
.
position
.
array
;
var
positions
=
attributes
.
position
.
array
;
for
(
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
for
(
var
i
=
0
,
l
=
positions
.
length
;
i
<
l
;
i
+=
3
)
{
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
renderList
.
pushVertex
(
positions
[
i
],
positions
[
i
+
1
],
positions
[
i
+
2
]
);
}
}
if
(
attributes
.
index
!==
undefined
)
{
if
(
geometry
.
index
!==
null
)
{
var
indices
=
attributes
.
index
.
array
;
var
indices
=
geometry
.
index
.
array
;
for
(
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
2
)
{
for
(
var
i
=
0
,
l
=
indices
.
length
;
i
<
l
;
i
+=
2
)
{
renderList
.
pushLine
(
indices
[
i
],
indices
[
i
+
1
]
);
renderList
.
pushLine
(
indices
[
i
],
indices
[
i
+
1
]
);
...
@@ -657,9 +667,9 @@ define(['three'], function(THREE, BSPTree){
...
@@ -657,9 +667,9 @@ define(['three'], function(THREE, BSPTree){
}
else
{
}
else
{
var
step
=
object
.
mode
===
THREE
.
LinePiece
s
?
2
:
1
;
var
step
=
object
instanceof
THREE
.
LineSegment
s
?
2
:
1
;
for
(
i
=
0
,
l
=
(
positions
.
length
/
3
)
-
1
;
i
<
l
;
i
+=
step
)
{
for
(
var
i
=
0
,
l
=
(
positions
.
length
/
3
)
-
1
;
i
<
l
;
i
+=
step
)
{
renderList
.
pushLine
(
i
,
i
+
1
);
renderList
.
pushLine
(
i
,
i
+
1
);
...
@@ -677,17 +687,14 @@ define(['three'], function(THREE, BSPTree){
...
@@ -677,17 +687,14 @@ define(['three'], function(THREE, BSPTree){
if
(
vertices
.
length
===
0
)
continue
;
if
(
vertices
.
length
===
0
)
continue
;
var
v1
=
getNextVertexInPool
();
v1
=
getNextVertexInPool
();
v1
.
positionWorld
.
copy
(
vertices
[
0
]
);
v1
.
positionScreen
.
copy
(
vertices
[
0
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
v1
.
positionScreen
.
copy
(
vertices
[
0
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
// Handle LineStrip and LinePieces
var
step
=
object
instanceof
THREE
.
LineSegments
?
2
:
1
;
var
step
=
object
.
mode
===
THREE
.
LinePieces
?
2
:
1
;
for
(
var
v
=
1
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
for
(
var
v
=
1
,
vl
=
vertices
.
length
;
v
<
vl
;
v
++
)
{
v1
=
getNextVertexInPool
();
v1
=
getNextVertexInPool
();
v1
.
positionWorld
.
copy
(
vertices
[
v
]
);
v1
.
positionScreen
.
copy
(
vertices
[
v
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
v1
.
positionScreen
.
copy
(
vertices
[
v
]
).
applyMatrix4
(
_modelViewProjectionMatrix
);
if
(
(
v
+
1
)
%
step
>
0
)
continue
;
if
(
(
v
+
1
)
%
step
>
0
)
continue
;
...
@@ -707,12 +714,10 @@ define(['three'], function(THREE, BSPTree){
...
@@ -707,12 +714,10 @@ define(['three'], function(THREE, BSPTree){
_line
.
id
=
object
.
id
;
_line
.
id
=
object
.
id
;
_line
.
v1
.
positionScreen
.
copy
(
_clippedVertex1PositionScreen
);
_line
.
v1
.
positionScreen
.
copy
(
_clippedVertex1PositionScreen
);
_line
.
v1
.
positionWorld
.
copy
(
v1
.
positionWorld
);
_line
.
v2
.
positionScreen
.
copy
(
_clippedVertex2PositionScreen
);
_line
.
v2
.
positionScreen
.
copy
(
_clippedVertex2PositionScreen
);
_line
.
v2
.
positionWorld
.
copy
(
v2
.
positionWorld
);
_line
.
z
=
Math
.
max
(
_clippedVertex1PositionScreen
.
z
,
_clippedVertex2PositionScreen
.
z
);
_line
.
z
=
Math
.
max
(
_clippedVertex1PositionScreen
.
z
,
_clippedVertex2PositionScreen
.
z
);
_line
.
renderOrder
=
object
.
renderOrder
;
_line
.
material
=
object
.
material
;
_line
.
material
=
object
.
material
;
...
@@ -747,14 +752,13 @@ define(['three'], function(THREE, BSPTree){
...
@@ -747,14 +752,13 @@ define(['three'], function(THREE, BSPTree){
_sprite
.
x
=
_vector4
.
x
*
invW
;
_sprite
.
x
=
_vector4
.
x
*
invW
;
_sprite
.
y
=
_vector4
.
y
*
invW
;
_sprite
.
y
=
_vector4
.
y
*
invW
;
_sprite
.
z
=
_vector4
.
z
;
_sprite
.
z
=
_vector4
.
z
;
_sprite
.
renderOrder
=
object
.
renderOrder
;
_sprite
.
object
=
object
;
_sprite
.
object
=
object
;
_sprite
.
rotation
=
object
.
rotation
;
_sprite
.
rotation
=
object
.
rotation
;
_sprite
.
scale
.
x
=
object
.
scale
.
x
*
Math
.
abs
(
_sprite
.
x
-
(
_vector4
.
x
+
camera
.
projectionMatrix
.
elements
[
0
]
)
_sprite
.
scale
.
x
=
object
.
scale
.
x
*
Math
.
abs
(
_sprite
.
x
-
(
_vector4
.
x
+
camera
.
projectionMatrix
.
elements
[
0
]
)
/
(
_vector4
.
w
+
camera
.
projectionMatrix
.
elements
[
12
]
)
);
/
(
_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
.
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
;
_sprite
.
material
=
object
.
material
;
...
@@ -768,10 +772,12 @@ define(['three'], function(THREE, BSPTree){
...
@@ -768,10 +772,12 @@ define(['three'], function(THREE, BSPTree){
if
(
sortElements
===
true
)
{
if
(
sortElements
===
true
)
{
//_renderData.elements.sort( custom
Sort );
_renderData
.
elements
.
sort
(
painter
Sort
);
}
}
//
// Build the BSP tree
// Build the BSP tree
var
btree
=
new
BSPTree
(
_renderData
.
elements
);
var
btree
=
new
BSPTree
(
_renderData
.
elements
);
_renderData
.
elements
=
btree
.
toArray
();
_renderData
.
elements
=
btree
.
toArray
();
...
@@ -788,7 +794,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -788,7 +794,7 @@ define(['three'], function(THREE, BSPTree){
if
(
_objectCount
===
_objectPoolLength
)
{
if
(
_objectCount
===
_objectPoolLength
)
{
var
object
=
new
Projector
.
RenderableObject
();
var
object
=
new
THREE
.
RenderableObject
();
_objectPool
.
push
(
object
);
_objectPool
.
push
(
object
);
_objectPoolLength
++
;
_objectPoolLength
++
;
_objectCount
++
;
_objectCount
++
;
...
@@ -804,7 +810,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -804,7 +810,7 @@ define(['three'], function(THREE, BSPTree){
if
(
_vertexCount
===
_vertexPoolLength
)
{
if
(
_vertexCount
===
_vertexPoolLength
)
{
var
vertex
=
new
Projector
.
RenderableVertex
();
var
vertex
=
new
THREE
.
RenderableVertex
();
_vertexPool
.
push
(
vertex
);
_vertexPool
.
push
(
vertex
);
_vertexPoolLength
++
;
_vertexPoolLength
++
;
_vertexCount
++
;
_vertexCount
++
;
...
@@ -820,7 +826,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -820,7 +826,7 @@ define(['three'], function(THREE, BSPTree){
if
(
_faceCount
===
_facePoolLength
)
{
if
(
_faceCount
===
_facePoolLength
)
{
var
face
=
new
Projector
.
RenderableFace
();
var
face
=
new
THREE
.
RenderableFace
();
_facePool
.
push
(
face
);
_facePool
.
push
(
face
);
_facePoolLength
++
;
_facePoolLength
++
;
_faceCount
++
;
_faceCount
++
;
...
@@ -837,7 +843,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -837,7 +843,7 @@ define(['three'], function(THREE, BSPTree){
if
(
_lineCount
===
_linePoolLength
)
{
if
(
_lineCount
===
_linePoolLength
)
{
var
line
=
new
Projector
.
RenderableLine
();
var
line
=
new
THREE
.
RenderableLine
();
_linePool
.
push
(
line
);
_linePool
.
push
(
line
);
_linePoolLength
++
;
_linePoolLength
++
;
_lineCount
++
;
_lineCount
++
;
...
@@ -853,7 +859,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -853,7 +859,7 @@ define(['three'], function(THREE, BSPTree){
if
(
_spriteCount
===
_spritePoolLength
)
{
if
(
_spriteCount
===
_spritePoolLength
)
{
var
sprite
=
new
Projector
.
RenderableSprite
();
var
sprite
=
new
THREE
.
RenderableSprite
();
_spritePool
.
push
(
sprite
);
_spritePool
.
push
(
sprite
);
_spritePoolLength
++
;
_spritePoolLength
++
;
_spriteCount
++
;
_spriteCount
++
;
...
@@ -865,6 +871,32 @@ define(['three'], function(THREE, BSPTree){
...
@@ -865,6 +871,32 @@ define(['three'], function(THREE, BSPTree){
}
}
//
function
painterSort
(
a
,
b
)
{
if
(
a
.
renderOrder
!==
b
.
renderOrder
)
{
return
a
.
renderOrder
-
b
.
renderOrder
;
}
else
if
(
a
.
z
!==
b
.
z
)
{
return
b
.
z
-
a
.
z
;
}
else
if
(
a
.
id
!==
b
.
id
)
{
return
a
.
id
-
b
.
id
;
}
else
{
return
0
;
}
}
//
function
BSPTree
(
data
){
function
BSPTree
(
data
){
if
(
data
.
length
){
if
(
data
.
length
){
this
.
root
=
BSPTree
.
utils
.
createNode
(
data
[
0
]);
this
.
root
=
BSPTree
.
utils
.
createNode
(
data
[
0
]);
...
@@ -1242,24 +1274,7 @@ define(['three'], function(THREE, BSPTree){
...
@@ -1242,24 +1274,7 @@ 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
)
{
...
@@ -1334,6 +1349,6 @@ define(['three'], function(THREE, BSPTree){
...
@@ -1334,6 +1349,6 @@ define(['three'], function(THREE, BSPTree){
};
};
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