From Ulrich Hertlein, spelling corrections and a few Doxgen comments.
This commit is contained in:
parent
b0358c698a
commit
7d5c81bf5e
@ -187,7 +187,7 @@ osg::Node* createModel(bool overlay)
|
|||||||
if (overlay)
|
if (overlay)
|
||||||
{
|
{
|
||||||
osgSim::OverlayNode* overlayNode = new osgSim::OverlayNode;
|
osgSim::OverlayNode* overlayNode = new osgSim::OverlayNode;
|
||||||
overlayNode->setContinousUpdate(true);
|
overlayNode->setContinuousUpdate(true);
|
||||||
overlayNode->setOverlaySubgraph(movingModel);
|
overlayNode->setOverlaySubgraph(movingModel);
|
||||||
overlayNode->addChild(baseModel);
|
overlayNode->addChild(baseModel);
|
||||||
root->addChild(overlayNode);
|
root->addChild(overlayNode);
|
||||||
|
@ -38,7 +38,7 @@ osg::Node* createRearView(osg::Node* subgraph, const osg::Vec4& clearColour)
|
|||||||
// set the view matrix
|
// set the view matrix
|
||||||
camera->setCullingActive(false);
|
camera->setCullingActive(false);
|
||||||
camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
|
camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
|
||||||
camera->setTransformOrder(osg::CameraNode::POST_MULTIPLE);
|
camera->setTransformOrder(osg::CameraNode::POST_MULTIPLY);
|
||||||
|
|
||||||
camera->setProjectionMatrix(osg::Matrixd::scale(-1.0f,1.0f,1.0f));
|
camera->setProjectionMatrix(osg::Matrixd::scale(-1.0f,1.0f,1.0f));
|
||||||
camera->setViewMatrix(osg::Matrixd::rotate(osg::inDegrees(180.0f),0.0f,1.0f,0.0f));
|
camera->setViewMatrix(osg::Matrixd::rotate(osg::inDegrees(180.0f),0.0f,1.0f,0.0f));
|
||||||
|
@ -85,11 +85,14 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings
|
|||||||
|
|
||||||
enum TransformOrder
|
enum TransformOrder
|
||||||
{
|
{
|
||||||
PRE_MULTIPLE,
|
PRE_MULTIPLY,
|
||||||
POST_MULTIPLE
|
POST_MULTIPLY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Set the transformation order for world-to-local and local-to-world transformation.*/
|
||||||
void setTransformOrder(TransformOrder order) { _transformOrder = order; }
|
void setTransformOrder(TransformOrder order) { _transformOrder = order; }
|
||||||
|
|
||||||
|
/** Get the transformation order.*/
|
||||||
TransformOrder getTransformOrder() const { return _transformOrder; }
|
TransformOrder getTransformOrder() const { return _transformOrder; }
|
||||||
|
|
||||||
|
|
||||||
@ -195,12 +198,16 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings
|
|||||||
SEPERATE_WINDOW
|
SEPERATE_WINDOW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Set the render target.*/
|
||||||
void setRenderTargetImplementation(RenderTargetImplementation impl);
|
void setRenderTargetImplementation(RenderTargetImplementation impl);
|
||||||
|
|
||||||
|
/** Set the render target and fall-back that's used if the former isn't available.*/
|
||||||
void setRenderTargetImplementation(RenderTargetImplementation impl, RenderTargetImplementation fallback);
|
void setRenderTargetImplementation(RenderTargetImplementation impl, RenderTargetImplementation fallback);
|
||||||
|
|
||||||
|
/** Get the render target.*/
|
||||||
RenderTargetImplementation getRenderTargetImplementation() const { return _renderTargetImplementation; }
|
RenderTargetImplementation getRenderTargetImplementation() const { return _renderTargetImplementation; }
|
||||||
|
|
||||||
|
/** Get the render target fallback.*/
|
||||||
RenderTargetImplementation getRenderTargetFallback() const { return _renderTargetFallback; }
|
RenderTargetImplementation getRenderTargetFallback() const { return _renderTargetFallback; }
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,10 +50,10 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
|
|||||||
void dirtyOverlayTexture();
|
void dirtyOverlayTexture();
|
||||||
|
|
||||||
/** Set whether the OverlayNode should update the overlay texture on every frame.*/
|
/** Set whether the OverlayNode should update the overlay texture on every frame.*/
|
||||||
void setContinousUpdate(bool update) { _continousUpdate = update; }
|
void setContinuousUpdate(bool update) { _continuousUpdate = update; }
|
||||||
|
|
||||||
/** Get whether the OverlayNode should update the overlay texture on every frame.*/
|
/** Get whether the OverlayNode should update the overlay texture on every frame.*/
|
||||||
bool getContinousUpdate() const { return _continousUpdate; }
|
bool getContinuousUpdate() const { return _continuousUpdate; }
|
||||||
|
|
||||||
|
|
||||||
/** Set the clear color to use when rendering the overlay subgraph.*/
|
/** Set the clear color to use when rendering the overlay subgraph.*/
|
||||||
@ -66,7 +66,7 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
|
|||||||
void setTexEnvMode(GLenum mode);
|
void setTexEnvMode(GLenum mode);
|
||||||
|
|
||||||
/** Get the TexEnv mode used to combine the overlay texture with the base color/texture of the OverlayNode's decorate subgraph.*/
|
/** Get the TexEnv mode used to combine the overlay texture with the base color/texture of the OverlayNode's decorate subgraph.*/
|
||||||
GLenum getTexEnvMode() { return _texEnvMode; }
|
GLenum getTexEnvMode() const { return _texEnvMode; }
|
||||||
|
|
||||||
/** Set the texture unit that the texture should be assigned to.*/
|
/** Set the texture unit that the texture should be assigned to.*/
|
||||||
void setOverlayTextureUnit(unsigned int unit);
|
void setOverlayTextureUnit(unsigned int unit);
|
||||||
@ -101,7 +101,7 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
|
|||||||
|
|
||||||
osg::ref_ptr<osg::CameraNode> _camera;
|
osg::ref_ptr<osg::CameraNode> _camera;
|
||||||
|
|
||||||
// overaly subgraph is render to a texture
|
// overlay subgraph is render to a texture
|
||||||
osg::ref_ptr<osg::Node> _overlaySubgraph;
|
osg::ref_ptr<osg::Node> _overlaySubgraph;
|
||||||
|
|
||||||
// texgen node to generate the tex coordinates for us
|
// texgen node to generate the tex coordinates for us
|
||||||
@ -116,7 +116,7 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group
|
|||||||
unsigned int _textureSizeHint;
|
unsigned int _textureSizeHint;
|
||||||
osg::ref_ptr<osg::Texture2D> _texture;
|
osg::ref_ptr<osg::Texture2D> _texture;
|
||||||
|
|
||||||
bool _continousUpdate;
|
bool _continuousUpdate;
|
||||||
osg::Polytope _textureFrustum;
|
osg::Polytope _textureFrustum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -22,6 +22,11 @@
|
|||||||
|
|
||||||
namespace osgSim {
|
namespace osgSim {
|
||||||
|
|
||||||
|
/** VisibilityGroup renders (traverses) it's children only when the camera is inside a specified visibility volume.
|
||||||
|
* The visibility volume is intersected with a line segment that extends from
|
||||||
|
* the current camera's eye-point along the view vector for a given segment length.
|
||||||
|
* If an intersection is detected then the node's children are traversed.
|
||||||
|
*/
|
||||||
class OSGSIM_EXPORT VisibilityGroup : public osg::Group
|
class OSGSIM_EXPORT VisibilityGroup : public osg::Group
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
@ -35,14 +40,27 @@ class OSGSIM_EXPORT VisibilityGroup : public osg::Group
|
|||||||
|
|
||||||
virtual void traverse(osg::NodeVisitor& nv);
|
virtual void traverse(osg::NodeVisitor& nv);
|
||||||
|
|
||||||
|
/** Set the subgraph that is intersected for the visibility determination.*/
|
||||||
void setVisibilityVolume(osg::Node* node) { _visibilityVolume = node; }
|
void setVisibilityVolume(osg::Node* node) { _visibilityVolume = node; }
|
||||||
|
|
||||||
|
/** Get the subgraph that is intersected for the visibility determination.*/
|
||||||
osg::Node* getVisibilityVolume() { return _visibilityVolume.get(); }
|
osg::Node* getVisibilityVolume() { return _visibilityVolume.get(); }
|
||||||
|
|
||||||
|
/** Get the const subgraph that is intersected for the visibility determination.*/
|
||||||
const osg::Node* getVisibilityVolume() const { return _visibilityVolume.get(); }
|
const osg::Node* getVisibilityVolume() const { return _visibilityVolume.get(); }
|
||||||
|
|
||||||
|
/** Set the traversal mask for the intersection testing.*/
|
||||||
void setVolumeIntersectionMask(osg::Node::NodeMask mask) { _volumeIntersectionMask = mask; }
|
void setVolumeIntersectionMask(osg::Node::NodeMask mask) { _volumeIntersectionMask = mask; }
|
||||||
|
|
||||||
|
/** Get the traversal mask for the intersection testing.*/
|
||||||
osg::Node::NodeMask getVolumeIntersectionMask() const { return _volumeIntersectionMask; }
|
osg::Node::NodeMask getVolumeIntersectionMask() const { return _volumeIntersectionMask; }
|
||||||
|
|
||||||
|
/** Set the length of the intersection segment.
|
||||||
|
* The segments extends this many database units from the camera eye-point along the look vector.
|
||||||
|
* If this is left at zero then the diameter of the bounding sphere of the visibility volume is used.*/
|
||||||
void setSegmentLength(float length) { _segmentLength = length; }
|
void setSegmentLength(float length) { _segmentLength = length; }
|
||||||
|
|
||||||
|
/** Get the length of the intersection segment.*/
|
||||||
float getSegmentLength() const { return _segmentLength; }
|
float getSegmentLength() const { return _segmentLength; }
|
||||||
|
|
||||||
protected :
|
protected :
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
namespace osgUtil {
|
namespace osgUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SceneView is literally a view of a scene, encapsulating the 'camera'
|
* SceneView is literaly a view of a scene, encapsulating the 'camera'
|
||||||
* (not to be confused with Producer::Camera) (modelview+projection matrices),
|
* (not to be confused with Producer::Camera) (modelview+projection matrices),
|
||||||
* global state, lights and the scene itself. Provides
|
* global state, lights and the scene itself. Provides
|
||||||
* methods for setting up the view and rendering it.
|
* methods for setting up the view and rendering it.
|
||||||
@ -122,7 +122,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced, public osg::CullSetting
|
|||||||
const osg::Vec4& getClearColor() const { return _camera->getClearColor(); }
|
const osg::Vec4& getClearColor() const { return _camera->getClearColor(); }
|
||||||
|
|
||||||
|
|
||||||
/** Mannually set the redraw interlaced stereo stencil mask request flag to control whether to redraw the stencil buffer on the next frame.*/
|
/** Manually set the redraw interlaced stereo stencil mask request flag to control whether to redraw the stencil buffer on the next frame.*/
|
||||||
void setRedrawInterlacedStereoStencilMask(bool flag) { _redrawInterlacedStereoStencilMask = flag; }
|
void setRedrawInterlacedStereoStencilMask(bool flag) { _redrawInterlacedStereoStencilMask = flag; }
|
||||||
|
|
||||||
/** Get the redraw interlaced stereo stencil mask request flag.*/
|
/** Get the redraw interlaced stereo stencil mask request flag.*/
|
||||||
@ -207,7 +207,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced, public osg::CullSetting
|
|||||||
/** Get the const projection matrix.*/
|
/** Get the const projection matrix.*/
|
||||||
const osg::Matrixd& getProjectionMatrix() const { return _camera->getProjectionMatrix(); }
|
const osg::Matrixd& getProjectionMatrix() const { return _camera->getProjectionMatrix(); }
|
||||||
|
|
||||||
/** Get the othographic settings of the orthographic projection matrix.
|
/** Get the orthographic settings of the orthographic projection matrix.
|
||||||
* Returns false if matrix is not an orthographic matrix, where parameter values are undefined.*/
|
* Returns false if matrix is not an orthographic matrix, where parameter values are undefined.*/
|
||||||
bool getProjectionMatrixAsOrtho(double& left, double& right,
|
bool getProjectionMatrixAsOrtho(double& left, double& right,
|
||||||
double& bottom, double& top,
|
double& bottom, double& top,
|
||||||
|
@ -18,7 +18,7 @@ using namespace osg;
|
|||||||
CameraNode::CameraNode():
|
CameraNode::CameraNode():
|
||||||
_clearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
|
_clearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)),
|
||||||
_clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),
|
_clearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),
|
||||||
_transformOrder(PRE_MULTIPLE),
|
_transformOrder(PRE_MULTIPLY),
|
||||||
_renderOrder(POST_RENDER),
|
_renderOrder(POST_RENDER),
|
||||||
_drawBuffer(GL_NONE),
|
_drawBuffer(GL_NONE),
|
||||||
_readBuffer(GL_NONE),
|
_readBuffer(GL_NONE),
|
||||||
@ -236,7 +236,7 @@ bool CameraNode::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
|
|||||||
{
|
{
|
||||||
if (_referenceFrame==RELATIVE_RF)
|
if (_referenceFrame==RELATIVE_RF)
|
||||||
{
|
{
|
||||||
if (_transformOrder==PRE_MULTIPLE)
|
if (_transformOrder==PRE_MULTIPLY)
|
||||||
{
|
{
|
||||||
matrix.preMult(_viewMatrix);
|
matrix.preMult(_viewMatrix);
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ bool CameraNode::computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const
|
|||||||
|
|
||||||
if (_referenceFrame==RELATIVE_RF)
|
if (_referenceFrame==RELATIVE_RF)
|
||||||
{
|
{
|
||||||
if (_transformOrder==PRE_MULTIPLE)
|
if (_transformOrder==PRE_MULTIPLY)
|
||||||
{
|
{
|
||||||
// note doing inverse so pre becomes post.
|
// note doing inverse so pre becomes post.
|
||||||
matrix.postMult(inverse);
|
matrix.postMult(inverse);
|
||||||
|
@ -71,8 +71,11 @@ bool CameraNode_readLocalData(Object& obj, Input& fr)
|
|||||||
|
|
||||||
if (fr.matchSequence("transformOrder %w"))
|
if (fr.matchSequence("transformOrder %w"))
|
||||||
{
|
{
|
||||||
if (fr[1].matchWord("PRE_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::PRE_MULTIPLE);
|
if (fr[1].matchWord("PRE_MULTIPLY")) camera.setTransformOrder(osg::CameraNode::PRE_MULTIPLY);
|
||||||
else if (fr[1].matchWord("POST_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::POST_MULTIPLE);
|
else if (fr[1].matchWord("POST_MULTIPLY")) camera.setTransformOrder(osg::CameraNode::POST_MULTIPLY);
|
||||||
|
// the following are for backwards compatibility.
|
||||||
|
else if (fr[1].matchWord("PRE_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::PRE_MULTIPLY);
|
||||||
|
else if (fr[1].matchWord("POST_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::POST_MULTIPLY);
|
||||||
|
|
||||||
fr += 2;
|
fr += 2;
|
||||||
iteratorAdvanced = true;
|
iteratorAdvanced = true;
|
||||||
@ -235,8 +238,8 @@ bool CameraNode_writeLocalData(const Object& obj, Output& fw)
|
|||||||
fw.indent()<<"transformOrder ";
|
fw.indent()<<"transformOrder ";
|
||||||
switch(camera.getTransformOrder())
|
switch(camera.getTransformOrder())
|
||||||
{
|
{
|
||||||
case(osg::CameraNode::PRE_MULTIPLE): fw <<"PRE_MULTIPLE"<<std::endl; break;
|
case(osg::CameraNode::PRE_MULTIPLY): fw <<"PRE_MULTIPLY"<<std::endl; break;
|
||||||
case(osg::CameraNode::POST_MULTIPLE): fw <<"POST_MULTIPLE"<<std::endl; break;
|
case(osg::CameraNode::POST_MULTIPLY): fw <<"POST_MULTIPLY"<<std::endl; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeMatrix(camera.getProjectionMatrix(),fw,"ProjectionMatrix");
|
writeMatrix(camera.getProjectionMatrix(),fw,"ProjectionMatrix");
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <osg/Geode>
|
#include <osg/Geode>
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
@ -223,6 +224,18 @@ void ReaderWriterPFB::initPerformer()
|
|||||||
// }
|
// }
|
||||||
pfdInitConverter(".pfb");
|
pfdInitConverter(".pfb");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell Performer to look in OSG search path
|
||||||
|
*/
|
||||||
|
const osgDB::FilePathList& filePath = osgDB::Registry::instance()->getDataFilePathList();
|
||||||
|
std::string path = "";
|
||||||
|
for (unsigned int i = 0; i < filePath.size(); i++) {
|
||||||
|
if (i != 0)
|
||||||
|
path += ":";
|
||||||
|
path += filePath[i];
|
||||||
|
}
|
||||||
|
pfFilePath(path.c_str());
|
||||||
|
|
||||||
pfConfig();
|
pfConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ OverlayNode::OverlayNode():
|
|||||||
_texEnvMode(GL_DECAL),
|
_texEnvMode(GL_DECAL),
|
||||||
_textureUnit(1),
|
_textureUnit(1),
|
||||||
_textureSizeHint(1024),
|
_textureSizeHint(1024),
|
||||||
_continousUpdate(false)
|
_continuousUpdate(false)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -37,7 +37,7 @@ OverlayNode::OverlayNode(const OverlayNode& copy, const osg::CopyOp& copyop):
|
|||||||
_texEnvMode(copy._texEnvMode),
|
_texEnvMode(copy._texEnvMode),
|
||||||
_textureUnit(copy._textureUnit),
|
_textureUnit(copy._textureUnit),
|
||||||
_textureSizeHint(copy._textureSizeHint),
|
_textureSizeHint(copy._textureSizeHint),
|
||||||
_continousUpdate(copy._continousUpdate)
|
_continuousUpdate(copy._continuousUpdate)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ void OverlayNode::traverse(osg::NodeVisitor& nv)
|
|||||||
unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0;
|
unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0;
|
||||||
|
|
||||||
// if we need to redraw then do cull traversal on camera.
|
// if we need to redraw then do cull traversal on camera.
|
||||||
if (!_textureObjectValidList[contextID] || _continousUpdate)
|
if (!_textureObjectValidList[contextID] || _continuousUpdate)
|
||||||
{
|
{
|
||||||
|
|
||||||
// now compute the camera's view and projection matrix to point at the shadower (the camera's children)
|
// now compute the camera's view and projection matrix to point at the shadower (the camera's children)
|
||||||
|
@ -1081,12 +1081,12 @@ void CullVisitor::apply(osg::CameraNode& camera)
|
|||||||
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()));
|
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()));
|
||||||
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()));
|
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()));
|
||||||
}
|
}
|
||||||
else if (camera.getTransformOrder()==osg::CameraNode::POST_MULTIPLE)
|
else if (camera.getTransformOrder()==osg::CameraNode::POST_MULTIPLY)
|
||||||
{
|
{
|
||||||
pushProjectionMatrix(createOrReuseMatrix(getProjectionMatrix()*camera.getProjectionMatrix()));
|
pushProjectionMatrix(createOrReuseMatrix(getProjectionMatrix()*camera.getProjectionMatrix()));
|
||||||
pushModelViewMatrix(createOrReuseMatrix(getModelViewMatrix()*camera.getViewMatrix()));
|
pushModelViewMatrix(createOrReuseMatrix(getModelViewMatrix()*camera.getViewMatrix()));
|
||||||
}
|
}
|
||||||
else // pre multiple
|
else // pre multiply
|
||||||
{
|
{
|
||||||
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()*getProjectionMatrix()));
|
pushProjectionMatrix(createOrReuseMatrix(camera.getProjectionMatrix()*getProjectionMatrix()));
|
||||||
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()*getModelViewMatrix()));
|
pushModelViewMatrix(createOrReuseMatrix(camera.getViewMatrix()*getModelViewMatrix()));
|
||||||
|
@ -812,7 +812,7 @@ void PickVisitor::apply(osg::CameraNode& camera)
|
|||||||
camera.getViewMatrix(),
|
camera.getViewMatrix(),
|
||||||
_mx, _my );
|
_mx, _my );
|
||||||
}
|
}
|
||||||
else if (camera.getTransformOrder()==osg::CameraNode::POST_MULTIPLE)
|
else if (camera.getTransformOrder()==osg::CameraNode::POST_MULTIPLY)
|
||||||
{
|
{
|
||||||
runNestedPickVisitor( camera,
|
runNestedPickVisitor( camera,
|
||||||
camera.getViewport() ? camera.getViewport() : _lastViewport.get(),
|
camera.getViewport() ? camera.getViewport() : _lastViewport.get(),
|
||||||
@ -820,7 +820,7 @@ void PickVisitor::apply(osg::CameraNode& camera)
|
|||||||
_lastViewMatrix * camera.getViewMatrix(),
|
_lastViewMatrix * camera.getViewMatrix(),
|
||||||
_mx, _my );
|
_mx, _my );
|
||||||
}
|
}
|
||||||
else // PRE_MULTIPLE
|
else // PRE_MULTIPLY
|
||||||
{
|
{
|
||||||
runNestedPickVisitor( camera,
|
runNestedPickVisitor( camera,
|
||||||
camera.getViewport() ? camera.getViewport() : _lastViewport.get(),
|
camera.getViewport() ? camera.getViewport() : _lastViewport.get(),
|
||||||
|
Loading…
Reference in New Issue
Block a user