From a48d66e54876335a3e5c02fa0eb269ccb237b332 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Wed, 21 Jan 2015 15:22:37 +0100 Subject: Add enterprise-kinectdatavis in tradeshow demos This is a small demo I did with feedback from the sales guys in Berlin. It's similar to the Kinect demo we had for 3D charts, except that it doesn't require complicated packages like OpenNI; only libfreenect to get the depth image. I only tested the demo on the imx6. The mesh processing of incoming frames is quite heavy so it might not work well on slower devices. The resolution can be tweaked with QQuickFreenectDepthDataProxy's width and height variables to change the resolution of the graph. It isn't in basicsuits since it require a Kinect to be of any value. Change-Id: I4b4619599842119e7d3e8ee130ece7244c0c645c Reviewed-by: Michal Klocek --- .../quickfreenect/qquickfreenectvideooutput.cpp | 115 +++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 tradeshow/enterprise-kinectdatavis/src/quickfreenect/qquickfreenectvideooutput.cpp (limited to 'tradeshow/enterprise-kinectdatavis/src/quickfreenect/qquickfreenectvideooutput.cpp') diff --git a/tradeshow/enterprise-kinectdatavis/src/quickfreenect/qquickfreenectvideooutput.cpp b/tradeshow/enterprise-kinectdatavis/src/quickfreenect/qquickfreenectvideooutput.cpp new file mode 100644 index 0000000..408b0f4 --- /dev/null +++ b/tradeshow/enterprise-kinectdatavis/src/quickfreenect/qquickfreenectvideooutput.cpp @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: For any questions to Digia, please use the contact form at +** http://www.qt.io +** +** This file is part of the examples of the Qt Enterprise Embedded. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "qquickfreenectvideooutput.h" + +#include "qquickfreenectbackend.h" + +#include +#include +#include + +class TextureOwningNode : public QSGSimpleTextureNode { + std::unique_ptr m_texture; +public: + TextureOwningNode() { + } + void setTexture(QSGTexture *texture) { + QSGSimpleTextureNode::setTexture(texture); + m_texture.reset(texture); + } +}; + +QQuickFreenectVideoOutput::QQuickFreenectVideoOutput() + : m_backend(QQuickFreenectBackend::instance()) +{ + setFlag(ItemHasContents); + connect(m_backend.get(), SIGNAL(videoFrameReady()), SLOT(onReceivedFrame())); + m_backend->requestVideoStreamType(VideoRGB); +} + +QQuickFreenectVideoOutput::StreamType QQuickFreenectVideoOutput::streamType() const +{ + return m_backend->requestedVideoStreamType(); +} + +void QQuickFreenectVideoOutput::setStreamType(StreamType type) +{ + m_backend->requestVideoStreamType(type); + emit streamTypeChanged(); + m_isStreaming = false; + emit isStreamingChanged(); +} + +QSGNode *QQuickFreenectVideoOutput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) +{ + StreamType bufferType = m_backend->videoFrontBufferStreamType(); + const QSize textureSize(640, bufferType == VideoRGB ? 480 : 488); + auto textureNode = static_cast(oldNode); + if (!textureNode) { + GLuint texId; + glGenTextures(1, &texId); + QSGTexture *texture = window()->createTextureFromId(texId, textureSize, QQuickWindow::TextureOwnsGLTexture); + + textureNode = new TextureOwningNode; + textureNode->setTexture(texture); + } + + qreal widthRatio = width() / textureSize.width(); + qreal heightRatio = height() / textureSize.height(); + QSizeF nodeSize = QSizeF(textureSize) * std::min(widthRatio, heightRatio); + textureNode->setRect(QRectF(QPointF((width() - nodeSize.width()) / 2, (height() - nodeSize.height()) / 2), nodeSize)); + + if (uint8_t *buffer = m_backend->pickVideoFrontBuffer()) { + GLint bufferFormat = bufferType == VideoRGB ? GL_RGB : GL_LUMINANCE; + glBindTexture(GL_TEXTURE_2D, textureNode->texture()->textureId()); + glTexImage2D(GL_TEXTURE_2D, 0, bufferFormat, textureSize.width(), textureSize.height(), 0, bufferFormat, GL_UNSIGNED_BYTE, buffer); + textureNode->markDirty(QSGNode::DirtyMaterial); + } + + return textureNode; +} + +void QQuickFreenectVideoOutput::onReceivedFrame() +{ + m_isStreaming = true; + emit isStreamingChanged(); + update(); +} -- cgit v1.2.3