Skip to content

Commit

Permalink
Merge pull request #1499 from mousebird-consulting-inc/topic/post-init
Browse files Browse the repository at this point in the history
Topic/post init
  • Loading branch information
TimSylvester authored Feb 1, 2022
2 parents e60aa36 + 886ed7a commit 564beb4
Show file tree
Hide file tree
Showing 36 changed files with 396 additions and 270 deletions.
75 changes: 47 additions & 28 deletions common/WhirlyGlobeLib/include/SceneRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,26 +218,32 @@ class SceneRenderer : public DelayedDeletable
virtual void setClearColor(const RGBAColor &color);

/// Return the current clear color
RGBAColor getClearColor();
RGBAColor getClearColor() const;

/// Get the framebuffer size (in pixels)
Point2f getFramebufferSize();

Point2f getFramebufferSize() const;

/// Get the framebuffer size (in pixels) with a margin
Mbr getFramebufferBound(float marginFrac) const;

/// Get the framebuffer size (divided by scale)
Point2f getFramebufferSizeScaled();

Point2f getFramebufferSizeScaled() const;

/// Get the framebuffer size (divided by scale) with a margin
Mbr getFramebufferBoundScaled(float marginFrac) const;

/// Return the attached Scene
Scene *getScene();

/// Return the map view
View *getView();

/// Return the device scale (e.g. retina vs. not)
float getScale();
float getScale() const;

/// Set the screen scale (can vary)
void setScale(float newScale);

/// Used by the subclasses to determine if the view changed and needs to be updated
virtual bool viewDidChange();

Expand Down Expand Up @@ -325,24 +331,8 @@ class SceneRenderer : public DelayedDeletable
/// Maps name IDs to slots (slots are just used by Metal)
virtual int getSlotForNameID(SimpleIdentity nameID);

/// The pixel width of the CAEAGLLayer.
int framebufferWidth;
/// The pixel height of the CAEAGLLayer.
int framebufferHeight;

/// Scale, to reflect the device's screen
float scale;

std::vector<RenderTargetRef> renderTargets;
std::vector<WorkGroupRef> workGroups;

// Drawables that we currently know about, but are off
std::set<DrawableRef> offDrawables;
const std::vector<RenderTargetRef> &getRenderTargets() const { return renderTargets; }

// Explicitly clear any held structures
void shutdown();

public:
// Called by the subclass
virtual void init();

Expand All @@ -354,9 +344,23 @@ class SceneRenderer : public DelayedDeletable

// Update the extra frame rendering count
virtual void updateExtraFrames();


const RenderTeardownInfoRef &getTeardownInfo() const { return teardownInfo; }

protected:
/// Set the framebuffer size
/// You probably want resize() instead.
void setFramebufferSize(float width, float height);
void setFramebufferSize(const Point2f &size) { setFramebufferSize(size.x(), size.y()); }

// Explicitly clear any held structures
void shutdown();

public:
/// Scene we're drawing. This is set from outside
Scene *scene;

protected:
/// The view controls how we're looking at the scene
View *theView;
/// Set this mode to modify how Z buffering is used (if at all)
Expand Down Expand Up @@ -402,16 +406,31 @@ class SceneRenderer : public DelayedDeletable

// If we're an offline renderer, the texture we're rendering into
TextureRef framebufferTex;

TimeInterval lightsLastUpdated;
Material defaultMat;
Material defaultMat;
std::vector<DirectionalLight> lights;

// Everything torn down until the next frame
RenderTeardownInfoRef teardownInfo;

// Map Name IDs to slots (when using Metal)
std::map<SimpleIdentity,int> slotMap;

protected:
/// The pixel width of the CAEAGLLayer.
int framebufferWidth;
/// The pixel height of the CAEAGLLayer.
int framebufferHeight;

/// Scale, to reflect the device's screen
float scale;

std::vector<RenderTargetRef> renderTargets;
std::vector<WorkGroupRef> workGroups;

// Drawables that we currently know about, but are off
std::set<DrawableRef> offDrawables;
};

typedef std::shared_ptr<SceneRenderer> SceneRendererRef;
Expand Down
2 changes: 2 additions & 0 deletions common/WhirlyGlobeLib/include/SelectionManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,8 @@ class SelectionManager : public SceneManager

