diff --git a/WickedEngine/DeferredRenderableComponent.h b/WickedEngine/DeferredRenderableComponent.h index 5815a5204..f62482af5 100644 --- a/WickedEngine/DeferredRenderableComponent.h +++ b/WickedEngine/DeferredRenderableComponent.h @@ -8,18 +8,18 @@ class DeferredRenderableComponent : protected: wiRenderTarget rtGBuffer, rtDeferred, rtLight; - virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; wiRenderTarget& GetFinalRT(); public: DeferredRenderableComponent(); ~DeferredRenderableComponent(); - virtual void setPreferredThreadingCount(unsigned short value); + virtual void setPreferredThreadingCount(unsigned short value) override; - virtual void Initialize(); - virtual void Load(); - virtual void Start(); - virtual void Render(); + virtual void Initialize() override; + virtual void Load() override; + virtual void Start() override; + virtual void Render() override; }; diff --git a/WickedEngine/ForwardRenderableComponent.h b/WickedEngine/ForwardRenderableComponent.h index 052fcfc95..8358764c4 100644 --- a/WickedEngine/ForwardRenderableComponent.h +++ b/WickedEngine/ForwardRenderableComponent.h @@ -8,16 +8,16 @@ class ForwardRenderableComponent : protected: wiRenderTarget rtMain; - virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; public: ForwardRenderableComponent(); ~ForwardRenderableComponent(); - virtual void setPreferredThreadingCount(unsigned short value); + virtual void setPreferredThreadingCount(unsigned short value) override; - virtual void Initialize(); - virtual void Load(); - virtual void Start(); - virtual void Render(); + virtual void Initialize() override; + virtual void Load() override; + virtual void Start() override; + virtual void Render() override; }; diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index c3a0117a9..5206fd0a0 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -101,6 +101,8 @@ void MainComponent::run() Update(); } + getActiveComponent()->FixedUpdate(elapsedTime); + Render(); wiRenderer::Present(bind(&MainComponent::Compose, this)); diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index 9c640ef32..e3d34104f 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -11,8 +11,6 @@ using namespace wiGraphicsTypes; Renderable3DComponent::Renderable3DComponent() { - _needToUpdateRenderData.store(true); - Renderable2DComponent(); } Renderable3DComponent::~Renderable3DComponent() @@ -180,15 +178,17 @@ void Renderable3DComponent::Start() void Renderable3DComponent::Update(){ wiRenderer::Update(); - wiRenderer::SychronizeWithPhysicsEngine(); wiRenderer::UpdateImages(); - _needToUpdateRenderData.store(true); - - Renderable2DComponent::Update(); } +void Renderable3DComponent::FixedUpdate(float dt) { + wiRenderer::SynchronizeWithPhysicsEngine(dt); + + Renderable2DComponent::FixedUpdate(dt); +} + void Renderable3DComponent::Compose(){ RenderableComponent::Compose(); @@ -199,14 +199,7 @@ void Renderable3DComponent::Compose(){ void Renderable3DComponent::RenderFrameSetUp(GRAPHICSTHREAD threadID) { - if (!_needToUpdateRenderData.load()) - { - return; - } - wiRenderer::UpdateRenderData(threadID); - - _needToUpdateRenderData.store(false); } void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) { diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index 8194c76ef..f853a2f83 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -9,8 +9,6 @@ class Renderable3DComponent : public Renderable2DComponent { private: - atomic_bool _needToUpdateRenderData; - float lightShaftQuality; float bloomDownSample; float bloomStren; @@ -153,10 +151,11 @@ public: Renderable3DComponent(); ~Renderable3DComponent(); - virtual void Initialize(); - virtual void Load(); - virtual void Start(); - virtual void Update(); - virtual void Compose(); + virtual void Initialize() override; + virtual void Load() override; + virtual void Start() override; + virtual void Update() override; + virtual void FixedUpdate(float dt) override; + virtual void Compose() override; }; diff --git a/WickedEngine/RenderableComponent.h b/WickedEngine/RenderableComponent.h index b7d3dd370..f2e2abc68 100644 --- a/WickedEngine/RenderableComponent.h +++ b/WickedEngine/RenderableComponent.h @@ -17,23 +17,25 @@ public: RenderableComponent(){} ~RenderableComponent(){} - //initialize component - virtual void Initialize(){}; - //load (graphics) resources - virtual void Load(){}; - //delete resources - virtual void Unload(){}; - //start component, load temporary resources + // initialize component + virtual void Initialize() {} + // load (graphics) resources + virtual void Load() {} + // delete resources + virtual void Unload() {} + // start component, load temporary resources virtual void Start(); - //unload temporary resources + // unload temporary resources virtual void Stop(); - //update logic - virtual void Update(){}; - //Render to layers, rendertargets, etc - //This will be rendered offscreen - virtual void Render(){}; - //Compose the rendered layers (for example blend the layers together as Images) - //This will be rendered to the backbuffer - virtual void Compose(){}; + // update logic + virtual void Update() {} + // update physics + virtual void FixedUpdate(float dt) {} + // Render to layers, rendertargets, etc + // This will be rendered offscreen + virtual void Render() {} + // Compose the rendered layers (for example blend the layers together as Images) + // This will be rendered to the backbuffer + virtual void Compose() {} }; diff --git a/WickedEngine/wiBULLET.cpp b/WickedEngine/wiBULLET.cpp index d17b1d4e5..fcfa1e974 100644 --- a/WickedEngine/wiBULLET.cpp +++ b/WickedEngine/wiBULLET.cpp @@ -742,9 +742,9 @@ void wiBULLET::registerObject(Object* object){ } } -void wiBULLET::Update(){ - if(rigidBodyPhysicsEnabled || softBodyPhysicsEnabled) - dynamicsWorld->stepSimulation((1.f/60.f)); +void wiBULLET::Update(float dt){ + if (rigidBodyPhysicsEnabled || softBodyPhysicsEnabled) + dynamicsWorld->stepSimulation(dt, 6); } void wiBULLET::MarkForRead(){ diff --git a/WickedEngine/wiBULLET.h b/WickedEngine/wiBULLET.h index c7bf7b6fd..0e2b618ce 100644 --- a/WickedEngine/wiBULLET.h +++ b/WickedEngine/wiBULLET.h @@ -61,7 +61,7 @@ public: void registerObject(Object* object); - void Update(); + void Update(float dt); void MarkForRead(); void UnMarkForRead(); void MarkForWrite(); diff --git a/WickedEngine/wiGraphicsAPI_DX11.cpp b/WickedEngine/wiGraphicsAPI_DX11.cpp index 10d428f80..e69ed798a 100644 --- a/WickedEngine/wiGraphicsAPI_DX11.cpp +++ b/WickedEngine/wiGraphicsAPI_DX11.cpp @@ -114,6 +114,10 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(Windows::UI::Core::CoreWindow^ window) wiHelper::messageBox("Swap chain creation failed!", "Error!"); exit(1); } + + // Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and + // ensures that the application will only render after each VSync, minimizing power consumption. + hr = pDXGIDevice->SetMaximumFrameLatency(1); #endif DEFERREDCONTEXT_SUPPORT = false; diff --git a/WickedEngine/wiInputManager.cpp b/WickedEngine/wiInputManager.cpp index a706ef09f..301771905 100644 --- a/WickedEngine/wiInputManager.cpp +++ b/WickedEngine/wiInputManager.cpp @@ -12,8 +12,8 @@ wiInputManager::InputCollection wiInputManager::inputs; #define KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code) < 0) #define KEY_TOGGLE(vk_code) ((GetAsyncKeyState(vk_code) & 1) != 0) #else -#define KEY_DOWN(vk_code) (false) -#define KEY_TOGGLE(vk_code) (false) +#define KEY_DOWN(vk_code) ((int)Windows::UI::Core::CoreWindow::GetForCurrentThread()->GetAsyncKeyState((Windows::System::VirtualKey)vk_code) < 0) +#define KEY_TOGGLE(vk_code) (((int)Windows::UI::Core::CoreWindow::GetForCurrentThread()->GetAsyncKeyState((Windows::System::VirtualKey)vk_code) & 1) != 0) #endif //WINSTORE_SUPPORT #define KEY_UP(vk_code) (!KEY_DOWN(vk_code)) @@ -133,8 +133,10 @@ XMFLOAT4 wiInputManager::getpointer() POINT p; GetCursorPos(&p); return XMFLOAT4((float)p.x, (float)p.y, 0, 0); +#else + auto& p = Windows::UI::Core::CoreWindow::GetForCurrentThread()->PointerPosition; + return XMFLOAT4(p.X, p.Y, 0, 0); #endif - return XMFLOAT4(0, 0, 0, 0); } void wiInputManager::setpointer(const XMFLOAT4& props) { @@ -149,3 +151,41 @@ void wiInputManager::hidepointer(bool value) #endif } + +#ifdef WINSTORE_SUPPORT +using namespace Windows::ApplicationModel; +using namespace Windows::ApplicationModel::Core; +using namespace Windows::ApplicationModel::Activation; +using namespace Windows::UI::Core; +using namespace Windows::UI::Input; +using namespace Windows::System; +using namespace Windows::Foundation; + +void _OnPointerPressed(CoreWindow^ window, PointerEventArgs^ pointer) +{ + auto p = pointer->CurrentPoint; +} +void _OnPointerReleased(CoreWindow^ window, PointerEventArgs^ pointer) +{ + auto p = pointer->CurrentPoint; +} +void _OnPointerMoved(CoreWindow^ window, PointerEventArgs^ pointer) +{ + auto p = pointer->CurrentPoint; +} +#endif // WINSTORE_SUPPORT + +wiInputManager::Touch wiInputManager::touch() +{ + static bool isRegisteredTouch = false; + if (!isRegisteredTouch) + { +#ifdef WINSTORE_SUPPORT + auto window = CoreWindow::GetForCurrentThread(); + + window->PointerPressed += ref new TypedEventHandler(_OnPointerPressed); + window->PointerReleased += ref new TypedEventHandler(_OnPointerReleased); + window->PointerMoved += ref new TypedEventHandler(_OnPointerMoved); +#endif // WINSTORE_SUPPORT + } +} diff --git a/WickedEngine/wiInputManager.h b/WickedEngine/wiInputManager.h index f65e4af2b..0cd9b4f59 100644 --- a/WickedEngine/wiInputManager.h +++ b/WickedEngine/wiInputManager.h @@ -61,5 +61,23 @@ public: //hide pointer static void hidepointer(bool value); + struct Touch + { + enum TouchState + { + TOUCHSTATE_PRESSED, + TOUCHSTATE_RELEASED, + TOUCHSTATE_MOVED, + TOUCHSTATE_COUNT, + } state; + // current position of touch + XMFLOAT2 pos; + // velocity of swipe + XMFLOAT2 delta; + // true if two touches occured in a rapid succession in the same spot + bool doubleClick; + }; + static Touch touch(); + }; diff --git a/WickedEngine/wiPHYSICS.h b/WickedEngine/wiPHYSICS.h index 7994b5bd4..8ca9819e7 100644 --- a/WickedEngine/wiPHYSICS.h +++ b/WickedEngine/wiPHYSICS.h @@ -31,7 +31,7 @@ public: void NextRunWorld(){firstRunWorld=false;} int getObjectCount(){return registeredObjects+1;} - virtual void Update()=0; + virtual void Update(float dt)=0; virtual void MarkForRead()=0; virtual void UnMarkForRead()=0; virtual void MarkForWrite()=0; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 06a27418c..13598051a 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -3240,7 +3240,7 @@ Scene& wiRenderer::GetScene() return *scene; } -void wiRenderer::SychronizeWithPhysicsEngine() +void wiRenderer::SynchronizeWithPhysicsEngine(float dt) { if (physicsEngine && GetGameSpeed()){ @@ -3285,7 +3285,7 @@ void wiRenderer::SychronizeWithPhysicsEngine() } } - physicsEngine->Update(); + physicsEngine->Update(dt); for (Model* model : GetScene().models) { diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index e1d327573..36e554d77 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -442,7 +442,7 @@ public: static void CalculateVertexAO(Object* object); static PHYSICS* physicsEngine; - static void SychronizeWithPhysicsEngine(); + static void SynchronizeWithPhysicsEngine(float dt = 1.0f / 60.0f); static Model* LoadModel(const string& dir, const string& name, const XMMATRIX& transform = XMMatrixIdentity(), const string& ident = "common"); static void LoadWorldInfo(const string& dir, const string& name);