diff --git a/zoneb/bin/data/settings.xml b/zoneb/bin/data/settings.xml index 4e77d2a..7b3eb0d 100644 --- a/zoneb/bin/data/settings.xml +++ b/zoneb/bin/data/settings.xml @@ -1,6 +1,6 @@ - -208, -257 - 2 + -195.918, -220.408 + 1.869 video3 diff --git a/zoneb/bin/data/shaders/particles/draw.frag b/zoneb/bin/data/shaders/particles/draw.frag index 62e0952..628ed5d 100755 --- a/zoneb/bin/data/shaders/particles/draw.frag +++ b/zoneb/bin/data/shaders/particles/draw.frag @@ -7,6 +7,9 @@ uniform sampler2DRect u_world; uniform sampler2DRect u_v4l2cam; uniform sampler2DRect imageTexture; +uniform vec3 uHottest0; +uniform vec3 uHottest1; + in vec2 texCoordVarying; in float vTemperature; in float vAge; diff --git a/zoneb/bin/data/shaders/particles/update.frag b/zoneb/bin/data/shaders/particles/update.frag index a594238..4024ca1 100755 --- a/zoneb/bin/data/shaders/particles/update.frag +++ b/zoneb/bin/data/shaders/particles/update.frag @@ -19,8 +19,8 @@ uniform float elapsed; uniform vec3 uHottest0; uniform vec3 uHottest1; -uniform vec3 uColdest0; -uniform vec3 uColdest1; +uniform vec3 uHottest3d0; +uniform vec3 uHottest3d1; in vec2 texCoordVarying; @@ -163,20 +163,14 @@ void main() if(age < 0.001) { // targetting target.w = 0; if(random3(pos).x > pow(length(texCoordVarying.st - uHottest0.st)/5,16*16)+0) { - vec2 h = uHottest1.st; - vec4 hray = texture(u_world, h); - float hdepth = -depth * 65535.0; - if(hdepth == 0) hdepth = -0.01 * 65535.0; - vec3 H = vec3(hray.xy * hdepth, hdepth); + vec3 H = uHottest3d0; + H.z *= -1; target.xyz = H + random3(pos); target.w = 1; } else if(random3(pos).x > pow(length(texCoordVarying.st - uHottest1.st)/5,16*16)+0) { - vec2 h = uHottest0.st; - vec4 hray = texture(u_world, h); - float hdepth = -depth * 65535.0; - if(hdepth == 0) hdepth = -0.01 * 65535.0; - vec3 H = vec3(hray.xy * hdepth, hdepth); + vec3 H = uHottest3d1; + H.z *= -1; target.xyz = H + random3(pos); target.w = 1; } diff --git a/zoneb/src/ofApp.cpp b/zoneb/src/ofApp.cpp index 6863593..ce19711 100644 --- a/zoneb/src/ofApp.cpp +++ b/zoneb/src/ofApp.cpp @@ -118,17 +118,17 @@ void ofApp::setupParticles() void ofApp::setupGui() { - gui.setup("ZONE B", "settings.xml"); // most of the time you don't need a name - gui.add(registrationXY.setup("XY", {-208, -257}, {-400, -400}, {400, 400})); - gui.add(registrationScale.setup("scale", 2.0, 0.1, 3)); + gui.setup("ZONE B", "settings.xml"); // most of the time you don't need a name + gui.add(registrationXY.setup("XY", {-208, -257}, {-400, -400}, {400, 400})); + gui.add(registrationScale.setup("scale", 2.0, 0.1, 3)); gui.add(captureDeviceName.setup("device", "video3")); gui.loadFromFile("settings.xml"); gui.setPosition(10, 10); debugGui.setup("DEBUG"); - debugGui.add(dummyMode.setup("dummy", true)); // should be false - debugGui.add(dummyXY.setup("XY", {0, 0}, {-400, -400}, {400, 400})); // should be false - debugGui.add(debugFps.setup("FPS", "0")); + debugGui.add(dummyMode.setup("dummy", true)); // should be false + debugGui.add(dummyXY.setup("XY", {256, 256}, {0, 0}, {511, 511})); // should be false + debugGui.add(debugFps.setup("FPS", "0")); debugGui.setPosition(230, 10); } @@ -158,6 +158,16 @@ void ofApp::exit() kinectDevice.close(); } +ofVec3f ofApp::getDepthAt(int x, int y) +{ + auto ray = kinectDevice.getDepthToWorldPix().getColor(x, y); + float depth = kinectDevice.getDepthPix().getColor(x, y).r; + if (depth == 0) + depth = 2000; + ofVec3f pos(ray.r * depth, ray.g * depth, depth); + return pos; +} + void ofApp::updateThermal() { v4l2Cam.grabFrame(); @@ -204,6 +214,29 @@ void ofApp::updateThermal() { std::sort(hotspots.at(i).begin(), hotspots.at(i).end(), compareZThermal); } + + if (hotspots.size() > 0 && hotspots.at(0).size() > 0) + { + hotspot0 = hotspots.at(0).at(0); + } + if (dummyMode == false) + { + if (hotspots.size() > 1 && hotspots.at(1).size() > 0) + { + hotspot1 = hotspots.at(1).at(0); + } + else if (hotspots.size() > 0 && hotspots.at(0).size() > 1) + { + hotspot1 = hotspots.at(0).at(1); + } + } + else + { + hotspot1 = ofVec3f(dummyXY); + } + + hotspot3d0 = getDepthAt(hotspot0.x, hotspot0.y); + hotspot3d1 = getDepthAt(hotspot1.x, hotspot1.y); } } @@ -226,35 +259,18 @@ void ofApp::onParticlesUpdate(ofxShader &shader) shader.setUniform2i("uFrameSize", kinectDevice.getDepthTex().getWidth(), kinectDevice.getDepthTex().getHeight()); shader.setUniform2i("uDepthFrameSize", kinectDevice.getDepthTex().getWidth(), kinectDevice.getDepthTex().getHeight()); - if (hotspots.size() > 0 && hotspots.at(0).size() > 0) - { - shader.setUniform3f("uHottest0", hotspots.at(0).at(0)); - } - if (hotspots.size() > 1 && hotspots.at(1).size() > 0) - { - shader.setUniform3f("uHottest1", hotspots.at(1).at(0)); - } - else if (hotspots.size() > 0 && hotspots.at(0).size() > 1) - { - shader.setUniform3f("uHottest1", hotspots.at(0).at(1)); - } - - if (hotspots.size() > 0 && hotspots.at(0).size() > 0) - { - shader.setUniform3f("uColdest0", hotspots.at(0).back()); - } - if (hotspots.size() > 1 && hotspots.at(1).size() > 0) - { - shader.setUniform3f("uColdest1", hotspots.at(1).back()); - } - else if (hotspots.size() > 0 && hotspots.at(0).size() > 1) - { - shader.setUniform3f("uColdest1", hotspots.at(0).at(hotspots.at(0).size() - 2)); - } + shader.setUniform3f("uHottest0", hotspot0); + shader.setUniform3f("uHottest1", hotspot1); + shader.setUniform3f("uHottest3d0", hotspot3d0); + shader.setUniform3f("uHottest3d1", hotspot3d1); } void ofApp::onParticlesDraw(ofxShader &shader) { + shader.setUniform3f("uHottest0", hotspot0); + shader.setUniform3f("uHottest1", hotspot1); + shader.setUniform3f("uHottest3d0", hotspot3d0); + shader.setUniform3f("uHottest3d1", hotspot3d1); } void ofApp::drawMain() diff --git a/zoneb/src/ofApp.h b/zoneb/src/ofApp.h index b5a68c6..6693766 100644 --- a/zoneb/src/ofApp.h +++ b/zoneb/src/ofApp.h @@ -23,6 +23,7 @@ public: void setup(); void exit(); + ofVec3f getDepthAt(int x, int y); void updateThermal(); void update(); void drawMain(); @@ -59,6 +60,8 @@ private: ofxGpuParticles particles; std::vector> hotspots; + ofVec3f hotspot0, hotspot1; + ofVec3f hotspot3d0, hotspot3d1; ofxVec2Slider registrationXY; ofxFloatSlider registrationScale;