Point2f frameSize;
Point2f frameSizeScale;

/// frame with margin, not scaled
Mbr frameMbr;
};

Expand Down
13 changes: 8 additions & 5 deletions common/WhirlyGlobeLib/include/WhirlyKitView.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,18 @@ class View : public DelayedDeletable
/// Used by subclasses to notify all the watchers of updates
virtual void runViewUpdates();

double fieldOfView,imagePlaneSize,nearPlane,farPlane;
Point2d centerOffset;
double fieldOfView = 0.0;
double imagePlaneSize = 0.0;
double nearPlane = 0.001;
double farPlane = 10.0;
Point2d centerOffset = { 0, 0 };
std::vector<Eigen::Matrix4d> offsetMatrices;
/// The last time the position was changed
TimeInterval lastChangedTime;
TimeInterval lastChangedTime = 0.0;
/// Display adapter and coordinate system we're working in
WhirlyKit::CoordSystemDisplayAdapter *coordAdapter;
WhirlyKit::CoordSystemDisplayAdapter *coordAdapter = nullptr;
/// If set, we'll scale the near and far clipping planes as we get closer
bool continuousZoom;
bool continuousZoom = false;

/// Called when positions are updated
ViewWatcherSet watchers;
Expand Down
2 changes: 1 addition & 1 deletion common/WhirlyGlobeLib/src/ChangeRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void RenderTeardownInfo::destroyTexture(SceneRenderer *renderer,const TextureBas

void RenderTeardownInfo::destroyDrawable(SceneRenderer *renderer,const DrawableRef &draw)
{
draw->teardownForRenderer(renderer->getRenderSetupInfo(), renderer->getScene(), renderer->teardownInfo);
draw->teardownForRenderer(renderer->getRenderSetupInfo(), renderer->getScene(), renderer->getTeardownInfo());
}

bool ChangeRequest::needsFlush() { return false; }
Expand Down
6 changes: 3 additions & 3 deletions common/WhirlyGlobeLib/src/GlobeView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,11 +225,11 @@ Eigen::Matrix4d GlobeView::calcModelMatrix() const
Point2d modelOff(0.0,0.0);
if (centerOffset.x() != 0.0 || centerOffset.y() != 0.0) {
// imagePlaneSize is actually half the image plane size in the horizontal
modelOff = Point2d(centerOffset.x() * imagePlaneSize, centerOffset.y() * imagePlaneSize) * (heightAboveGlobe+1.0)/nearPlane;
modelOff = (centerOffset * imagePlaneSize) * (heightAboveGlobe+1.0)/nearPlane;
}

Eigen::Affine3d trans(Eigen::Translation3d(modelOff.x(),modelOff.y(),-calcEarthZOffset()));
Eigen::Affine3d rot(rotQuat);
const Eigen::Affine3d trans(Eigen::Translation3d(modelOff.x(),modelOff.y(),-calcEarthZOffset()));
const Eigen::Affine3d rot(rotQuat);

return (trans * rot).matrix();
}
Expand Down
6 changes: 3 additions & 3 deletions common/WhirlyGlobeLib/src/LayoutManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ bool LayoutManager::runLayoutRules(PlatformThreadInfo *threadInfo,
}

// Extents for the layout helpers
const Point2f frameBufferSize(renderer->framebufferWidth, renderer->framebufferHeight);
const Point2f frameBufferSize = renderer->getFramebufferSize();
const Mbr screenMbr(frameBufferSize * -ScreenBuffer,
frameBufferSize * (1.0 + ScreenBuffer));

Expand Down Expand Up @@ -1740,7 +1740,7 @@ void LayoutManager::handleFadeOut(const TimeInterval curTime,
}

