#include "WindowSystemAdapter.hxx"
#include <simgear/props/props.hxx>
#include <simgear/structure/OSGUtils.hxx>
+#include <simgear/scene/material/EffectCullVisitor.hxx>
#include <simgear/scene/util/RenderConstants.hxx>
#include <algorithm>
#include <osgUtil/IntersectionVisitor>
#include <osgViewer/GraphicsWindow>
+#include <osgViewer/Renderer>
namespace flightgear
{
void installCullVisitor(Camera* camera)
{
-#if 0 // Not yet
osgViewer::Renderer* renderer
= static_cast<osgViewer::Renderer*>(camera->getRenderer());
for (int i = 0; i < 2; ++i) {
osgUtil::SceneView* sceneView = renderer->getSceneView(i);
sceneView->setCullVisitor(new simgear::EffectCullVisitor);
}
-#endif
}
}
Camera* farCamera = 0;
if ((flags & (GUI | ORTHO)) == 0) {
- farCamera = simgear::clone(camera);
+ farCamera = new Camera;
+ farCamera->setAllowEventFocus(camera->getAllowEventFocus());
farCamera->setGraphicsContext(camera->getGraphicsContext());
+ farCamera->setCullingMode(camera->getCullingMode());
+ farCamera->setInheritanceMask(camera->getInheritanceMask());
+ farCamera->setReferenceFrame(Transform::ABSOLUTE_RF);
// Each camera's viewport is written when the window is
// resized; if the the viewport isn't copied here, it gets updated
// twice and ends up with the wrong value.
installCullVisitor(farCamera);
info->farCamera = farCamera;
info->farSlaveIndex = _viewer->getNumSlaves() - 1;
- farCamera->setRenderOrder(Camera::NESTED_RENDER, info->farSlaveIndex);
+ farCamera->setRenderOrder(Camera::POST_RENDER, info->farSlaveIndex);
camera->setCullMask(camera->getCullMask() & ~simgear::BACKGROUND_BIT);
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
}
installCullVisitor(camera);
info->camera = camera;
info->slaveIndex = _viewer->getNumSlaves() - 1;
- camera->setRenderOrder(Camera::NESTED_RENDER, info->slaveIndex);
+ camera->setRenderOrder(Camera::POST_RENDER, info->slaveIndex);
_cameras.push_back(info);
return info;
}
void CameraGroup::setCameraParameters(float vfov, float aspectRatio)
{
- _viewer->getCamera()->setProjectionMatrixAsPerspective(vfov,
- 1.0f / aspectRatio,
- _zNear, _zFar);
+ if (vfov != 0.0f && aspectRatio != 0.0f)
+ _viewer->getCamera()
+ ->setProjectionMatrixAsPerspective(vfov,
+ 1.0f / aspectRatio,
+ _zNear, _zFar);
}
}
WindowBuilder *wBuild = WindowBuilder::getWindowBuilder();
const SGPropertyNode* windowNode = cameraNode->getNode("window");
GraphicsWindow* window = 0;
- static int cameraNum = 0;
int cameraFlags = DO_INTERSECTION_TEST;
if (windowNode) {
// New style window declaration / definition
const SGPropertyNode* windowNode = (cameraNode
? cameraNode->getNode("window")
: 0);
- static int cameraNum = 0;
if (!window) {
if (windowNode) {
// New style window declaration / definition
cgroup->buildGUICamera(pNode);
}
}
- bindMemberToNode(gnode, "znear", cgroup, &CameraGroup::_zNear, .4f);
+ bindMemberToNode(gnode, "znear", cgroup, &CameraGroup::_zNear, .1f);
bindMemberToNode(gnode, "zfar", cgroup, &CameraGroup::_zFar, 120000.0f);
bindMemberToNode(gnode, "near-field", cgroup, &CameraGroup::_nearField,
100.0f);