diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-02-14 06:17:52 +0300 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-02-14 06:17:52 +0300 |
commit | 903cc89e3098aea5aa368a82a7fb5765df7c1b5e (patch) | |
tree | 4d665f3e4756ddced2fd4af77ea9518a63eeb5aa /source/blender/freestyle/intern | |
parent | fdaa46063502cc643d282d79824f7590dc8dd7fe (diff) |
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.
Diffstat (limited to 'source/blender/freestyle/intern')
5 files changed, 68 insertions, 6 deletions
diff --git a/source/blender/freestyle/intern/application/AppCanvas.cpp b/source/blender/freestyle/intern/application/AppCanvas.cpp index 848d8ce08bb..4ee7244a7dd 100755 --- a/source/blender/freestyle/intern/application/AppCanvas.cpp +++ b/source/blender/freestyle/intern/application/AppCanvas.cpp @@ -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) { diff --git a/source/blender/freestyle/intern/application/AppCanvas.h b/source/blender/freestyle/intern/application/AppCanvas.h index fa8d3cba373..7678014d4a0 100755 --- a/source/blender/freestyle/intern/application/AppCanvas.h +++ b/source/blender/freestyle/intern/application/AppCanvas.h @@ -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; }; diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index c0e05ba09f4..bf8d30b243e 100755 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -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); diff --git a/source/blender/freestyle/intern/application/Controller.h b/source/blender/freestyle/intern/application/Controller.h index 4734462b7a5..83a4f2754b9 100755 --- a/source/blender/freestyle/intern/application/Controller.h +++ b/source/blender/freestyle/intern/application/Controller.h @@ -70,6 +70,8 @@ public: ~Controller() ; void setView(AppView *iView); + void setPassDiffuse(float *p); + void setPassZ(float *p); void setContext(bContext *C); //soc diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 48a1fb275ef..b5f83374668 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -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"; |