// Build drawables for them...
ScreenSpaceBuilder ssBuild(renderer,coordAdapter,renderer->scale);
ScreenSpaceBuilder ssBuild(renderer,coordAdapter,renderer->getScale());
buildDrawables(ssBuild, /*doFades*/false, /*doClusters=*/false, curTime, nullptr,
rebuildLayoutObjs, oldClusters, oldClusterParams, nullptr, nullptr);
const auto newDraws = ssBuild.flushChanges(changes);
Expand Down Expand Up @@ -1873,7 +1873,7 @@ void LayoutManager::updateLayout(PlatformThreadInfo *threadInfo,const ViewStateR
// Generate the drawables.
// Note that the renderer is not managed by a shared pointer, and will be destroyed
// during shutdown, so we must stop using it quickly if controller shutdown is initiated.
ScreenSpaceBuilder ssBuild(renderer,coordAdapter,renderer->scale);
ScreenSpaceBuilder ssBuild(renderer,coordAdapter,renderer->getScale());

//wkLog("Starting Layout t=%f", curTime);

Expand Down
18 changes: 10 additions & 8 deletions common/WhirlyGlobeLib/src/MaplyAnimateTranslation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ using namespace Eigen;

namespace Maply {

bool MaplyGestureWithinBounds(const Point2dVector &bounds,const Point3d &loc,SceneRenderer *sceneRender,MapView *testMapView,Point3d *newCenter)
bool MaplyGestureWithinBounds(const Point2dVector &bounds,const Point3d &loc,
SceneRenderer *sceneRender,MapView *testMapView,Point3d *newCenter)
{
if (newCenter)
*newCenter = loc;
Expand All @@ -33,15 +34,16 @@ bool MaplyGestureWithinBounds(const Point2dVector &bounds,const Point3d &loc,Sce
return true;

// The corners of the view should be within the bounds
Point2f corners[4];
corners[0] = Point2f(0,0);
corners[1] = Point2f(sceneRender->framebufferWidth, 0.0);
corners[2] = Point2f(sceneRender->framebufferWidth, sceneRender->framebufferHeight);
corners[3] = Point2f(0.0, sceneRender->framebufferHeight);

Point2f frameSize = sceneRender->getFramebufferSize();
const Point2f corners[4] = {
{ 0, 0 },
{ frameSize.x(), 0.0 },
frameSize,
{ 0.0, frameSize.y() },
};

bool isValid = false;
Point2d locOffset(0,0);
Point2f frameSize(sceneRender->framebufferWidth,sceneRender->framebufferHeight);
for (unsigned tests=0;tests<4;tests++)
{
Point3d newLoc = loc+Point3d(locOffset.x(),locOffset.y(),0.0);
Expand Down
6 changes: 4 additions & 2 deletions common/WhirlyGlobeLib/src/ParticleSystemDrawableGLES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,17 +229,19 @@ void ParticleSystemDrawableGLES::drawTeardownTextures(RendererFrameInfo *frameIn

void ParticleSystemDrawableGLES::drawSetupUniforms(RendererFrameInfo *frameInfo,Scene *scene,ProgramGLES *prog)
{
const Point2f frameSize = frameInfo->sceneRenderer->getFramebufferSize();

// Model/View/Projection matrix
prog->setUniform(mvpMatrixNameID, frameInfo->mvpMat);
prog->setUniform(mvpInvMatrixNameID, frameInfo->mvpInvMat);
prog->setUniform(mvMatrixNameID, frameInfo->viewAndModelMat);
prog->setUniform(mvNormalMatrixNameID, frameInfo->viewModelNormalMat);
prog->setUniform(mvpNormalMatrixNameID, frameInfo->mvpNormalMat);
prog->setUniform(u_pMatrixNameID, frameInfo->projMat);
prog->setUniform(u_ScaleNameID, Point2f(2.f/(float)frameInfo->sceneRenderer->framebufferWidth,2.f/(float)frameInfo->sceneRenderer->framebufferHeight));
prog->setUniform(u_ScaleNameID, Point2f(2.f/frameSize.x(),2.f/frameSize.y()));

// Size of a single pixel
Point2f pixDispSize(frameInfo->screenSizeInDisplayCoords.x()/frameInfo->sceneRenderer->framebufferWidth,frameInfo->screenSizeInDisplayCoords.y()/frameInfo->sceneRenderer->framebufferHeight);
const Point2f pixDispSize = frameInfo->screenSizeInDisplayCoords.cast<float>().cwiseQuotient(frameSize);

// If this is present, the drawable wants to do something based where the viewer is looking
prog->setUniform(u_EyeVecNameID, frameInfo->fullEyeVec);
Expand Down
23 changes: 13 additions & 10 deletions common/WhirlyGlobeLib/src/RenderTarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ AddRenderTargetReq::AddRenderTargetReq(SimpleIdentity renderTargetID,int width,i
// Set up a render target
void AddRenderTargetReq::execute(Scene *scene,SceneRenderer *renderer,View *view)
{
RenderTargetRef renderTarget = RenderTargetRef(renderer->makeRenderTarget());
auto renderTarget = renderer->makeRenderTarget();
renderTarget->setId(renderTargetID);
renderTarget->width = width;
renderTarget->height = height;
Expand All @@ -81,35 +81,38 @@ void AddRenderTargetReq::execute(Scene *scene,SceneRenderer *renderer,View *view
renderTarget->calcMinMax = calcMinMax;
renderTarget->init(renderer,scene,texID);

renderer->addRenderTarget(renderTarget);
renderer->addRenderTarget(std::move(renderTarget));
}

ChangeRenderTargetReq::ChangeRenderTargetReq(SimpleIdentity renderTargetID,SimpleIdentity texID)
: renderTargetID(renderTargetID), texID(texID)
ChangeRenderTargetReq::ChangeRenderTargetReq(SimpleIdentity renderTargetID,SimpleIdentity texID) :
renderTargetID(renderTargetID),
texID(texID)
{
}

void ChangeRenderTargetReq::execute(Scene *scene,SceneRenderer *renderer,View *view)
{
for (RenderTargetRef renderTarget : renderer->renderTargets)
for (const auto &renderTarget : renderer->getRenderTargets())
{
if (renderTarget->getId() == renderTargetID) {
if (renderTarget->getId() == renderTargetID)
{
renderTarget->setTargetTexture(renderer,scene,texID);
break;
}
}
}

ClearRenderTargetReq::ClearRenderTargetReq(SimpleIdentity targetID)
: renderTargetID(targetID)
ClearRenderTargetReq::ClearRenderTargetReq(SimpleIdentity targetID) :
renderTargetID(targetID)
{
}

void ClearRenderTargetReq::execute(Scene *scene,SceneRenderer *renderer,View *view)
{
for (RenderTargetRef renderTarget : renderer->renderTargets)
for (const auto &renderTarget : renderer->getRenderTargets())
{
if (renderTarget->getId() == renderTargetID) {
if (renderTarget->getId() == renderTargetID)
{
renderTarget->clearOnce = true;
break;
}
Expand Down
11 changes: 5 additions & 6 deletions common/WhirlyGlobeLib/src/Scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,9 +737,9 @@ void RemTextureReq::execute(Scene *scene,SceneRenderer *renderer,WhirlyKit::View
TextureBaseRef tex = scene->getTexture(texture);
if (tex)
{
if (renderer->teardownInfo)
if (auto info = renderer->getTeardownInfo())
{
renderer->teardownInfo->destroyTexture(renderer,tex);
info->destroyTexture(renderer,tex);
}
scene->removeTexture(texture);
} else
Expand Down Expand Up @@ -816,10 +816,9 @@ RemDrawableReq::RemDrawableReq(SimpleIdentity drawId,TimeInterval inWhen)

void RemDrawableReq::execute(Scene *scene,SceneRenderer *renderer,WhirlyKit::View *view)
{
DrawableRef draw = scene->getDrawable(drawID);
if (draw)
if (DrawableRef draw = scene->getDrawable(drawID))
{
renderer->removeDrawable(draw, true, renderer->teardownInfo);
renderer->removeDrawable(draw, true, renderer->getTeardownInfo());
scene->remDrawable(draw);
}
else
Expand All @@ -836,7 +835,7 @@ void AddProgramReq::execute(Scene *scene,SceneRenderer *renderer,WhirlyKit::View

void RemProgramReq::execute(Scene *scene,SceneRenderer *renderer,WhirlyKit::View *view)
{
scene->removeProgram(programId,renderer->teardownInfo);
scene->removeProgram(programId,renderer->getTeardownInfo());
}

RunBlockReq::RunBlockReq(BlockFunc newFunc) : func(std::move(newFunc))
Expand Down
Loading

0 comments on commit 564beb4

Please sign in to comment.