END_TEST;
}
+
+int UtcDaliSceneViewSetSkybox(void)
+{
+ ToolkitTestApplication application;
+
+ gResourceReadyCalled = false;
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ view.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+ view.ResourceReadySignal().Connect(OnResourceReady);
+ // SceneView::IsResourceReady() returns true by default.
+ DALI_TEST_EQUALS(view.IsResourceReady(), true, TEST_LOCATION);
+
+ // Sanity check
+ DALI_TEST_CHECK(!gResourceReadyCalled);
+
+ application.GetScene().Add(view);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(view.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION);
+
+ gResourceReadyCalled = false;
+
+ view.SetSkybox(TEST_SPECULAR_TEXTURE);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewSetSkyboxIntensity(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ view.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+
+ float intensity = 0.5f;
+ DALI_TEST_EQUALS(view.GetSkyboxIntensity(), 1.0f, TEST_LOCATION);
+
+ view.SetSkyboxIntensity(intensity);
+ DALI_TEST_EQUALS(view.GetSkyboxIntensity(), intensity, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewSetSkyboxOrientation(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ view.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+
+ Dali::Quaternion orientation = Dali::Quaternion(Radian(0.5f), Vector3::YAXIS);
+ view.SetSkyboxOrientation(orientation);
+ DALI_TEST_EQUALS(view.GetSkyboxOrientation(), orientation, TEST_LOCATION);
+
+ END_TEST;
+}
#include <dali/integration-api/debug.h>
#include <dali/public-api/object/type-registry-helper.h>
#include <dali/public-api/object/type-registry.h>
+#include <string_view>
// INTERNAL INCLUDES
#include <dali-scene3d/internal/controls/model/model-impl.h>
+#include <dali-scene3d/internal/graphics/builtin-shader-extern-gen.h>
#include <dali-scene3d/public-api/loader/cube-map-loader.h>
#include <dali/integration-api/debug.h>
Property::Index RENDERING_BUFFER = Dali::Toolkit::Control::CONTROL_PROPERTY_END_INDEX + 1;
constexpr int32_t DEFAULT_ORIENTATION = 0;
+static constexpr std::string_view SKYBOX_INTENSITY_STRING = "uIntensity";
+
+Dali::Actor CreateSkybox(const std::string& skyboxUrl)
+{
+ struct Vertex
+ {
+ Vector3 aPosition;
+ };
+
+ Vertex skyboxVertices[] = {
+ // back
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+ {Vector3(-1.0f, -1.0f, -1.0f)},
+ {Vector3(1.0f, -1.0f, -1.0f)},
+ {Vector3(1.0f, -1.0f, -1.0f)},
+ {Vector3(1.0f, 1.0f, -1.0f)},
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+
+ // left
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+ {Vector3(-1.0f, -1.0f, -1.0f)},
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+ {Vector3(-1.0f, 1.0f, 1.0f)},
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+
+ // right
+ {Vector3(1.0f, -1.0f, -1.0f)},
+ {Vector3(1.0f, -1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, -1.0f)},
+ {Vector3(1.0f, -1.0f, -1.0f)},
+
+ // front
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+ {Vector3(-1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, -1.0f, 1.0f)},
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+
+ // botton
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+ {Vector3(1.0f, 1.0f, -1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(1.0f, 1.0f, 1.0f)},
+ {Vector3(-1.0f, 1.0f, 1.0f)},
+ {Vector3(-1.0f, 1.0f, -1.0f)},
+
+ // top
+ {Vector3(-1.0f, -1.0f, -1.0f)},
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+ {Vector3(1.0f, -1.0f, -1.0f)},
+ {Vector3(1.0f, -1.0f, -1.0f)},
+ {Vector3(-1.0f, -1.0f, 1.0f)},
+ {Vector3(1.0f, -1.0f, 1.0f)}};
+
+ Dali::Shader shaderSkybox = Shader::New(SHADER_SKYBOX_SHADER_VERT.data(), SHADER_SKYBOX_SHADER_FRAG.data());
+ Dali::VertexBuffer vertexBuffer = Dali::VertexBuffer::New(Property::Map().Add("aPosition", Property::VECTOR3));
+ vertexBuffer.SetData(skyboxVertices, sizeof(skyboxVertices) / sizeof(Vertex));
+
+ Dali::Geometry skyboxGeometry = Geometry::New();
+ skyboxGeometry.AddVertexBuffer(vertexBuffer);
+ skyboxGeometry.SetType(Geometry::TRIANGLES);
+
+ Dali::Texture skyboxTexture = Dali::Scene3D::Loader::LoadCubeMap(skyboxUrl);
+ Dali::TextureSet skyboxTextures = TextureSet::New();
+ skyboxTextures.SetTexture(0, skyboxTexture);
+
+ Dali::Renderer skyboxRenderer = Renderer::New(skyboxGeometry, shaderSkybox);
+ skyboxRenderer.SetTextures(skyboxTextures);
+ skyboxRenderer.SetProperty(Renderer::Property::DEPTH_INDEX, 2.0f);
+ // Enables the depth test.
+ skyboxRenderer.SetProperty(Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::ON);
+ // The fragment shader will run only is those pixels that have the max depth value.
+ skyboxRenderer.SetProperty(Renderer::Property::DEPTH_FUNCTION, DepthFunction::LESS_EQUAL);
+
+ Dali::Actor skyboxActor = Actor::New();
+ skyboxActor.SetProperty(Dali::Actor::Property::NAME, "SkyBox");
+ skyboxActor.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+ skyboxActor.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+ skyboxActor.AddRenderer(skyboxRenderer);
+ return skyboxActor;
+}
+
} // anonymous namespace
SceneView::SceneView()
: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)),
- mWindowOrientation(DEFAULT_ORIENTATION)
+ mWindowOrientation(DEFAULT_ORIENTATION),
+ mSkybox(),
+ mSkyboxOrientation(Quaternion()),
+ mSkyboxIntensity(1.0f)
{
}
}
}
mIBLResourceReady = true;
- Control::SetResourceReady(false);
+ if(IsResourceReady())
+ {
+ Control::SetResourceReady(false);
+ }
}
void SceneView::SetImageBasedLightScaleFactor(float scaleFactor)
return mUseFrameBuffer;
}
+void SceneView::SetSkybox(const std::string& skyboxUrl)
+{
+ mSkyboxResourceReady = false;
+ if(mSkybox)
+ {
+ mSkybox.Unparent();
+ mSkybox.Reset();
+ }
+ mSkybox = CreateSkybox(skyboxUrl);
+ SetSkyboxIntensity(mSkyboxIntensity);
+ SetSkyboxOrientation(mSkyboxOrientation);
+ if(mRootLayer)
+ {
+ mRootLayer.Add(mSkybox);
+ }
+
+ mSkyboxResourceReady = true;
+ if(IsResourceReady())
+ {
+ Control::SetResourceReady(false);
+ }
+}
+
+void SceneView::SetSkyboxIntensity(float intensity)
+{
+ mSkyboxIntensity = intensity;
+ if(intensity < 0)
+ {
+ DALI_LOG_ERROR("Intensity should be greater than or equal to 0.\n");
+ mSkyboxIntensity = 0.0f;
+ }
+
+ if(mSkybox)
+ {
+ mSkybox.RegisterProperty(SKYBOX_INTENSITY_STRING.data(), mSkyboxIntensity);
+ }
+}
+
+float SceneView::GetSkyboxIntensity() const
+{
+ return mSkyboxIntensity;
+}
+
+void SceneView::SetSkyboxOrientation(const Quaternion& orientation)
+{
+ mSkyboxOrientation = orientation;
+ if(mSkybox)
+ {
+ mSkybox.SetProperty(Dali::Actor::Property::ORIENTATION, orientation);
+ }
+}
+
+Quaternion SceneView::GetSkyboxOrientation() const
+{
+ return mSkyboxOrientation;
+}
+
///////////////////////////////////////////////////////////
//
// Private methods
bool SceneView::IsResourceReady() const
{
- return mIBLResourceReady;
+ return mIBLResourceReady & mSkyboxResourceReady;
}
void SceneView::UpdateCamera(CameraActor camera)