svvitch
digital signage player
|
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 }