Fix for Freestyle view map caching not properly updated upon changes of render resolution and scale.

Problem reports independently by Light BWK and Folkert de Vries, thanks.
This commit is contained in:
Tamito Kajiyama
2015-02-02 09:17:16 +09:00
parent 64124ba904
commit 0305b208eb
3 changed files with 26 additions and 9 deletions

View File

@@ -295,7 +295,7 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer *srl)
}
cam->setProjectionMatrix(proj);
_RootNode->AddChild(cam);
_RootNode->AddChild(new NodeSceneRenderLayer(*srl));
_RootNode->AddChild(new NodeSceneRenderLayer(*re->scene, *srl));
sceneHashFunc.reset();
//blenderScene->accept(sceneHashFunc);

View File

@@ -29,7 +29,7 @@
#include "Node.h"
extern "C" {
#include "DNA_scene_types.h" /* for SceneRenderLayer */
#include "DNA_scene_types.h" /* for Scene and SceneRenderLayer */
}
using namespace std;
@@ -39,14 +39,24 @@ namespace Freestyle {
class NodeSceneRenderLayer : public Node
{
public:
inline NodeSceneRenderLayer(SceneRenderLayer& srl) : Node(), _SceneRenderLayer(srl) {}
inline NodeSceneRenderLayer(Scene& scene, SceneRenderLayer& srl) : Node(), _Scene(scene), _SceneRenderLayer(srl) {}
virtual ~NodeSceneRenderLayer() {}
inline struct Scene& scene() const
{
return _Scene;
}
inline struct SceneRenderLayer& sceneRenderLayer() const
{
return _SceneRenderLayer;
}
inline void setSceneRenderLayer(Scene& scene)
{
_Scene = scene;
}
inline void setSceneRenderLayer(SceneRenderLayer& srl)
{
_SceneRenderLayer = srl;
@@ -56,6 +66,8 @@ public:
virtual void accept(SceneVisitor& v);
protected:
Scene& _Scene;
SceneRenderLayer& _SceneRenderLayer;
};

View File

@@ -35,13 +35,18 @@ string SceneHash::toString()
return ss.str();
}
void SceneHash::visitNodeSceneRenderLayer(NodeSceneRenderLayer& srl)
void SceneHash::visitNodeSceneRenderLayer(NodeSceneRenderLayer& node)
{
struct FreestyleConfig *config = &srl.sceneRenderLayer().freestyleConfig;
adler32((unsigned char *)&config->flags, sizeof(int));
adler32((unsigned char *)&config->crease_angle, sizeof(float));
adler32((unsigned char *)&config->sphere_radius, sizeof(float));
adler32((unsigned char *)&config->dkr_epsilon, sizeof(float));
struct RenderData *r = &node.scene().r;
adler32((unsigned char *)&r->xsch, sizeof(r->xsch)); // resolution_x
adler32((unsigned char *)&r->ysch, sizeof(r->ysch)); // resolution_y
adler32((unsigned char *)&r->size, sizeof(r->size)); // resolution_percentage
struct FreestyleConfig *config = &node.sceneRenderLayer().freestyleConfig;
adler32((unsigned char *)&config->flags, sizeof(config->flags));
adler32((unsigned char *)&config->crease_angle, sizeof(config->crease_angle));
adler32((unsigned char *)&config->sphere_radius, sizeof(config->sphere_radius));
adler32((unsigned char *)&config->dkr_epsilon, sizeof(config->dkr_epsilon));
}
void SceneHash::visitNodeCamera(NodeCamera& cam)