Added support for pixel-based density and Z depth information.
Availability of pixel-based density and Z depth information depends on passes of a render layer being rendered. - Density information is available if the diffuse pass of the render layer is enabled. It is accessible through the DensityF0D and DensityF1D functions provided by the Freestyle Python API. These functions return 0 if the diffuse pass is disabled. - Z depth information is available if the Z pass is enabled. It can be accessed through LocalAverageDepthF0D and LocalAverageDepthF1D. These functions return 0 if the Z pass is disabled.
This commit is contained in:
@@ -109,20 +109,48 @@ void AppCanvas::Erase()
|
||||
|
||||
// Abstract
|
||||
|
||||
#include "../image/GaussianFilter.h"
|
||||
void AppCanvas::readColorPixels(int x,int y,int w, int h, RGBImage& oImage) const
|
||||
{
|
||||
//static unsigned number = 0;
|
||||
float *rgb = new float[3*w*h];
|
||||
//_pViewer->readPixels(x,y,w,h,AppGLWidget::RGB,rgb);
|
||||
memset(rgb, 0, sizeof(float) * 3 * w * h);
|
||||
if (_pass_diffuse) {
|
||||
int rectx = width(), recty = height();
|
||||
int i, ii, j, jj;
|
||||
for (j = 0; j < h; j++) {
|
||||
jj = y + j;
|
||||
if (jj < 0 || jj >= recty)
|
||||
continue;
|
||||
for (i = 0; i < w; i++) {
|
||||
ii = x + i;
|
||||
if (ii < 0 || ii >= rectx)
|
||||
continue;
|
||||
memcpy(rgb + (w * j + i) * 3, _pass_diffuse + (rectx * jj + ii) * 3, sizeof(float) * 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
oImage.setArray(rgb, width(), height(), w,h, x, y, false);
|
||||
}
|
||||
|
||||
void AppCanvas::readDepthPixels(int x,int y,int w, int h, GrayImage& oImage) const
|
||||
{
|
||||
float *rgb = new float[w*h];
|
||||
//_pViewer->readPixels(x,y,w,h,AppGLWidget::DEPTH,rgb);
|
||||
oImage.setArray(rgb, width(), height(), w,h, x, y, false);
|
||||
float *z = new float[w*h];
|
||||
memset(z, 0, sizeof(float) * w * h);
|
||||
if (_pass_z) {
|
||||
int rectx = width(), recty = height();
|
||||
int i, ii, j, jj;
|
||||
for (j = 0; j < h; j++) {
|
||||
jj = y + j;
|
||||
if (jj < 0 || jj >= recty)
|
||||
continue;
|
||||
for (i = 0; i < w; i++) {
|
||||
ii = x + i;
|
||||
if (ii < 0 || ii >= rectx)
|
||||
continue;
|
||||
z[w * j + i] = _pass_z[rectx * jj + ii];
|
||||
}
|
||||
}
|
||||
}
|
||||
oImage.setArray(z, width(), height(), w,h, x, y, false);
|
||||
}
|
||||
|
||||
void AppCanvas::RenderStroke(Stroke *iStroke) {
|
||||
|
||||
@@ -46,6 +46,13 @@ public:
|
||||
|
||||
/*! modifiers */
|
||||
void setViewer(AppView *iViewer) ;
|
||||
|
||||
// soc
|
||||
void setPassDiffuse(float *p) {_pass_diffuse = p;}
|
||||
void setPassZ(float *p) {_pass_z = p;}
|
||||
private:
|
||||
float *_pass_diffuse;
|
||||
float *_pass_z;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -176,6 +176,20 @@ void Controller::setView(AppView *iView)
|
||||
_Canvas->setViewer(_pView);
|
||||
}
|
||||
|
||||
void Controller::setPassDiffuse(float *pass)
|
||||
{
|
||||
AppCanvas *app_canvas = dynamic_cast<AppCanvas *>(_Canvas);
|
||||
assert(app_canvas != 0);
|
||||
app_canvas->setPassDiffuse(pass);
|
||||
}
|
||||
|
||||
void Controller::setPassZ(float *pass)
|
||||
{
|
||||
AppCanvas *app_canvas = dynamic_cast<AppCanvas *>(_Canvas);
|
||||
assert(app_canvas != 0);
|
||||
app_canvas->setPassZ(pass);
|
||||
}
|
||||
|
||||
void Controller::setContext(bContext *C)
|
||||
{
|
||||
PythonInterpreter* py_inter = dynamic_cast<PythonInterpreter*>(_inter);
|
||||
|
||||
@@ -70,6 +70,8 @@ public:
|
||||
~Controller() ;
|
||||
|
||||
void setView(AppView *iView);
|
||||
void setPassDiffuse(float *p);
|
||||
void setPassZ(float *p);
|
||||
void setContext(bContext *C);
|
||||
|
||||
//soc
|
||||
|
||||
@@ -157,6 +157,17 @@ extern "C" {
|
||||
cout << "Redges and valleys : " << (controller->getComputeRidgesAndValleysFlag() ? "enabled" : "disabled") << endl;
|
||||
cout << "Suggestive contours : " << (controller->getComputeSuggestiveContoursFlag() ? "enabled" : "disabled") << endl;
|
||||
cout << "Suggestive contour dkr epsilon : " << controller->getSuggestiveContourKrDerivativeEpsilon() << endl;
|
||||
cout << endl;
|
||||
|
||||
// set diffuse and z depth passes
|
||||
RenderLayer *rl = RE_GetRenderLayer(re->result, srl->name);
|
||||
float *diffuse = RE_RenderLayerGetPass(rl, SCE_PASS_DIFFUSE);
|
||||
float *z = RE_RenderLayerGetPass(rl, SCE_PASS_Z);
|
||||
controller->setPassDiffuse(diffuse);
|
||||
controller->setPassZ(z);
|
||||
cout << "Passes :" << endl;
|
||||
cout << " Diffuse = " << (diffuse ? "enabled" : "disabled") << endl;
|
||||
cout << " Z = " << (z ? "enabled" : "disabled") << endl;
|
||||
|
||||
// compute view map
|
||||
re->i.infostr= "Freestyle: View map creation";
|
||||
|
||||
Reference in New Issue
Block a user