[NUI] Add Tizen.NUI.Scene3D simple demo (#4917)
authorEunki Hong <h.pichulia@gmail.com>
Wed, 25 Jan 2023 05:14:16 +0000 (14:14 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Wed, 25 Jan 2023 09:22:01 +0000 (18:22 +0900)
* [NUI] Add Tizen.NUI.Scene3D simple demo

Hello 3d world!

Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
* Update Scene3DSample.cs

2022 -> 2023

Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
Co-authored-by: Eunki, Hong <eunkiki.hong@samsung.com>
20 files changed:
test/Tizen.NUI.Scene3D.Sample/Scene3DSample.cs [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.code-workspace [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.csproj [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_AO.jpg [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_albedo.jpg [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_emissive.jpg [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_metalRoughness.jpg [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_normal.jpg [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/Irradiance.ktx [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/Radiance.ktx [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/forest_diffuse_cubemap.png [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/forest_specular_cubemap.png [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/papermill_E_diffuse-64.ktx [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/image/papermill_pmrem.ktx [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated.gltf [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated0.bin [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.bin [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.gltf [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/shared/res/Tizen.NUI.Scene3D.Sample.png [new file with mode: 0644]
test/Tizen.NUI.Scene3D.Sample/tizen-manifest.xml [new file with mode: 0755]

diff --git a/test/Tizen.NUI.Scene3D.Sample/Scene3DSample.cs b/test/Tizen.NUI.Scene3D.Sample/Scene3DSample.cs
new file mode 100644 (file)
index 0000000..f4123ee
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Constants;
+using Tizen.NUI.Scene3D;
+using System.Collections.Generic;
+
+class Scene3DSample : NUIApplication
+{
+    static string IMAGE_DIR = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "image/";
+    static string MODEL_DIR = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "model/";
+
+    Window mWindow;
+    Vector2 mWindowSize;
+
+    SceneView mSceneView;
+    Model     mModel;
+
+    uint currentCameraIndex = 0u;
+    const int cameraAnimationDurationMilliSeconds = 2000; // milliSeconds
+
+    Animation mModelRotateAnimation;
+    const int modelRotateAnimationDurationMilliSeconds = 10000; // milliSeconds
+
+    protected void CreateSceneView()
+    {
+        mSceneView = new SceneView()
+        {
+            SizeWidth = mWindowSize.Width,
+            SizeHeight = mWindowSize.Height,
+            PositionX = 0.0f,
+            PositionY = 0.0f,
+            PivotPoint = PivotPoint.TopLeft,
+            ParentOrigin = ParentOrigin.TopLeft,
+            PositionUsesPivotPoint = true,
+        };
+
+        SetupSceneViewCamera(mSceneView);
+
+        mWindow.Add(mSceneView);
+    }
+    private void SetupSceneViewCamera(SceneView sceneView)
+    {
+        // Default camera setting
+        // Note : SceneView always have 1 default camera.
+        Tizen.NUI.Scene3D.Camera defaultCamera = sceneView.GetCamera(0u);
+
+        defaultCamera.PositionX = 0.0f;
+        defaultCamera.PositionY = 0.0f;
+        defaultCamera.PositionZ = 5.55f;
+        defaultCamera.NearPlaneDistance = 0.5f;
+        defaultCamera.FarPlaneDistance = 50.0f;
+        //defaultCamera.Orientation = new Rotation(new Radian(new Degree(180.0f)), Vector3.YAxis);
+        defaultCamera.FieldOfView = new Radian(new Degree(45.0f));
+        defaultCamera.OrthographicSize = 2.7f;
+
+        // Additional camera setting (top view camera).
+        Tizen.NUI.Scene3D.Camera camera = new Tizen.NUI.Scene3D.Camera()
+        {
+            PositionX = 0.0f,
+            PositionY = -3.95f,
+            PositionZ = 0.0f,
+            NearPlaneDistance = 0.5f,
+            FarPlaneDistance = 50.0f,
+            // Rotate by XAxis first, and then rotate by YAxis
+            Orientation = new Rotation(new Radian(new Degree(90.0f)), Vector3.YAxis) *
+                            new Rotation(new Radian(new Degree(-90.0f)), Vector3.XAxis),
+            FieldOfView = new Radian(new Degree(70.0f)),
+            OrthographicSize = 2.7f,
+        };
+        sceneView.AddCamera(camera);
+    }
+
+    protected void CreateModel(string modelUrl)
+    {
+        // Release old one.
+        if(mModel != null)
+        {
+            mModel.Unparent();
+            mModel.Dispose();
+        }
+
+        mModel = new Model(MODEL_DIR + modelUrl)
+        {
+            Name = modelUrl,
+        };
+        mModel.ResourcesLoaded += (s, e) =>
+        {
+            Model model = s as Model;
+
+            // You can play animation if it has.
+            if(model.GetAnimationCount() > 0u)
+            {
+                model.GetAnimation(0u).Looping = true;
+                model.GetAnimation(0u).Play();
+            }
+            Tizen.Log.Error("NUI", $"{model.Name} size : {model.Size.Width}, {model.Size.Height}, {model.Size.Depth}\n");
+        };
+        mModelRotateAnimation = new Animation(modelRotateAnimationDurationMilliSeconds);
+        mModelRotateAnimation.AnimateBy(mModel, "Orientation", new Rotation(new Radian(new Degree(360.0f)), Vector3.YAxis));
+
+        mModelRotateAnimation.Looping = true;
+        mModelRotateAnimation.Play();
+
+        mSceneView.Add(mModel);
+    }
+
+    void SetupIBLimage(string specularUrl, string diffuseUrl, float iblFactor)
+    {
+        mSceneView.SetImageBasedLightSource(IMAGE_DIR + specularUrl, IMAGE_DIR + diffuseUrl,iblFactor);
+    }
+
+    void OnKeyEvent(object source, Window.KeyEventArgs e)
+    {
+        if (e.Key.State == Key.StateType.Down)
+        {
+            FullGC();
+            //Streamline.AnnotateChannelEnd(0);
+
+            switch( e.Key.KeyPressedName )
+            {
+                case "Escape":
+                case "Back":
+                {
+                    Deactivate();
+                    Exit();
+                    break;
+                }
+
+                case "Return":
+                case "Select":
+                {
+                    currentCameraIndex++;
+                    if(currentCameraIndex >= mSceneView.GetCameraCount())
+                    {
+                        currentCameraIndex = 0;
+                    }
+
+                    mSceneView.CameraTransition(currentCameraIndex, cameraAnimationDurationMilliSeconds);
+                    break;
+                }
+
+                case "1":
+                {
+                    currentModelIndex++;
+                    if(currentModelIndex >= ModelUrlList.Count)
+                    {
+                        currentModelIndex = 0;
+                    }
+
+                    CreateModel(ModelUrlList[currentModelIndex]);
+                    break;
+                }
+                case "2":
+                {
+                    currentIBLIndex++;
+                    if(currentIBLIndex >= IBLUrlList.Count)
+                    {
+                        currentIBLIndex = 0;
+                    }
+
+                    SetupIBLimage(IBLUrlList[currentIBLIndex].Item1, IBLUrlList[currentIBLIndex].Item2, 0.7f);
+                    break;
+                }
+            }
+        }
+    }
+
+    private static readonly List<string> ModelUrlList = new List<string>()
+    {
+        // Model reference : https://sketchfab.com/models/b81008d513954189a063ff901f7abfe4
+        // Get from KhronosGroup https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/DamagedHelmet
+        "DamagedHelmet/DamagedHelmet.gltf",
+        "BoxAnimated/BoxAnimated.gltf",
+    };
+    private int currentModelIndex = 0;
+
+    private static readonly List<(string, string)> IBLUrlList = new List<(string, string)>
+    {
+        ("forest_diffuse_cubemap.png", "forest_specular_cubemap.png"),
+        ("papermill_E_diffuse-64.ktx", "papermill_pmrem.ktx"),
+        ("Irradiance.ktx", "Radiance.ktx"),
+    };
+    private int currentIBLIndex = 0;
+
+    public void Activate()
+    {
+        mWindow = Window.Instance;
+        mWindow.BackgroundColor = Color.DarkOrchid;
+        mWindowSize = mWindow.WindowSize;
+
+        mWindow.KeyEvent += OnKeyEvent;
+
+        CreateSceneView();
+        SetupIBLimage(IBLUrlList[currentIBLIndex].Item1, IBLUrlList[currentIBLIndex].Item2, 0.7f);
+        CreateModel(ModelUrlList[currentModelIndex]);
+    }
+    public void FullGC(){
+        global::System.GC.Collect();
+        global::System.GC.WaitForPendingFinalizers();
+        global::System.GC.Collect();
+    }
+
+    public void Deactivate()
+    {
+        DestroyScene();
+    }
+    private void DestroyScene()
+    {
+    }
+
+    protected override void OnCreate()
+    {
+        // Up call to the Base class first
+        base.OnCreate();
+        Activate();
+    }
+
+    /// <summary>
+    /// The main entry point for the application.
+    /// </summary>
+    [STAThread] // Forces app to use one thread to access NUI
+    static void Main(string[] args)
+    {
+        Scene3DSample example = new Scene3DSample();
+        example.Run(args);
+    }
+}
diff --git a/test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.code-workspace b/test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.code-workspace
new file mode 100644 (file)
index 0000000..3efec65
--- /dev/null
@@ -0,0 +1,17 @@
+{
+       "folders": [
+               {
+                       "path": "."
+               },
+               {
+                       "path": "../../src/Tizen.NUI"
+               },
+               {
+                       "path": "../../src/Tizen.NUI.Components"
+               },
+               {
+                       "path": "../../src/Tizen.NUI.Scene3D"
+               }
+       ],
+       "settings": {}
+}
diff --git a/test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.csproj b/test/Tizen.NUI.Scene3D.Sample/Tizen.NUI.Scene3D.Sample.csproj
new file mode 100644 (file)
index 0000000..42edfaa
--- /dev/null
@@ -0,0 +1,26 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <PropertyGroup>
+        <OutputType>Exe</OutputType>
+        <TargetFramework>netcoreapp3.1</TargetFramework>
+        <AssemblyName>Scene3DSample</AssemblyName>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+        <DebugType>portable</DebugType>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+        <DebugType>None</DebugType>
+    </PropertyGroup>
+
+    <ItemGroup>
+        <PackageReference Include="Tizen.NET.Sdk" Version="1.0.9" />
+        <ProjectReference Include="../../src/Tizen/Tizen.csproj" />
+        <ProjectReference Include="../../src/Tizen.NUI.Components/Tizen.NUI.Components.csproj" />
+        <ProjectReference Include="../../src/Tizen.NUI.Scene3D/Tizen.NUI.Scene3D.csproj" />
+        <ProjectReference Include="../../src/Tizen.NUI/Tizen.NUI.csproj" />
+    </ItemGroup>
+
+    <PropertyGroup>
+        <NeedInjection>True</NeedInjection>
+    </PropertyGroup>
+</Project>
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_AO.jpg b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_AO.jpg
new file mode 100644 (file)
index 0000000..419f628
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_AO.jpg differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_albedo.jpg b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_albedo.jpg
new file mode 100644 (file)
index 0000000..15d6485
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_albedo.jpg differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_emissive.jpg b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_emissive.jpg
new file mode 100644 (file)
index 0000000..2de59e8
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_emissive.jpg differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_metalRoughness.jpg b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_metalRoughness.jpg
new file mode 100644 (file)
index 0000000..04874cb
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_metalRoughness.jpg differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_normal.jpg b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_normal.jpg
new file mode 100644 (file)
index 0000000..94ca20a
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/DamagedHelmet/Default_normal.jpg differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/Irradiance.ktx b/test/Tizen.NUI.Scene3D.Sample/res/image/Irradiance.ktx
new file mode 100644 (file)
index 0000000..940366c
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/Irradiance.ktx differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/Radiance.ktx b/test/Tizen.NUI.Scene3D.Sample/res/image/Radiance.ktx
new file mode 100644 (file)
index 0000000..c250249
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/Radiance.ktx differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/forest_diffuse_cubemap.png b/test/Tizen.NUI.Scene3D.Sample/res/image/forest_diffuse_cubemap.png
new file mode 100644 (file)
index 0000000..ff3e237
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/forest_diffuse_cubemap.png differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/forest_specular_cubemap.png b/test/Tizen.NUI.Scene3D.Sample/res/image/forest_specular_cubemap.png
new file mode 100644 (file)
index 0000000..d5cb909
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/forest_specular_cubemap.png differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_E_diffuse-64.ktx b/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_E_diffuse-64.ktx
new file mode 100644 (file)
index 0000000..c000b61
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_E_diffuse-64.ktx differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_pmrem.ktx b/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_pmrem.ktx
new file mode 100644 (file)
index 0000000..62df20e
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/image/papermill_pmrem.ktx differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated.gltf b/test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated.gltf
new file mode 100644 (file)
index 0000000..d40924e
--- /dev/null
@@ -0,0 +1,328 @@
+{
+    "asset": {
+        "generator": "COLLADA2GLTF",
+        "version": "2.0"
+    },
+    "scene": 0,
+    "scenes": [
+        {
+            "nodes": [
+                3,
+                0
+            ]
+        }
+    ],
+    "nodes": [
+        {
+            "children": [
+                1
+            ],
+            "rotation": [
+                -0.0,
+                -0.0,
+                -0.0,
+                -1.0
+            ]
+        },
+        {
+            "children": [
+                2
+            ]
+        },
+        {
+            "mesh": 0,
+            "rotation": [
+                -0.0,
+                -0.0,
+                -0.0,
+                -1.0
+            ]
+        },
+        {
+            "mesh": 1
+        }
+    ],
+    "meshes": [
+        {
+            "primitives": [
+                {
+                    "attributes": {
+                        "NORMAL": 1,
+                        "POSITION": 2
+                    },
+                    "indices": 0,
+                    "mode": 4,
+                    "material": 0
+                }
+            ],
+            "name": "inner_box"
+        },
+        {
+            "primitives": [
+                {
+                    "attributes": {
+                        "NORMAL": 4,
+                        "POSITION": 5
+                    },
+                    "indices": 3,
+                    "mode": 4,
+                    "material": 1
+                }
+            ],
+            "name": "outer_box"
+        }
+    ],
+    "animations": [
+        {
+            "channels": [
+                {
+                    "sampler": 0,
+                    "target": {
+                        "node": 2,
+                        "path": "rotation"
+                    }
+                },
+                {
+                    "sampler": 1,
+                    "target": {
+                        "node": 0,
+                        "path": "translation"
+                    }
+                }
+            ],
+            "samplers": [
+                {
+                    "input": 6,
+                    "interpolation": "LINEAR",
+                    "output": 7
+                },
+                {
+                    "input": 8,
+                    "interpolation": "LINEAR",
+                    "output": 9
+                }
+            ]
+        }
+    ],
+    "accessors": [
+        {
+            "bufferView": 0,
+            "byteOffset": 0,
+            "componentType": 5123,
+            "count": 186,
+            "max": [
+                95
+            ],
+            "min": [
+                0
+            ],
+            "type": "SCALAR"
+        },
+        {
+            "bufferView": 1,
+            "byteOffset": 0,
+            "componentType": 5126,
+            "count": 96,
+            "max": [
+                1.0,
+                1.0,
+                1.0
+            ],
+            "min": [
+                -1.0,
+                -1.0,
+                -1.0
+            ],
+            "type": "VEC3"
+        },
+        {
+            "bufferView": 1,
+            "byteOffset": 1152,
+            "componentType": 5126,
+            "count": 96,
+            "max": [
+                0.33504000306129458,
+                0.5,
+                0.33504000306129458
+            ],
+            "min": [
+                -0.33504000306129458,
+                -0.5,
+                -0.33504000306129458
+            ],
+            "type": "VEC3"
+        },
+        {
+            "bufferView": 0,
+            "byteOffset": 372,
+            "componentType": 5123,
+            "count": 576,
+            "max": [
+                223
+            ],
+            "min": [
+                0
+            ],
+            "type": "SCALAR"
+        },
+        {
+            "bufferView": 1,
+            "byteOffset": 2304,
+            "componentType": 5126,
+            "count": 224,
+            "max": [
+                1.0,
+                1.0,
+                1.0
+            ],
+            "min": [
+                -1.0,
+                -1.0,
+                -1.0
+            ],
+            "type": "VEC3"
+        },
+        {
+            "bufferView": 1,
+            "byteOffset": 4992,
+            "componentType": 5126,
+            "count": 224,
+            "max": [
+                0.5,
+                0.5,
+                0.5
+            ],
+            "min": [
+                -0.5,
+                -0.5,
+                -0.5
+            ],
+            "type": "VEC3"
+        },
+        {
+            "bufferView": 2,
+            "byteOffset": 0,
+            "componentType": 5126,
+            "count": 2,
+            "max": [
+                2.5
+            ],
+            "min": [
+                1.25
+            ],
+            "type": "SCALAR"
+        },
+        {
+            "bufferView": 3,
+            "byteOffset": 0,
+            "componentType": 5126,
+            "count": 2,
+            "max": [
+                1.0,
+                0.0,
+                0.0,
+                4.4896593387466768e-11
+            ],
+            "min": [
+                -0.0,
+                0.0,
+                0.0,
+                -1.0
+            ],
+            "type": "VEC4"
+        },
+        {
+            "bufferView": 2,
+            "byteOffset": 8,
+            "componentType": 5126,
+            "count": 4,
+            "max": [
+                3.708329916000366
+            ],
+            "min": [
+                0.0
+            ],
+            "type": "SCALAR"
+        },
+        {
+            "bufferView": 4,
+            "byteOffset": 0,
+            "componentType": 5126,
+            "count": 4,
+            "max": [
+                0.0,
+                2.5199999809265138,
+                0.0
+            ],
+            "min": [
+                0.0,
+                0.0,
+                0.0
+            ],
+            "type": "VEC3"
+        }
+    ],
+    "materials": [
+        {
+            "pbrMetallicRoughness": {
+                "baseColorFactor": [
+                    0.800000011920929,
+                    0.4159420132637024,
+                    0.7952920198440552,
+                    1.0
+                ],
+                "metallicFactor": 0.0
+            },
+            "name": "inner"
+        },
+        {
+            "pbrMetallicRoughness": {
+                "baseColorFactor": [
+                    0.3016040027141571,
+                    0.5335419774055481,
+                    0.800000011920929,
+                    1.0
+                ],
+                "metallicFactor": 0.0
+            },
+            "name": "outer"
+        }
+    ],
+    "bufferViews": [
+        {
+            "buffer": 0,
+            "byteOffset": 7784,
+            "byteLength": 1524,
+            "target": 34963
+        },
+        {
+            "buffer": 0,
+            "byteOffset": 80,
+            "byteLength": 7680,
+            "byteStride": 12,
+            "target": 34962
+        },
+        {
+            "buffer": 0,
+            "byteOffset": 7760,
+            "byteLength": 24
+        },
+        {
+            "buffer": 0,
+            "byteOffset": 0,
+            "byteLength": 32
+        },
+        {
+            "buffer": 0,
+            "byteOffset": 32,
+            "byteLength": 48
+        }
+    ],
+    "buffers": [
+        {
+            "byteLength": 9308,
+            "uri": "BoxAnimated0.bin"
+        }
+    ]
+}
+
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated0.bin b/test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated0.bin
new file mode 100644 (file)
index 0000000..2e4ef6e
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/model/BoxAnimated/BoxAnimated0.bin differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.bin b/test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.bin
new file mode 100644 (file)
index 0000000..6fea01e
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.bin differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.gltf b/test/Tizen.NUI.Scene3D.Sample/res/model/DamagedHelmet/DamagedHelmet.gltf
new file mode 100644 (file)
index 0000000..9fad06a
--- /dev/null
@@ -0,0 +1,217 @@
+{
+       "asset": {
+               "generator": "Unity 2017.1.0f3",
+               "extras": {
+                       "exporterVersion" : "2.2.0"
+               },
+               "version": "2.0"
+       },
+       "accessors": [
+               {
+                       "bufferView": 2,
+                       "byteOffset": 0,
+                       "componentType": 5126,
+                       "count": 13600,
+                       "max": [ 0.944977, 0.900995, 1 ],
+                       "min": [ -0.944977, -0.900974, -1 ],
+                       "type": "VEC3"
+               },
+               {
+                       "bufferView": 2,
+                       "byteOffset": 163200,
+                       "componentType": 5126,
+                       "count": 13600,
+                       "max": [ 1, 1, 1 ],
+                       "min": [ -1, -1, -1 ],
+                       "type": "VEC3"
+               },
+               {
+                       "bufferView": 1,
+                       "byteOffset": 0,
+                       "componentType": 5126,
+                       "count": 13600,
+                       "max": [ 0.999976, 0.998666 ],
+                       "min": [ 0.00244864, 0.00055312 ],
+                       "type": "VEC2"
+               },
+               {
+                       "bufferView": 3,
+                       "byteOffset": 0,
+                       "componentType": 5126,
+                       "count": 13600,
+                       "max": [ 1, 1, 1, 1 ],
+                       "min": [ -1, -1, -1, -1 ],
+                       "type": "VEC4"
+               },
+               {
+                       "bufferView": 0,
+                       "byteOffset": 0,
+                       "componentType": 5123,
+                       "count": 46356,
+                       "max": [ 13599 ],
+                       "min": [ 0 ],
+                       "type": "SCALAR"
+               }
+       ],
+       "buffers": [
+               {
+                       "byteLength": 745512,
+                       "uri": "DamagedHelmet.bin"
+               }
+       ],
+       "bufferViews": [
+               {
+                       "buffer": 0,
+                       "byteLength": 92712,
+                       "target": 34963,
+                       "byteOffset": 652800
+               },
+               {
+                       "buffer": 0,
+                       "byteLength": 108800,
+                       "target": 34962,
+                       "byteStride": 8,
+                       "byteOffset": 0
+               },
+               {
+                       "buffer": 0,
+                       "byteLength": 326400,
+                       "target": 34962,
+                       "byteStride": 12,
+                       "byteOffset": 108800
+               },
+               {
+                       "buffer": 0,
+                       "byteLength": 217600,
+                       "target": 34962,
+                       "byteStride": 16,
+                       "byteOffset": 435200
+               }
+       ],
+       "images": [
+               {
+                       "uri": "../../image/DamagedHelmet/Default_albedo.jpg"
+               },
+               {
+                       "uri": "../../image/DamagedHelmet/Default_metalRoughness.jpg"
+               },
+               {
+                       "uri": "../../image/DamagedHelmet/Default_normal.jpg"
+               },
+               {
+                       "uri": "../../image/DamagedHelmet/Default_emissive.jpg"
+               },
+               {
+                       "uri": "../../image/DamagedHelmet/Default_AO.jpg"
+               }
+       ],
+       "materials": [
+               {
+                       "pbrMetallicRoughness": {
+                               "baseColorTexture" : {
+                                       "index" : 0,
+                                       "texCoord" : 0
+                               },
+                               "baseColorFactor": [1, 1, 1, 1],
+                               "metallicRoughnessTexture" : {
+                                       "index" : 1,
+                                       "texCoord" : 0
+                               },
+                               "metallicFactor": 1,
+                               "roughnessFactor": 1
+                       },
+                       "normalTexture" : {
+                               "index" : 2,
+                               "texCoord" : 0,
+                               "scale" : 0.8
+                       },
+                       "emissiveTexture" : {
+                               "index" : 3,
+                               "texCoord" : 0
+                       },
+                       "emissiveFactor": [1, 1, 1],
+                       "occlusionTexture" : {
+                               "index" : 4,
+                               "texCoord" : 0,
+                               "strength" : 0.632
+                       },
+                       "doubleSided": false,
+                       "name": "Helmet_mat"
+               }
+       ],
+       "meshes": [
+               {
+                       "name": "mesh_helmet_LP_14908damagedHelmet",
+                       "primitives": [
+                               {
+                                       "attributes": {
+                                               "POSITION": 0,
+                                               "NORMAL": 1,
+                                               "TEXCOORD_0": 2,
+                                               "TANGENT": 3
+                                       },
+                                       "indices": 4,
+                                       "material": 0,
+                                       "mode": 4
+                               }
+                       ]
+               }
+       ],
+       "nodes": [
+               {
+                       "name": "UnityGlTF_root",
+                       "children": [
+                               1
+                       ]
+               },
+               {
+                       "name": "node_damagedHelmet_-6498",
+                       "mesh": 0,
+                       "rotation" : [
+                               0.0,
+                               1.0,
+                               0.0,
+                               0.0
+                       ]
+               }
+       ],
+       "samplers": [
+               {
+                       "magFilter": 9729,
+                       "minFilter": 9985,
+                       "wrapS": 10497,
+                       "wrapT": 10497
+               }
+       ],
+       "scenes": [
+               {
+                       "name":"defaultScene",
+                       "nodes": [
+                               0
+                       ]
+               }
+       ],
+       "scene": 0,
+       "textures": [
+               {
+                       "sampler": 0,
+                       "source": 0
+               },
+               {
+                       "sampler": 0,
+                       "source": 1
+               },
+               {
+                       "sampler": 0,
+                       "source": 2
+               },
+               {
+                       "sampler": 0,
+                       "source": 3
+               },
+               {
+                       "sampler": 0,
+                       "source": 4
+               }
+       ]
+}
\ No newline at end of file
diff --git a/test/Tizen.NUI.Scene3D.Sample/shared/res/Tizen.NUI.Scene3D.Sample.png b/test/Tizen.NUI.Scene3D.Sample/shared/res/Tizen.NUI.Scene3D.Sample.png
new file mode 100644 (file)
index 0000000..ef30093
Binary files /dev/null and b/test/Tizen.NUI.Scene3D.Sample/shared/res/Tizen.NUI.Scene3D.Sample.png differ
diff --git a/test/Tizen.NUI.Scene3D.Sample/tizen-manifest.xml b/test/Tizen.NUI.Scene3D.Sample/tizen-manifest.xml
new file mode 100755 (executable)
index 0000000..ffc26f5
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="6" package="org.tizen.example.Tizen.NUI.Scene3D.Sample" version="1.0.0">
+  <profile name="common" />
+  <ui-application appid="org.tizen.example.Tizen.NUI.Scene3D.Sample"
+                                       exec="Scene3DSample.dll"
+                                       type="dotnet-nui"
+                                       multiple="false"
+                                       taskmanage="true"
+                                       nodisplay="false"
+                                       launch_mode="single"
+                                       >
+    <label>Tizen.NUI.Scene3D.Sample</label>
+    <icon>Tizen.NUI.Scene3D.Sample.png</icon>
+    <metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
+  </ui-application>
+</manifest>