svvitch
digital signage player
D:/vs_workspace/switch_sf/src/svvitch/DiffDetectScene.cpp
Go to the documentation of this file.
00001 #include "DiffDetectScene.h"
00002 #include <Poco/Util/XMLConfiguration.h>
00003 #include <Poco/UnicodeConverter.h>
00004 #include <Poco/FileStream.h>
00005 #include <Poco/Buffer.h>
00006 #include <Poco/LocalDateTime.h>
00007 #include <Poco/DateTimeFormat.h>
00008 #include <Poco/DateTimeFormatter.h>
00009 
00010 #include "MainScene.h"
00011 #include "CaptureScene.h"
00012 #include "Utils.h"
00013 
00014 
00015 DiffDetectScene::DiffDetectScene(Renderer& renderer): Scene(renderer),
00016     _w(320), _h(240), _frame(0), _samples(0),
00017     _frame1(NULL), _frame2(NULL), _frame3(NULL), _fx(NULL)
00018 {
00019 }
00020 
00021 DiffDetectScene::‾DiffDetectScene() {
00022     SAFE_RELEASE(_fx);
00023     SAFE_RELEASE(_frame1);
00024     SAFE_RELEASE(_frame2);
00025     SAFE_RELEASE(_frame3);
00026     _log.information("*release diff-detect-scene");
00027 }
00028 
00029 bool DiffDetectScene::initialize() {
00030     _log.information("*initialize diff-detect-scene");
00031 
00032     try {
00033         Poco::Util::XMLConfiguration* xml = new Poco::Util::XMLConfiguration("capture-config.xml");
00034         if (xml) {
00035             _w = xml->getInt("device[@w]", 640);
00036             _h = xml->getInt("device[@h]", 480);
00037             if (xml->hasProperty("diff")) {
00038                 _previewX = xml->getInt("diff.preview.x", 0);
00039                 _previewY = xml->getInt("diff.preview.y", 0);
00040                 _previewW = xml->getInt("diff.preview.width", 320);
00041                 _previewH = xml->getInt("diff.preview.height", 240);
00042                 _w = xml->getInt("diff.width", _w);
00043                 _h = xml->getInt("diff.height", _h);
00044                 //_subtract = xml->getDouble("diff.subtract", 0.5);
00045             }
00046             xml->release();
00047         }
00048     } catch (Poco::Exception& ex) {
00049         _log.warning(ex.displayText());
00050     }
00051 
00052     _frame1 = _renderer.createRenderTarget(_w, _h, D3DFMT_A8R8G8B8);
00053     _frame2 = _renderer.createRenderTarget(_w, _h, D3DFMT_A8R8G8B8);
00054     _frame3 = _renderer.createRenderTarget(_w, _h, D3DFMT_A8R8G8B8);
00055     _renderer.colorFill(_frame2, 0xff000000);
00056     _renderer.colorFill(_frame3, 0xff000000);
00057     _fx = _renderer.createEffect("fx/diff.fx");
00058     if (_fx) {
00059         HRESULT hr = _fx->SetTechnique("diffTechnique");
00060         if FAILED(hr) _log.warning("failed not set technique diffTechnique");
00061         hr = _fx->SetFloat("width", F(_w));
00062         hr = _fx->SetFloat("height", F(_h));
00063         hr = _fx->SetTexture("frame1", _frame1);
00064         if FAILED(hr) _log.warning("failed not set texture1");
00065         hr = _fx->SetTexture("frame2", _frame2);
00066         if FAILED(hr) _log.warning("failed not set texture2");
00067         hr = _fx->SetTexture("frame3", _frame3);
00068         if FAILED(hr) _log.warning("failed not set texture3");
00069     }
00070 
00071     return true;
00072 }
00073 
00074 LPDIRECT3DTEXTURE9 DiffDetectScene::getResult() {
00075     return _frame1;
00076 }
00077 
00078 void DiffDetectScene::process() {
00079     CaptureScenePtr scene = dynamic_cast<CaptureScenePtr>(_renderer.getScene("capture"));
00080     if (scene) {
00081         LPDIRECT3DTEXTURE9 texture = scene->getCameraImage();
00082         if (texture) {
00083             // キャプチャ映像取込
00084             _renderer.copyTexture(texture, _frame1);
00085         }
00086     }
00087     _frame++;
00088 }
00089 
00090 void DiffDetectScene::draw1() {
00091     LPDIRECT3DDEVICE9 device = _renderer.get3DDevice();
00092     LPDIRECT3DSURFACE9 orgRT;
00093     HRESULT hr = device->GetRenderTarget(0, &orgRT);
00094     DWORD col = 0xffffffff;
00095     VERTEX dst[] =
00096     {
00097         {F(0      - 0.5), F(0      - 0.5), 0.0f, 1.0f, col, 0, 0},
00098         {F(0 + _w - 0.5), F(0      - 0.5), 0.0f, 1.0f, col, 1, 0},
00099         {F(0      - 0.5), F(0 + _h - 0.5), 0.0f, 1.0f, col, 0, 1},
00100         {F(0 + _w - 0.5), F(0 + _h - 0.5), 0.0f, 1.0f, col, 1, 1}
00101     };
00102     //drawAverage(dst, col);
00103     //drawEdge(dst, col);
00104     drawDiff(dst, col);
00105     hr = device->SetRenderTarget(0, orgRT);
00106     SAFE_RELEASE(orgRT);
00107 }
00108 
00109 void DiffDetectScene::drawDiff(VERTEX* dst, DWORD& col) {
00110     LPDIRECT3DDEVICE9 device = _renderer.get3DDevice();
00111     if (_frame2 && _fx) {
00112         LPDIRECT3DSURFACE9 surface = NULL;
00113         HRESULT hr = _frame2->GetSurfaceLevel(0, &surface);
00114         hr = device->SetRenderTarget(0, surface);
00115         hr = _fx->SetInt("samples", _samples);
00116         if FAILED(hr) _log.warning("failed not set texture3");
00117         _fx->Begin(NULL, 0);
00118         _fx->BeginPass(0);
00119         device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, dst, VERTEX_SIZE);
00120         _fx->EndPass();
00121         _fx->BeginPass(1);
00122         device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, dst, VERTEX_SIZE);
00123         _fx->EndPass();
00124         _fx->BeginPass(2);
00125         device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, dst, VERTEX_SIZE);
00126         _fx->EndPass();
00127         _fx->End();
00128         _samples++;
00129         SAFE_RELEASE(surface);
00130     }
00131 }
00132 
00133 void DiffDetectScene::drawEdge(VERTEX* dst, DWORD& col) {
00134 }
00135 
00136 void DiffDetectScene::drawAverage(VERTEX* dst, DWORD& col) {
00137     LPDIRECT3DDEVICE9 device = _renderer.get3DDevice();
00138     if (_frame3 && _fx) {
00139         LPDIRECT3DSURFACE9 surface = NULL;
00140         HRESULT hr = _frame3->GetSurfaceLevel(0, &surface);
00141         hr = device->SetRenderTarget(0, surface);
00142         _fx->Begin(NULL, 0);
00143         _fx->BeginPass(1);
00144         device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, dst, VERTEX_SIZE);
00145         _fx->EndPass();
00146         _fx->End();
00147         SAFE_RELEASE(surface);
00148     }
00149 }
00150 
00151 void DiffDetectScene::draw2() {
00152     if (_visible && _result1) {
00153         LPDIRECT3DDEVICE9 device = _renderer.get3DDevice();
00154         device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
00155         device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
00156         DWORD col = 0xffffffff;
00157         _renderer.drawTexture(_previewX, _previewY, _previewW, _previewH, _frame1, 0, col, col, col, col);
00158         _renderer.drawTexture(_previewX + _previewW, _previewY, _previewW, _previewH, _frame2, 0, col, col, col, col);
00159         _renderer.drawTexture(_previewX + _previewW * 2, _previewY, _previewW, _previewH, _frame3, 0, col, col, col, col);
00160         _renderer.drawFontTextureText(_previewX + _previewW, _previewY, 8, 12, 0xccff6666, Poco::format("%d", _samples));
00161         device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
00162         device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
00163     }
00164 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines