summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian De Bhal <julian.debhal@nokia.com>2012-07-09 15:00:25 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-16 05:04:25 +0200
commit8d463f01ffb8ae184bddcb7b8c35437631cdad9d (patch)
tree18343013c6ebd634c2d57b09be8e89c902ff1b4f
parent8cf9ee2ac85ee402ef0de064caea813a7a06f507 (diff)
downloadqt3d-8d463f01ffb8ae184bddcb7b8c35437631cdad9d.tar.gz
Positional lighting example
Change-Id: I48981d195304934381f2cbd23d280a4ff87fc832 Reviewed-by: Sergey Dubitskiy <sergey.dubitskiy@nokia.com>
-rw-r--r--examples/quick3d/positional_lighting/main.cpp46
-rw-r--r--examples/quick3d/positional_lighting/positional_lighting.pro33
-rw-r--r--examples/quick3d/positional_lighting/positional_lighting.rc1
-rw-r--r--examples/quick3d/positional_lighting/qml/Maze.qml289
-rw-r--r--examples/quick3d/positional_lighting/qml/PositionalLighting.qml196
-rw-r--r--examples/quick3d/positional_lighting/qml/desktop.qml52
-rw-r--r--examples/quick3d/positional_lighting/qml/meshes/grid.3dsbin0 -> 276871 bytes
-rw-r--r--examples/quick3d/positional_lighting/qml/meshes/subdivided_cube.3dsbin0 -> 49314 bytes
-rw-r--r--examples/quick3d/positional_lighting/qtquick3d.icobin0 -> 51262 bytes
-rw-r--r--examples/quick3d/quick3d.pro1
10 files changed, 618 insertions, 0 deletions
diff --git a/examples/quick3d/positional_lighting/main.cpp b/examples/quick3d/positional_lighting/main.cpp
new file mode 100644
index 000000000..f68429de2
--- /dev/null
+++ b/examples/quick3d/positional_lighting/main.cpp
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $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 Nokia Corporation 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 <qmlres.h>
+
+int main(int argc, char *argv[])
+{
+ return q_quick3d_main("qml/desktop.qml", "examples", argc, argv);
+}
diff --git a/examples/quick3d/positional_lighting/positional_lighting.pro b/examples/quick3d/positional_lighting/positional_lighting.pro
new file mode 100644
index 000000000..ef11c3d2f
--- /dev/null
+++ b/examples/quick3d/positional_lighting/positional_lighting.pro
@@ -0,0 +1,33 @@
+TEMPLATE = app
+TARGET = positional_lighting
+CONFIG += qt warn_on
+QT += qml quick 3d 3dquick
+
+SOURCES += main.cpp
+
+ICON_FILE = ../icon.png
+
+QML_FILES = \
+ qml/desktop.qml \
+ qml/Maze.qml \
+ qml/PositionalLighting.qml
+
+QML_INFRA_FILES = \
+ $$QML_FILES
+
+QML_MESHES_FILES = \
+ qml/meshes/subdivided_cube.3ds \
+ qml/meshes/grid.3ds
+
+CATEGORY = examples
+include(../../../pkg.pri)
+
+OTHER_FILES += \
+ mt.qml \
+ $$QML_INFRA_FILES \
+ $$QML_MESHES_FILES \
+ postitional_lighting.rc
+
+RC_FILE = positional_lighting.rc
+
+HEADERS +=
diff --git a/examples/quick3d/positional_lighting/positional_lighting.rc b/examples/quick3d/positional_lighting/positional_lighting.rc
new file mode 100644
index 000000000..1b6228c97
--- /dev/null
+++ b/examples/quick3d/positional_lighting/positional_lighting.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "qtquick3d.ico"
diff --git a/examples/quick3d/positional_lighting/qml/Maze.qml b/examples/quick3d/positional_lighting/qml/Maze.qml
new file mode 100644
index 000000000..cc29fb7a0
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qml/Maze.qml
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $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 Nokia Corporation 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt3D 2.0
+import Qt3D.Shapes 2.0
+import "."
+
+Item3D {
+ id: maze
+
+ property int mazeWidth: 1
+
+ property variant solution: [{x:0, y:0}, {x:1,y:0}, {x:1, y:1}]
+
+ signal wallFinished;
+ signal creationFinished;
+ signal destinationChanged;
+
+ property int xDestination: Math.round(Math.random() * (maze.mazeWidth -1)) * 2 -maze.mazeWidth + 1;
+ property int zDestination: Math.round(Math.random() * (maze.mazeWidth -1)) * 2 -maze.mazeWidth + 1;
+
+ Timer {
+ id: creationTimer
+ // the 400 is the dropping animation duration
+ interval: maze.wallCreationDuration + maze.innerCreationDuration + 400
+ onTriggered: {
+ maze.creationFinished();
+ }
+ }
+
+ Timer {
+ id: wallCreatedTimer
+ // the 400 is the dropping animation duration
+ interval: maze.wallCreationDuration + 400
+ onTriggered: {
+ maze.wallFinished();
+ }
+ }
+
+ property real wallCreationDuration: 1500
+ property real innerCreationDuration: 10000
+
+ SequentialAnimation on x {
+ id: shakeAnimation
+ running: false
+ property real amplitude: 0.5
+ property real period: 50.0
+ NumberAnimation {
+ from: 0
+ to: shakeAnimation.amplitude
+ duration: shakeAnimation.period / 4.0
+ }
+ NumberAnimation {
+ from: shakeAnimation.amplitude
+ to: -shakeAnimation.amplitude
+ duration: shakeAnimation.period / 2.0
+ }
+ NumberAnimation {
+ to: 0.0
+ duration: shakeAnimation.period / 4.0
+ }
+ }
+
+ Effect {
+ id: wallEffect
+ material: Material {
+ // bronze
+ ambientColor: Qt.rgba(0.125 * 2.0, 0.1275* 2.0, 0.054* 2.0, 1.0)
+ diffuseColor: Qt.rgba(0.714* 2.0,
+ 0.4284* 2.0,
+ 0.18144* 2.0, 1.0)
+ specularColor: Qt.rgba(0.393548,
+ 0.271906,
+ 0.166721, 1.0)
+ shininess: 25.6
+ }
+ }
+ // Positional lighting needs a fair number of vertices to look good,
+ // so we use these two meshes instead of the stock meshes.
+ Mesh {
+ id: subdividedCube
+ source: "meshes/subdivided_cube.3ds";
+ options: "ForceFaceted"
+ }
+
+ Item3D {
+ id: floorGrid
+ mesh: Mesh {
+ source: "meshes/grid.3ds";
+ options: "ForceFaceted"
+ }
+ effect: Effect {
+ material: Material {
+ // bronze
+ ambientColor: Qt.rgba(0.125 * 2.0, 0.1275* 2.0, 0.054* 2.0, 1.0)
+ diffuseColor: Qt.rgba(0.714* 2.0,
+ 0.4284* 2.0,
+ 0.18144* 2.0, 1.0)
+ specularColor: Qt.rgba(0.393548,
+ 0.271906,
+ 0.166721, 1.0)
+ shininess: 25.6
+ }
+ }
+ // Make the grid cover the whole bottom of the maze
+ scale: maze.mazeWidth + 0.5
+ // add a tiny bit to avoid artefacts with the bottoms of boxes going
+ // trough the floor
+ y: -0.501
+
+ }
+
+ Component {
+ id: wallComponent
+ Item3D {
+ id: wallComponentItem
+ scale: 0.0
+ x: 0
+ y: 0
+ z: 0
+ property real startUpPause: 0
+ mesh: subdividedCube
+ effect: wallEffect
+ SequentialAnimation {
+ id: dropInAnimation
+ running: startUpPause != 0
+ property int dropDuration: 400
+ PauseAnimation {
+ id: startUp;
+ duration: wallComponentItem.startUpPause
+ }
+ ParallelAnimation {
+ NumberAnimation {
+ target: wallComponentItem;
+ properties: "scale"; duration: 250;
+ from: 0.0 ; to: 0.5
+ }
+ NumberAnimation {
+ target: wallComponentItem; property: "y";
+ duration: dropInAnimation.dropDuration;
+ from: 10; to: 0
+ }
+ }
+ ScriptAction {
+ script: shakeAnimation.start()
+ }
+ }
+ }
+ }
+
+ Component.onCompleted: {
+ if (wallComponent.status == Component.Ready)
+ generateMaze();
+ else
+ console.log("PANIC");
+ }
+
+ function maybeGenerateMaze() {
+ if (wallComponent.status == Component.Ready)
+ generateMaze();
+ }
+
+ function generateMaze() {
+
+ var i,j;
+ var westEdge = -mazeWidth;
+ var northEdge = -mazeWidth;
+ var newWall;
+
+ var pause = 1;
+ var numberOfBlocks = 4 * 2 *mazeWidth;
+ var cumulativePauseFactor = Math.max(1, Math.floor(maze.wallCreationDuration / numberOfBlocks));
+
+ // Create the outer wall
+
+ // North Wall
+ for (i = 0; i < 2 * mazeWidth; i++)
+ {
+ newWall = wallComponent.createObject(maze);
+ newWall.x = westEdge + i;
+ newWall.z = northEdge;
+ newWall.startUpPause = pause;
+ pause += cumulativePauseFactor;
+ }
+ // East Wall
+ for (i = 0; i < 2 * mazeWidth + 1; i++)
+ {
+ newWall = wallComponent.createObject(maze);
+ newWall.x = westEdge + 2 * mazeWidth;
+ newWall.z = northEdge + i;
+ newWall.startUpPause = pause;
+ pause += cumulativePauseFactor;
+ }
+ // Southwall
+ for (i = 2 * mazeWidth -1; i >= 1 ; i--)
+ {
+ newWall = wallComponent.createObject(maze);
+ newWall.x = westEdge + i;
+ newWall.z = northEdge + 2 * mazeWidth;
+ newWall.startUpPause = pause;
+ pause += cumulativePauseFactor;
+ }
+ // West wall
+ for (i = 2 * mazeWidth; i >= 1; i--)
+ {
+ newWall = wallComponent.createObject(maze);
+ newWall.x = westEdge;
+ newWall.z = northEdge + i;
+ newWall.startUpPause = pause;
+ pause += cumulativePauseFactor;
+ }
+
+ // Create the inner pillars
+ for (i = 1; i < mazeWidth; i++)
+ {
+ for (j = 1; j < mazeWidth; j++)
+ {
+ newWall = wallComponent.createObject(maze);
+ newWall.x = westEdge + i * 2
+ newWall.z = northEdge + j * 2
+ newWall.startUpPause = pause + Math.random() * maze.innerCreationDuration;
+ }
+ }
+
+ // Setup notifications
+ creationTimer.start();
+ wallCreatedTimer.start();
+ return;
+ }
+
+ function calculateNewLightDestination() {
+ var xRange = 2 * (maze.mazeWidth - 1);
+ var xMax = maze.mazeWidth - 1;
+
+ maze.xDestination = Math.round(Math.random() * (maze.mazeWidth -1)) * 2 -maze.mazeWidth + 1;
+ maze.zDestination = Math.round(Math.random() * (maze.mazeWidth -1)) * 2 -maze.mazeWidth + 1;
+ destinationChanged();
+ }
+
+ Material {
+ id: bronze
+ ambientColor: Qt.rgba(0.2125, 0.1275, 0.054, 1.0)
+ diffuseColor: Qt.rgba(0.714,
+ 0.4284,
+ 0.18144, 1.0)
+ specularColor: Qt.rgba(0.393548,
+ 0.271906,
+ 0.166721, 1.0)
+ shininess: 25.6
+ }
+}
diff --git a/examples/quick3d/positional_lighting/qml/PositionalLighting.qml b/examples/quick3d/positional_lighting/qml/PositionalLighting.qml
new file mode 100644
index 000000000..8ebf1409d
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qml/PositionalLighting.qml
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $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 Nokia Corporation 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt3D 2.0
+import Qt3D.Shapes 2.0
+
+Viewport {
+ id: viewport
+ width: parent.width
+ height: parent.height
+ fillColor: "black"
+
+ camera: Camera { eye: Qt.vector3d(21,70,300)}
+
+ property color lightColor: Qt.hsla(hue, saturation, lightness, 1.0)
+ property real hue: 0
+ property real saturation: 1.0
+ property real lightness: 1.0
+
+ // This is the actual light
+ light: Light {
+ id: mazeLight
+ position: lightProxy.localToWorld()
+ // A dimmer ambient light, so it doesn't light up the "wrong"
+ // side of the blocks
+ ambientColor: "#888888"
+ specularColor: viewport.lightColor
+ diffuseColor: viewport.lightColor
+ constantAttenuation: 1
+ linearAttenuation: 0
+ quadraticAttenuation: 0
+ }
+
+ Maze {
+ // Maze is an Item3D based element encompassing all the blocks and the
+ // floor, so that there is something to light
+ scale: 10
+ id: maze
+ y: 0.5
+ mazeWidth: 6
+ // We use this item3D to position the light relative to the Maze,
+ // and update the light to follow it's position as it moves around.
+ Item3D {
+ id: lightProxy
+ scale: 0.5
+ y: 0
+ x: 1
+ z: -maze.mazeWidth + 1
+
+ // Unfortunately, we need to use this signal rather than
+ // QML bindings because localToWorld() is not a property.
+ onPositionChanged: mazeLight.position = localToWorld();
+
+ // We'll add a sphere here to be a visible source for the light
+ // It's fine to combine this with the lightProxy,
+ // They are only separated here to try and make the position
+ // proxy easier to understand.
+ Sphere {
+ effect: Effect {
+ color: viewport.lightColor
+ useLighting: false
+ }
+ }
+
+ SequentialAnimation {
+ id: lightAnimation
+ running: true
+
+ NumberAnimation {
+ id: xAnimation
+ target: lightProxy;
+ property: "x"; duration: 1200; easing.type: Easing.InOutQuad
+ to: maze.xDestination;
+ }
+ NumberAnimation {
+ id: zAnimation
+ target: lightProxy;
+ property: "z"; duration: 1200; easing.type: Easing.InOutQuad
+ to: maze.zDestination;
+ }
+ // It seems like we need this indirection to load the new values
+ onCompleted: maze.calculateNewLightDestination()
+ }
+ }
+
+ onWallFinished: dimmerAnimation.running = true
+ onDestinationChanged: lightAnimation.restart()
+ }
+
+ // This is the initial dimming animation.
+ // At 0 quadratic attenuation, the light goes on forever, but as it
+ // increases, the light tapers off faster.
+ NumberAnimation {
+ id: dimmerAnimation
+ target: mazeLight
+ property: "quadraticAttenuation"
+ from: 0
+ to: lightPulse.upperBound
+ duration: 1500
+ onCompleted: lightPulse.running = true;
+ }
+
+ // Animating the lighting attenuation to make the light pulse.
+ // Note that there is no easing curve (although there could be), the
+ // exponential nature of the attenuation co-efficient just makes it
+ // look like it's changing at different rates.
+ SequentialAnimation {
+ id: lightPulse
+ property real period: 2500
+ property real upperBound: 0.001
+ property real lowerBound: 0.005
+ loops: Animation.Infinite
+ NumberAnimation {
+ target: mazeLight
+ property: "quadraticAttenuation"
+ from: lightPulse.upperBound
+ to: lightPulse.lowerBound
+ duration: lightPulse.period / 2.0
+ }
+ NumberAnimation {
+ target: mazeLight
+ property: "quadraticAttenuation"
+ from: lightPulse.lowerBound
+ to: lightPulse.upperBound
+ duration: lightPulse.period / 2.0
+ }
+ }
+
+ // Animating the light color for no good reason.
+ SequentialAnimation {
+ id: hsvColorAnimation
+ running: false
+ NumberAnimation {
+ target: viewport
+ property: "lightness"
+ from:1.0; to:0.5;
+ duration: 1000;
+ }
+ NumberAnimation {
+ target: viewport
+ property: "hue"
+ from:0; to: 1.0;
+ duration: 6000;
+ }
+ NumberAnimation {
+ target: viewport
+ property: "lightness"
+ from:0.5; to:1.0;
+ duration: 1000;
+ }
+ }
+
+ // Trigger the disco mode on keyboard input
+ focus: true
+ Keys.onPressed: {
+ hsvColorAnimation.running = !hsvColorAnimation.running;
+ }
+}
diff --git a/examples/quick3d/positional_lighting/qml/desktop.qml b/examples/quick3d/positional_lighting/qml/desktop.qml
new file mode 100644
index 000000000..89b3114a8
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qml/desktop.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt3D examples of the Qt Toolkit.
+**
+** $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 Nokia Corporation 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt3D 2.0
+import Qt3D.Shapes 2.0
+import "."
+
+Item {
+ width: 1000
+ height: 800
+
+ PositionalLighting {
+ }
+}
diff --git a/examples/quick3d/positional_lighting/qml/meshes/grid.3ds b/examples/quick3d/positional_lighting/qml/meshes/grid.3ds
new file mode 100644
index 000000000..00ce7fed3
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qml/meshes/grid.3ds
Binary files differ
diff --git a/examples/quick3d/positional_lighting/qml/meshes/subdivided_cube.3ds b/examples/quick3d/positional_lighting/qml/meshes/subdivided_cube.3ds
new file mode 100644
index 000000000..d1657be0d
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qml/meshes/subdivided_cube.3ds
Binary files differ
diff --git a/examples/quick3d/positional_lighting/qtquick3d.ico b/examples/quick3d/positional_lighting/qtquick3d.ico
new file mode 100644
index 000000000..b3b85e37b
--- /dev/null
+++ b/examples/quick3d/positional_lighting/qtquick3d.ico
Binary files differ
diff --git a/examples/quick3d/quick3d.pro b/examples/quick3d/quick3d.pro
index c06e7b1bb..de6b09596 100644
--- a/examples/quick3d/quick3d.pro
+++ b/examples/quick3d/quick3d.pro
@@ -5,6 +5,7 @@ SUBDIRS += \
forest \
lander \
matrix_animation \
+ positional_lighting \
monkeygod \
moon \
photoroom \