/** * Checks if a model is visible using camera frustum culling and model layer visibility. * * @param camera * @param gameModel * @return */ private boolean isVisible(final Camera camera, final GameModel gameModel) { if (!gameModel.visibleOnLayers.intersects(engine.getVisibleLayers())) { return false; } gameModel.modelInstance.transform.getTranslation(tmp); tmp.add(gameModel.center); return camera.frustum.sphereInFrustum(tmp, gameModel.boundingBoxRadius); }
private void updateModelCache(Bits visibleLayers) { dynamicModels.clear(); modelCache.begin(); for (GameObject obj : objectsById.values()) { if (obj instanceof GameModelBody) { GameModelBody model = (GameModelBody) obj; if (model.mass == 0) { // All bodies with mass of zero are static so cache them if visible if (model.visibleOnLayers.intersects(visibleLayers)) { modelCache.add(model.modelInstance); } } else { // Dynamic bodies are checked for visibility in render method dynamicModels.add(model); } } else if (obj instanceof Billboard) { // TODO: If more billboards than selection marker are ever used, handle them here dynamicModels.add((Billboard) obj); } else if (obj instanceof GameModel) { // TODO: If non-static models without bodies are ever used, handle them here GameModel model = (GameModel) obj; if (model.visibleOnLayers.intersects(visibleLayers)) { modelCache.add(model.modelInstance); } } } modelCache.end(); modelCacheDirty = false; }
interested = filter.anySet.intersects(componentBits); interested = !filter.exclusionSet.intersects(componentBits);
@Override public float addSingleResult(LocalRayResult rayResult, boolean normalInWorldSpace) { float hitFraction = rayResult.getHitFraction(); btCollisionObject hitObj = rayResult.getCollisionObject(); Entity entity = getEntity(hitObj.getUserPointer()); if (entity instanceof GameModel) { GameModel model = (GameModel) entity; if (hitFraction < this.hitFraction && (layers == null || model.visibleOnLayers.intersects(layers))) { this.hitFraction = hitFraction; super.addSingleResult(rayResult, normalInWorldSpace); return hitFraction; } } else if (entity.getId() == scene.navmeshBody.getId()) { Triangle triangle = scene.navMesh.rayTest(ray, rayDistance, layers); if (triangle == null) { // Triangle is not on allowed layer return 1; } Intersector.intersectRayTriangle(ray, triangle.a, triangle.b, triangle.c, tmp); hitFraction = rayFrom.dst(tmp) / rayFrom.dst(rayTo); if (hitFraction < this.hitFraction) { this.hitFraction = hitFraction; rayResult.setHitFraction(hitFraction); super.addSingleResult(rayResult, normalInWorldSpace); return hitFraction; } } return 1; } }