projectObject method
Implementation
void projectObject(Object3D object, Camera camera, int groupOrder, bool sortObjects) {
if (!object.visible) return;
final visible = object.layers.test(camera.layers);
if (visible) {
if (object is Group) {
groupOrder = object.renderOrder;
}
else if (object is LOD) {
dynamic u = object;
if (object.autoUpdate == true) u.update(camera);
}
else if (object is Light) {
currentRenderState!.pushLight(object);
if (object.castShadow) {
currentRenderState!.pushShadow(object);
}
}
else if (object is Sprite) {
if (!object.frustumCulled || _frustum.intersectsSprite(object)) {
if (sortObjects) {
_vector4.setFromMatrixPosition(object.matrixWorld).applyMatrix4(projScreenMatrix);
}
BufferGeometry geometry = objects.update(object);
final material = object.material;
if (material != null && material.visible) {
currentRenderList!.push(object, geometry, material, groupOrder, _vector4.z, null);
}
}
}
else if (object is Mesh || object is Line || object is Points) {
// if (object is SkinnedMesh) {
// // update skeleton only once in a frame
// if (object.skeleton!.frame != info.render["frame"]) {
// object.skeleton!.update();
// object.skeleton!.frame = info.render["frame"]!;
// }
// }
// print("object: ${object.type} ${!object.frustumCulled} ${_frustum.intersectsObject(object)} ");
if (!object.frustumCulled || _frustum.intersectsObject(object)) {
final geometry = objects.update(object);
final material = object.material;
if (sortObjects) {
if (object.boundingSphere != null ) {
if (object.boundingSphere == null ) object.computeBoundingSphere();
_vector4.setFrom(object.boundingSphere!.center );
}
else {
if ( geometry.boundingSphere == null ) geometry.computeBoundingSphere();
_vector4.setFrom( geometry.boundingSphere!.center );
}
_vector4..applyMatrix4(object.matrixWorld)..applyMatrix4(projScreenMatrix);
}
if (material is GroupMaterial) {
final groups = geometry.groups;
if (groups.isNotEmpty) {
for (int i = 0, l = groups.length; i < l; i++) {
Map<String, dynamic> group = groups[i];
final groupMaterial = material.children[group["materialIndex"]];
if (groupMaterial.visible) {
currentRenderList!.push(object, geometry, groupMaterial, groupOrder, _vector4.z, group);
}
}
}
else {
if (material.visible && material.children.isNotEmpty) {
currentRenderList!.push(object, geometry, material.children[0], groupOrder, _vector4.z, null);
}
}
}
else if (material != null && material.visible) {
currentRenderList!.push(object, geometry, material, groupOrder, _vector4.z, null);
}
}
}
}
final children = object.children;
for (int i = 0, l = children.length; i < l; i++) {
projectObject(children[i], camera, groupOrder, sortObjects);
}
}