/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, 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 The Qt Company Ltd 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$
**
****************************************************************************/
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.0
import QtQuick 2.4 as QQ2
Entity {
property introtationTimeMs: 0
property intentityIndex: 0
property intentityCount: 0
property intstartAngle: 0+360/entityCount*entityIndex
property boolneedsNewMagnitude: true
property realmagnitude: 0
property realanimWeight: 0
property colorlowColor: "black"
property colorhighColor: "#b3b3b3"
property colorbarColor: lowColor
property stringentityAnimationsState: "stopped"
property boolentityAnimationsPlaying: true
property varentityMesh: nullonEntityAnimationsStateChanged: {
if (animationState=="paused") {
if (angleAnimation.running)
angleAnimation.pause()
if (barColorAnimations.running)
barColorAnimations.pause()
} elseif (animationState=="playing"){
needsNewMagnitude=true;
if (heightDecreaseAnimation.running)
heightDecreaseAnimation.stop()
if (angleAnimation.paused) {
angleAnimation.resume()
} elseif (!entityAnimationsPlaying) {
magnitude=0angleAnimation.start()
entityAnimationsPlaying=true
}
if (barColorAnimations.paused)
barColorAnimations.resume()
} else {
if (animWeight!=0)
heightDecreaseAnimation.start()
needsNewMagnitude=trueangleAnimation.stop()
barColorAnimations.stop()
entityAnimationsPlaying=false
}
}
property MaterialbarMaterial: PhongMaterial {
diffuse: barColorambient: Qt.darker(barColor)
specular: "black"shininess: 1
}
property TransformangleTransform: Transform {
property realheightIncrease: magnitude*animWeight
property realbarAngle: startAnglematrix: {
var m = Qt.matrix4x4()
m.rotate(barAngle, Qt.vector3d(0, 1, 0))
m.translate(Qt.vector3d(1.1, heightIncrease/2-heightIncrease*0.05, 0))
m.scale(Qt.vector3d(0.5, heightIncrease*15, 0.5))
returnm;
}
property realcompareAngle: barAngleonBarAngleChanged: {
compareAngle=barAngleif (compareAngle>360)
compareAngle=barAngle-360if (compareAngle>180) {
parent.enabled=falseanimWeight=0if (needsNewMagnitude) {
// Calculate the ms offset where the bar will be at the center point of the// visualization and fetch the correct magnitude for that point in time.
var offset = (90.0+360.0-compareAngle) * (rotationTimeMs/360.0)
magnitude=mediaPlayer.getNextAudioLevel(offset)
needsNewMagnitude=false
}
} else {
parent.enabled=true// Calculate a power of 2 curve for the bar animation that peaks at 90 degreesanimWeight=Math.min((compareAngle/90), (180-compareAngle) /90)
animWeight=animWeight*animWeightif (!needsNewMagnitude) {
needsNewMagnitude=truebarColorAnimations.start()
}
}
}
}
components: [entityMesh, barMaterial, angleTransform]
QQ2.NumberAnimation {
id: angleAnimationtarget: angleTransformproperty: "barAngle"duration: rotationTimeMsloops: QQ2.Animation.Infiniterunning: truefrom: startAngleto: 360+startAngle
}
QQ2.NumberAnimation {
id: heightDecreaseAnimationtarget: angleTransformproperty: "heightIncrease"duration: 400running: falsefrom: angleTransform.heightIncreaseto: 0onStopped: barColor=lowColor
}
property intanimationDuration: angleAnimation.duration/6
QQ2.SequentialAnimation on barColor {
id: barColorAnimationsrunning: falseQQ2.ColorAnimation {
from: lowColorto: highColorduration: animationDuration
}
QQ2.PauseAnimation {
duration: animationDuration
}
QQ2.ColorAnimation {
from: highColorto: lowColorduration: animationDuration
}
}
}