Freestyle: Fix for view map caching not flashed properly in view port rendering.
This commit is contained in:
parent
8fa55d95e4
commit
3fea13ed6c
@ -220,11 +220,10 @@ bool Controller::hitViewMapCache()
|
|||||||
if (!_EnableViewMapCache) {
|
if (!_EnableViewMapCache) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
real hashCode = sceneHashFunc.getValue();
|
if (sceneHashFunc.match()) {
|
||||||
if (prevSceneHash == hashCode) {
|
|
||||||
return (NULL != _ViewMap);
|
return (NULL != _ViewMap);
|
||||||
}
|
}
|
||||||
prevSceneHash = hashCode;
|
sceneHashFunc.store();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,10 +280,26 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer *srl)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (_EnableViewMapCache) {
|
if (_EnableViewMapCache) {
|
||||||
|
|
||||||
|
NodeCamera *cam;
|
||||||
|
if (freestyle_proj[3][3] != 0.0)
|
||||||
|
cam = new NodeOrthographicCamera;
|
||||||
|
else
|
||||||
|
cam = new NodePerspectiveCamera;
|
||||||
|
double proj[16];
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
proj[i * 4 + j] = freestyle_proj[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cam->setProjectionMatrix(proj);
|
||||||
|
_RootNode->AddChild(cam);
|
||||||
|
|
||||||
sceneHashFunc.reset();
|
sceneHashFunc.reset();
|
||||||
blenderScene->accept(sceneHashFunc);
|
//blenderScene->accept(sceneHashFunc);
|
||||||
|
_RootNode->accept(sceneHashFunc);
|
||||||
if (G.debug & G_DEBUG_FREESTYLE) {
|
if (G.debug & G_DEBUG_FREESTYLE) {
|
||||||
printf("Scene hash : %.16e\n", sceneHashFunc.getValue());
|
cout << "Scene hash : " << sceneHashFunc.toString() << endl;
|
||||||
}
|
}
|
||||||
if (hitViewMapCache()) {
|
if (hitViewMapCache()) {
|
||||||
ClearRootNode();
|
ClearRootNode();
|
||||||
|
@ -53,7 +53,9 @@ public:
|
|||||||
|
|
||||||
/*! Default matrices: Identity for both projection and modelview. */
|
/*! Default matrices: Identity for both projection and modelview. */
|
||||||
NodeCamera(CameraType camera_type = GENERIC);
|
NodeCamera(CameraType camera_type = GENERIC);
|
||||||
|
#if 0 /* UNUSED, gives warning in gcc */
|
||||||
NodeCamera(const NodeCamera& iBrother);
|
NodeCamera(const NodeCamera& iBrother);
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual ~NodeCamera() {}
|
virtual ~NodeCamera() {}
|
||||||
|
|
||||||
|
@ -24,16 +24,47 @@
|
|||||||
|
|
||||||
#include "SceneHash.h"
|
#include "SceneHash.h"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace Freestyle {
|
namespace Freestyle {
|
||||||
|
|
||||||
|
string SceneHash::toString()
|
||||||
|
{
|
||||||
|
stringstream ss;
|
||||||
|
ss << hex << _sum;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceneHash::visitNodeCamera(NodeCamera& cam)
|
||||||
|
{
|
||||||
|
double *proj = cam.projectionMatrix();
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
adler32((unsigned char *)&proj[i], sizeof(double));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SceneHash::visitIndexedFaceSet(IndexedFaceSet& ifs)
|
void SceneHash::visitIndexedFaceSet(IndexedFaceSet& ifs)
|
||||||
{
|
{
|
||||||
const real *v = ifs.vertices();
|
const real *v = ifs.vertices();
|
||||||
const unsigned n = ifs.vsize();
|
const unsigned n = ifs.vsize();
|
||||||
|
|
||||||
for (unsigned i = 0; i < n; i++) {
|
for (unsigned i = 0; i < n; i++) {
|
||||||
_hashcode += v[i];
|
adler32((unsigned char *)&v[i], sizeof(v[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const int MOD_ADLER = 65521;
|
||||||
|
|
||||||
|
void SceneHash::adler32(unsigned char *data, int size)
|
||||||
|
{
|
||||||
|
uint32_t sum1 = _sum & 0xffff;
|
||||||
|
uint32_t sum2 = (_sum >> 16) & 0xffff;
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
sum1 = (sum1 + data[i]) % MOD_ADLER;
|
||||||
|
sum2 = (sum1 + sum2) % MOD_ADLER;
|
||||||
|
}
|
||||||
|
_sum = sum1 | (sum2 << 16);
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace Freestyle */
|
} /* namespace Freestyle */
|
||||||
|
@ -26,8 +26,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "IndexedFaceSet.h"
|
#include "IndexedFaceSet.h"
|
||||||
|
#include "NodeCamera.h"
|
||||||
#include "SceneVisitor.h"
|
#include "SceneVisitor.h"
|
||||||
|
|
||||||
|
#include "BLI_sys_types.h"
|
||||||
|
|
||||||
#ifdef WITH_CXX_GUARDEDALLOC
|
#ifdef WITH_CXX_GUARDEDALLOC
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
#endif
|
#endif
|
||||||
@ -39,23 +42,33 @@ class SceneHash : public SceneVisitor
|
|||||||
public:
|
public:
|
||||||
inline SceneHash() : SceneVisitor()
|
inline SceneHash() : SceneVisitor()
|
||||||
{
|
{
|
||||||
_hashcode = 0.0;
|
_sum = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~SceneHash() {}
|
virtual ~SceneHash() {}
|
||||||
|
|
||||||
|
VISIT_DECL(NodeCamera)
|
||||||
VISIT_DECL(IndexedFaceSet)
|
VISIT_DECL(IndexedFaceSet)
|
||||||
|
|
||||||
inline real getValue() {
|
string toString();
|
||||||
return _hashcode;
|
|
||||||
|
inline bool match() {
|
||||||
|
return _sum == _prevSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void store() {
|
||||||
|
_prevSum = _sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void reset() {
|
inline void reset() {
|
||||||
_hashcode = 0.0;
|
_sum = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
real _hashcode;
|
void adler32(unsigned char *data, int size);
|
||||||
|
|
||||||
|
uint32_t _sum;
|
||||||
|
uint32_t _prevSum;
|
||||||
|
|
||||||
#ifdef WITH_CXX_GUARDEDALLOC
|
#ifdef WITH_CXX_GUARDEDALLOC
|
||||||
MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SceneHash")
|
MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SceneHash")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user