From 8c21ec935270d8ffb434e3ba2bcbeb2e7fa914ac Mon Sep 17 00:00:00 2001 From: turanszkij Date: Mon, 19 Nov 2018 19:04:42 +0000 Subject: [PATCH] resurrected wiImage drawrect; added sprite test; refactors; --- Editor/Editor.cpp | 16 +-- Tests/Tests.cpp | 79 +++++++---- Tests/Tests.h | 1 + Tests/images/effect.png | Bin 0 -> 34221 bytes WickedEngine/RenderPath2D.cpp | 2 +- WickedEngine/RenderPath3D.cpp | 30 ++--- WickedEngine/RenderPath3D_Deferred.cpp | 6 +- WickedEngine/RenderPath3D_Forward.cpp | 2 +- WickedEngine/RenderPath3D_PathTracing.cpp | 2 +- WickedEngine/RenderPath3D_TiledDeferred.cpp | 6 +- WickedEngine/RenderPath3D_TiledForward.cpp | 2 +- WickedEngine/wiBackLog.cpp | 8 +- WickedEngine/wiFont.cpp | 36 ++--- WickedEngine/wiFont.h | 6 +- WickedEngine/wiFont_BindLua.cpp | 24 ++-- WickedEngine/wiImage.cpp | 39 ++++-- WickedEngine/wiImage.h | 56 ++++++-- WickedEngine/wiImageParams_BindLua.cpp | 28 ++-- WickedEngine/wiImageParams_BindLua.h | 4 +- WickedEngine/wiRenderer.cpp | 18 +-- WickedEngine/wiSprite.cpp | 142 +++++++++++--------- WickedEngine/wiSprite.h | 2 +- WickedEngine/wiSprite_BindLua.cpp | 8 +- WickedEngine/wiVersion.cpp | 2 +- WickedEngine/wiWidget.cpp | 6 +- 25 files changed, 305 insertions(+), 220 deletions(-) create mode 100644 Tests/images/effect.png diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index f833bd0bb..9c5072610 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -76,20 +76,20 @@ void EditorLoadingScreen::Load() sprite = wiSprite("../logo/logo_small.png"); sprite.anim.opa = 0.02f; sprite.anim.repeatable = true; - sprite.effects.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth()*0.5f, wiRenderer::GetDevice()->GetScreenHeight()*0.5f - font.textHeight(), 0); - sprite.effects.siz = XMFLOAT2(128, 128); - sprite.effects.pivot = XMFLOAT2(0.5f, 1.0f); - sprite.effects.quality = QUALITY_BILINEAR; - sprite.effects.blendFlag = BLENDMODE_ALPHA; + sprite.params.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth()*0.5f, wiRenderer::GetDevice()->GetScreenHeight()*0.5f - font.textHeight(), 0); + sprite.params.siz = XMFLOAT2(128, 128); + sprite.params.pivot = XMFLOAT2(0.5f, 1.0f); + sprite.params.quality = QUALITY_BILINEAR; + sprite.params.blendFlag = BLENDMODE_ALPHA; addSprite(&sprite); __super::Load(); } void EditorLoadingScreen::Compose() { - font.props.posX = (int)(wiRenderer::GetDevice()->GetScreenWidth()*0.5f); - font.props.posY = (int)(wiRenderer::GetDevice()->GetScreenHeight()*0.5f); - sprite.effects.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth()*0.5f, wiRenderer::GetDevice()->GetScreenHeight()*0.5f - font.textHeight(), 0); + font.params.posX = (int)(wiRenderer::GetDevice()->GetScreenWidth()*0.5f); + font.params.posY = (int)(wiRenderer::GetDevice()->GetScreenHeight()*0.5f); + sprite.params.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth()*0.5f, wiRenderer::GetDevice()->GetScreenHeight()*0.5f - font.textHeight(), 0); __super::Compose(); } diff --git a/Tests/Tests.cpp b/Tests/Tests.cpp index 087560994..406348222 100644 --- a/Tests/Tests.cpp +++ b/Tests/Tests.cpp @@ -105,6 +105,7 @@ TestsRenderer::TestsRenderer() testSelector->AddItem("Job System Test"); testSelector->AddItem("Font Test"); testSelector->AddItem("Volumetric Test"); + testSelector->AddItem("Sprite Test"); testSelector->SetMaxVisibleItemCount(100); testSelector->OnSelect([=](wiEventArgs args) { @@ -130,9 +131,9 @@ TestsRenderer::TestsRenderer() { static wiSprite sprite; sprite = wiSprite("images/HelloWorld.png"); - sprite.effects.pos = XMFLOAT3(screenW / 2, screenH / 2, 0); - sprite.effects.siz = XMFLOAT2(200, 100); - sprite.effects.pivot = XMFLOAT2(0.5f, 0.5f); + sprite.params.pos = XMFLOAT3(screenW / 2, screenH / 2, 0); + sprite.params.siz = XMFLOAT2(200, 100); + sprite.params.pivot = XMFLOAT2(0.5f, 0.5f); sprite.anim.rot = XM_PI / 400.0f; this->addSprite(&sprite); break; @@ -179,6 +180,9 @@ TestsRenderer::TestsRenderer() wiRenderer::SetTemporalAAEnabled(true); wiRenderer::LoadModel("../models/volumetric_test.wiscene", XMMatrixTranslation(0, 0, 4)); break; + case 13: + RunSpriteTest(); + break; default: assert(0); break; @@ -233,11 +237,11 @@ void TestsRenderer::RunJobSystemTest() static wiFont font; font = wiFont(ss.str()); - font.props.posX = wiRenderer::GetDevice()->GetScreenWidth() / 2; - font.props.posY = wiRenderer::GetDevice()->GetScreenHeight() / 2; - font.props.h_align = WIFALIGN_CENTER; - font.props.v_align = WIFALIGN_CENTER; - font.props.size = 24; + font.params.posX = wiRenderer::GetDevice()->GetScreenWidth() / 2; + font.params.posY = wiRenderer::GetDevice()->GetScreenHeight() / 2; + font.params.h_align = WIFALIGN_CENTER; + font.params.v_align = WIFALIGN_CENTER; + font.params.size = 24; this->addFont(&font); } void TestsRenderer::RunFontTest() @@ -248,35 +252,35 @@ void TestsRenderer::RunFontTest() font.SetText("This is Arial, size 32 wiFont"); font_upscaled.SetText("This is Arial, size 14 wiFont, but upscaled to 32"); - font.props.posX = wiRenderer::GetDevice()->GetScreenWidth() / 2; - font.props.posY = wiRenderer::GetDevice()->GetScreenHeight() / 6; - font.props.size = 32; + font.params.posX = wiRenderer::GetDevice()->GetScreenWidth() / 2; + font.params.posY = wiRenderer::GetDevice()->GetScreenHeight() / 6; + font.params.size = 32; - font_upscaled.props = font.props; - font_upscaled.props.posY += font.textHeight() + 10; + font_upscaled.params = font.params; + font_upscaled.params.posY += font.textHeight() + 10; font.style = wiFont::AddFontStyle(wiFont::GetFontPath() + "arial.ttf"); font_upscaled.style = wiFont::AddFontStyle(wiFont::GetFontPath() + "arial.ttf"); - font_upscaled.props.size = 14; - font_upscaled.props.scaling = 32.0f / 14.0f; + font_upscaled.params.size = 14; + font_upscaled.params.scaling = 32.0f / 14.0f; addFont(&font); addFont(&font_upscaled); static wiFont font_aligned; font_aligned = font; - font_aligned.props.posY += font.textHeight() * 2; - font_aligned.props.size = 38; - font_aligned.props.shadowColor = wiColor::Red(); - font_aligned.props.h_align = WIFALIGN_CENTER; + font_aligned.params.posY += font.textHeight() * 2; + font_aligned.params.size = 38; + font_aligned.params.shadowColor = wiColor::Red(); + font_aligned.params.h_align = WIFALIGN_CENTER; font_aligned.SetText("Center aligned, red shadow, bigger"); addFont(&font_aligned); static wiFont font_aligned2; font_aligned2 = font_aligned; - font_aligned2.props.posY += font_aligned.textHeight() + 10; - font_aligned2.props.shadowColor = wiColor::Purple(); - font_aligned2.props.h_align = WIFALIGN_RIGHT; + font_aligned2.params.posY += font_aligned.textHeight() + 10; + font_aligned2.params.shadowColor = wiColor::Purple(); + font_aligned2.params.h_align = WIFALIGN_RIGHT; font_aligned2.SetText("Right aligned, purple shadow"); addFont(&font_aligned2); @@ -293,11 +297,34 @@ void TestsRenderer::RunFontTest() } static wiFont font_japanese; font_japanese = font_aligned2; - font_japanese.props.posY += font_aligned2.textHeight(); + font_japanese.params.posY += font_aligned2.textHeight(); font_japanese.style = wiFont::AddFontStyle("yumin.ttf"); - font_japanese.props.shadowColor = wiColor::Transparent(); - font_japanese.props.h_align = WIFALIGN_CENTER; - font_japanese.props.size = 34; + font_japanese.params.shadowColor = wiColor::Transparent(); + font_japanese.params.h_align = WIFALIGN_CENTER; + font_japanese.params.size = 34; font_japanese.SetText(ss.str()); addFont(&font_japanese); + + static wiFont font_colored; + font_colored.params.color = wiColor::Cyan(); + font_colored.params.h_align = WIFALIGN_CENTER; + font_colored.params.v_align = WIFALIGN_TOP; + font_colored.params.size = 26; + font_colored.params.posX = wiRenderer::GetDevice()->GetScreenWidth() / 2; + font_colored.params.posY = font_japanese.params.posY + font_japanese.textHeight(); + font_colored.SetText("Colored font"); + addFont(&font_colored); +} +void TestsRenderer::RunSpriteTest() +{ + static wiSprite sprite("images/effect.png"); + sprite.params.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth() * 0.5f, wiRenderer::GetDevice()->GetScreenHeight() * 0.5f, 0); + sprite.params.siz = XMFLOAT2(200, 200); + sprite.params.pivot = XMFLOAT2(0.5f, 0.5f); + sprite.params.enableDrawRect(XMFLOAT4(0, 0, 128, 128)); + sprite.params.sampleFlag = SAMPLEMODE_WRAP; + sprite.anim.drawRecAnim.frameCount = 8; + sprite.anim.drawRecAnim.jumpX = 1; + sprite.anim.drawRecAnim.onFrameChangeWait = 4; + addSprite(&sprite); } diff --git a/Tests/Tests.h b/Tests/Tests.h index 9a4e07a89..c0b843c7b 100644 --- a/Tests/Tests.h +++ b/Tests/Tests.h @@ -20,5 +20,6 @@ public: void RunJobSystemTest(); void RunFontTest(); + void RunSpriteTest(); }; diff --git a/Tests/images/effect.png b/Tests/images/effect.png new file mode 100644 index 0000000000000000000000000000000000000000..433a0f010ed233ae05c87d091fc51601bfce06bb GIT binary patch literal 34221 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 K_2SF6A^#u!=n?b) literal 0 HcmV?d00001 diff --git a/WickedEngine/RenderPath2D.cpp b/WickedEngine/RenderPath2D.cpp index 289852e0b..f8d252872 100644 --- a/WickedEngine/RenderPath2D.cpp +++ b/WickedEngine/RenderPath2D.cpp @@ -130,7 +130,7 @@ void RenderPath2D::Render() void RenderPath2D::Compose() { wiImageParams fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); - fx.presentFullScreen = true; + fx.enableFullScreen(); fx.blendFlag = BLENDMODE_PREMULTIPLIED; wiImage::Draw(rtFinal.GetTexture(), fx, GRAPHICSTHREAD_IMMEDIATE); diff --git a/WickedEngine/RenderPath3D.cpp b/WickedEngine/RenderPath3D.cpp index 2d08de9b3..d5e7610b3 100644 --- a/WickedEngine/RenderPath3D.cpp +++ b/WickedEngine/RenderPath3D.cpp @@ -312,7 +312,7 @@ void RenderPath3D::RenderShadows(GRAPHICSTHREAD threadID) void RenderPath3D::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) { wiImageParams fx((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y); - fx.hdr = true; + fx.enableHDR(); wiRenderer::GetDevice()->EventBegin("Downsample Depth Buffer", threadID); { @@ -391,7 +391,7 @@ void RenderPath3D::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& wiRenderer::GetDevice()->EventBegin("Refraction Target", threadID); fx.blendFlag = BLENDMODE_OPAQUE; fx.quality = QUALITY_NEAREST; - fx.presentFullScreen = true; + fx.enableFullScreen(); wiImage::Draw(shadedSceneRT.GetTextureResolvedMSAA(threadID), fx, threadID); wiRenderer::GetDevice()->EventEnd(threadID); } @@ -407,7 +407,7 @@ void RenderPath3D::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& wiRenderer::DrawLightVisualizers(wiRenderer::GetCamera(), threadID); - fx.presentFullScreen = true; + fx.enableFullScreen(); if (getEmittedParticlesEnabled()) { wiRenderer::GetDevice()->EventBegin("Contribute Emitters", threadID); @@ -469,7 +469,7 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg wiProfiler::BeginRange("Post Processing", wiProfiler::DOMAIN_GPU, threadID); wiImageParams fx((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y); - fx.hdr = true; + fx.enableHDR(); if (wiRenderer::GetTemporalAAEnabled() && !wiRenderer::GetTemporalAADebugEnabled()) { @@ -480,7 +480,7 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg int history = 1 - current; rtTemporalAA[current].Set(threadID); { wiRenderer::BindGBufferTextures(mainRT.GetTextureResolvedMSAA(threadID, 0), mainRT.GetTextureResolvedMSAA(threadID, 1), nullptr, nullptr, nullptr, threadID); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.setTemporalAAResolve(); fx.setMaskMap(rtTemporalAA[history].GetTexture()); wiImage::Draw(shadedSceneRT.GetTextureResolvedMSAA(threadID), fx, threadID); @@ -489,10 +489,10 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg wiRenderer::GetDevice()->UnbindResources(TEXSLOT_GBUFFER0, 1, threadID); wiRenderer::GetDevice()->UnbindResources(TEXSLOT_ONDEMAND0, 1, threadID); shadedSceneRT.Set(threadID, nullptr, false, 0); { - fx.presentFullScreen = true; + fx.enableFullScreen(); fx.quality = QUALITY_NEAREST; wiImage::Draw(rtTemporalAA[current].GetTexture(), fx, threadID); - fx.presentFullScreen = false; + fx.disableFullScreen(); } wiProfiler::EndRange(threadID); wiRenderer::GetDevice()->EventEnd(threadID); @@ -502,7 +502,7 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg { wiRenderer::GetDevice()->EventBegin("Bloom", threadID); fx.process.clear(); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.quality = QUALITY_BILINEAR; rtBloom[0].Set(threadID); // separate bright parts { @@ -532,10 +532,10 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg shadedSceneRT.Set(threadID, false, 0); { // add to the scene fx.blendFlag = BLENDMODE_ADDITIVE; - fx.presentFullScreen = true; + fx.enableFullScreen(); fx.process.clear(); wiImage::Draw(rtBloom.back().GetTexture(), fx, threadID); - fx.presentFullScreen = false; + fx.disableFullScreen(); } wiRenderer::GetDevice()->EventEnd(threadID); } @@ -545,13 +545,13 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg rtMotionBlur.Set(threadID); fx.process.setMotionBlur(); fx.blendFlag = BLENDMODE_OPAQUE; - fx.presentFullScreen = false; + fx.disableFullScreen(); wiImage::Draw(shadedSceneRT.GetTextureResolvedMSAA(threadID), fx, threadID); fx.process.clear(); wiRenderer::GetDevice()->EventEnd(threadID); } - fx.hdr = false; + fx.disableHDR(); wiRenderer::GetDevice()->EventBegin("Tone Mapping", threadID); fx.blendFlag = BLENDMODE_OPAQUE; @@ -626,7 +626,7 @@ void RenderPath3D::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarg } else { - fx.presentFullScreen = true; + fx.enableFullScreen(); } if (getDepthOfFieldEnabled()) wiImage::Draw(rtDof[2].GetTexture(), fx, threadID); @@ -647,7 +647,7 @@ void RenderPath3D::RenderColorGradedComposition() if (getStereogramEnabled()) { wiRenderer::GetDevice()->EventBegin("Stereogram", GRAPHICSTHREAD_IMMEDIATE); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.clear(); fx.process.setStereogram(); wiImage::Draw(wiTextureHelper::getRandom64x64(), fx, GRAPHICSTHREAD_IMMEDIATE); @@ -671,7 +671,7 @@ void RenderPath3D::RenderColorGradedComposition() else { wiRenderer::GetDevice()->EventBegin("Composition", GRAPHICSTHREAD_IMMEDIATE); - fx.presentFullScreen = true; + fx.enableFullScreen(); } if (getSharpenFilterEnabled()) diff --git a/WickedEngine/RenderPath3D_Deferred.cpp b/WickedEngine/RenderPath3D_Deferred.cpp index 8d6324914..d689e7eb0 100644 --- a/WickedEngine/RenderPath3D_Deferred.cpp +++ b/WickedEngine/RenderPath3D_Deferred.cpp @@ -224,8 +224,8 @@ void RenderPath3D_Deferred::RenderScene(GRAPHICSTHREAD threadID) fx.blendFlag = BLENDMODE_OPAQUE; fx.stencilRef = 0; fx.stencilComp = STENCILMODE_DISABLED; - fx.presentFullScreen = true; - fx.hdr = true; + fx.enableFullScreen(); + fx.enableHDR(); wiImage::Draw(rtLight.GetTexture(0), fx, threadID); fx.stencilRef = STENCILREF_SKIN; fx.stencilComp = STENCILMODE_LESS; @@ -249,7 +249,7 @@ void RenderPath3D_Deferred::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.setSSR(); fx.setMaskMap(nullptr); wiImage::Draw(rtDeferred.GetTexture(), fx, threadID); diff --git a/WickedEngine/RenderPath3D_Forward.cpp b/WickedEngine/RenderPath3D_Forward.cpp index 12f1307ff..36c7cd4b0 100644 --- a/WickedEngine/RenderPath3D_Forward.cpp +++ b/WickedEngine/RenderPath3D_Forward.cpp @@ -151,7 +151,7 @@ void RenderPath3D_Forward::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.setSSR(); fx.setMaskMap(nullptr); wiImage::Draw(rtMain.GetTexture(), fx, threadID); diff --git a/WickedEngine/RenderPath3D_PathTracing.cpp b/WickedEngine/RenderPath3D_PathTracing.cpp index a15775400..d253cdc50 100644 --- a/WickedEngine/RenderPath3D_PathTracing.cpp +++ b/WickedEngine/RenderPath3D_PathTracing.cpp @@ -146,7 +146,7 @@ void RenderPath3D_PathTracing::RenderScene(GRAPHICSTHREAD threadID) wiImageParams fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); - fx.hdr = true; + fx.enableHDR(); // Accumulate with moving averaged blending: diff --git a/WickedEngine/RenderPath3D_TiledDeferred.cpp b/WickedEngine/RenderPath3D_TiledDeferred.cpp index fa741c4ef..bdc062d67 100644 --- a/WickedEngine/RenderPath3D_TiledDeferred.cpp +++ b/WickedEngine/RenderPath3D_TiledDeferred.cpp @@ -152,8 +152,8 @@ void RenderPath3D_TiledDeferred::RenderScene(GRAPHICSTHREAD threadID) fx.blendFlag = BLENDMODE_OPAQUE; fx.stencilRef = 0; fx.stencilComp = STENCILMODE_DISABLED; - fx.presentFullScreen = true; - fx.hdr = true; + fx.enableFullScreen(); + fx.enableHDR(); wiImage::Draw(static_cast(wiRenderer::GetTexture(TEXTYPE_2D_TILEDDEFERRED_DIFFUSEUAV)), fx, threadID); fx.stencilRef = STENCILREF_SKIN; fx.stencilComp = STENCILMODE_LESS; @@ -178,7 +178,7 @@ void RenderPath3D_TiledDeferred::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.setSSR(); fx.setMaskMap(nullptr); wiImage::Draw(rtDeferred.GetTexture(), fx, threadID); diff --git a/WickedEngine/RenderPath3D_TiledForward.cpp b/WickedEngine/RenderPath3D_TiledForward.cpp index c147aac97..30a599fea 100644 --- a/WickedEngine/RenderPath3D_TiledForward.cpp +++ b/WickedEngine/RenderPath3D_TiledForward.cpp @@ -101,7 +101,7 @@ void RenderPath3D_TiledForward::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); - fx.presentFullScreen = false; + fx.disableFullScreen(); fx.process.setSSR(); fx.setMaskMap(nullptr); wiImage::Draw(rtMain.GetTexture(), fx, threadID); diff --git a/WickedEngine/wiBackLog.cpp b/WickedEngine/wiBackLog.cpp index 71bd4f925..ca34ff439 100644 --- a/WickedEngine/wiBackLog.cpp +++ b/WickedEngine/wiBackLog.cpp @@ -95,8 +95,8 @@ namespace wiBackLog fx.opacity = wiMath::Lerp(1, 0, -pos / wiRenderer::GetDevice()->GetScreenHeight()); wiImage::Draw(backgroundTex, fx, GRAPHICSTHREAD_IMMEDIATE); font.SetText(getText()); - font.props.posX = 50; - font.props.posY = (int)pos + (int)scroll; + font.params.posX = 50; + font.params.posY = (int)pos + (int)scroll; font.Draw(GRAPHICSTHREAD_IMMEDIATE); wiFont(inputArea.str().c_str(), wiFontParams(10, wiRenderer::GetDevice()->GetScreenHeight() - 10, WIFONTSIZE_DEFAULT, WIFALIGN_LEFT, WIFALIGN_BOTTOM)).Draw(GRAPHICSTHREAD_IMMEDIATE); } @@ -186,11 +186,11 @@ namespace wiBackLog } void setFontSize(int value) { - font.props.size = value; + font.params.size = value; } void setFontRowspacing(int value) { - font.props.spacingY = value; + font.params.spacingY = value; } bool isActive() { return state == IDLE; } diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index babd7b8dc..957b13235 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -22,9 +22,9 @@ using namespace wiGraphicsTypes; using namespace wiRectPacker; #define MAX_TEXT 10000 -#define WHITESPACE_SIZE (int((props.size + props.spacingX) * props.scaling * 0.3f)) +#define WHITESPACE_SIZE (int((params.size + params.spacingX) * params.scaling * 0.3f)) #define TAB_SIZE (WHITESPACE_SIZE * 4) -#define LINEBREAK_SIZE (int((props.size + props.spacingY) * props.scaling)) +#define LINEBREAK_SIZE (int((params.size + params.spacingY) * params.scaling)) namespace wiFont_Internal { @@ -100,7 +100,7 @@ namespace wiFont_Internal XMHALF2 Tex; }; - int WriteVertices(volatile FontVertex* vertexList, const std::wstring& text, wiFontParams props, int style) + int WriteVertices(volatile FontVertex* vertexList, const std::wstring& text, wiFontParams params, int style) { int quadCount = 0; @@ -108,7 +108,7 @@ namespace wiFont_Internal int16_t pos = 0; for (auto& code : text) { - const int32_t hash = glyphhash(code, style, props.size); + const int32_t hash = glyphhash(code, style, params.size); if (glyph_lookup.count(hash) == 0) { @@ -135,10 +135,10 @@ namespace wiFont_Internal else { const Glyph& glyph = glyph_lookup.at(hash); - const int16_t glyphWidth = int16_t(glyph.width * props.scaling); - const int16_t glyphHeight = int16_t(glyph.height * props.scaling); - const int16_t glyphOffsetX = int16_t(glyph.x * props.scaling); - const int16_t glyphOffsetY = int16_t(glyph.y * props.scaling); + const int16_t glyphWidth = int16_t(glyph.width * params.scaling); + const int16_t glyphHeight = int16_t(glyph.height * params.scaling); + const int16_t glyphOffsetX = int16_t(glyph.x * params.scaling); + const int16_t glyphOffsetY = int16_t(glyph.y * params.scaling); const size_t vertexID = quadCount * 4; @@ -165,7 +165,7 @@ namespace wiFont_Internal vertexList[vertexID + 3].Tex.x = glyph.tc_right; vertexList[vertexID + 3].Tex.y = glyph.tc_bottom; - pos += int16_t((glyph.width + props.spacingX) * props.scaling); + pos += int16_t((glyph.width + params.spacingX) * params.scaling); quadCount++; } @@ -179,11 +179,11 @@ namespace wiFont_Internal using namespace wiFont_Internal; -wiFont::wiFont(const std::string& text, wiFontParams props, int style) : props(props), style(style) +wiFont::wiFont(const std::string& text, wiFontParams params, int style) : params(params), style(style) { SetText(text); } -wiFont::wiFont(const std::wstring& text, wiFontParams props, int style) : props(props), style(style) +wiFont::wiFont(const std::wstring& text, wiFontParams params, int style) : params(params), style(style) { SetText(text); } @@ -496,15 +496,15 @@ void wiFont::Draw(GRAPHICSTHREAD threadID) return; } - wiFontParams newProps = props; + wiFontParams newProps = params; - if (props.h_align == WIFALIGN_CENTER) + if (params.h_align == WIFALIGN_CENTER) newProps.posX -= textWidth() / 2; - else if (props.h_align == WIFALIGN_RIGHT) + else if (params.h_align == WIFALIGN_RIGHT) newProps.posX -= textWidth(); - if (props.v_align == WIFALIGN_CENTER) + if (params.v_align == WIFALIGN_CENTER) newProps.posY -= textHeight() / 2; - else if (props.v_align == WIFALIGN_BOTTOM) + else if (params.v_align == WIFALIGN_BOTTOM) newProps.posY -= textHeight(); @@ -579,7 +579,7 @@ int wiFont::textWidth() int currentLineWidth = 0; for (auto& code : text) { - const int32_t hash = glyphhash(code, style, props.size); + const int32_t hash = glyphhash(code, style, params.size); if (glyph_lookup.count(hash) == 0) { @@ -602,7 +602,7 @@ int wiFont::textWidth() else { const Glyph& glyph = glyph_lookup.at(hash); - currentLineWidth += int((glyph.width + props.spacingX) * props.scaling); + currentLineWidth += int((glyph.width + params.spacingX) * params.scaling); } maxWidth = max(maxWidth, currentLineWidth); } diff --git a/WickedEngine/wiFont.h b/WickedEngine/wiFont.h index a77e844dc..f0593d3b3 100644 --- a/WickedEngine/wiFont.h +++ b/WickedEngine/wiFont.h @@ -49,11 +49,11 @@ public: static int AddFontStyle(const std::string& fontName); std::wstring text; - wiFontParams props; + wiFontParams params; int style; - wiFont(const std::string& text = "", wiFontParams props = wiFontParams(), int style = 0); - wiFont(const std::wstring& text, wiFontParams props = wiFontParams(), int style = 0); + wiFont(const std::string& text = "", wiFontParams params = wiFontParams(), int style = 0); + wiFont(const std::wstring& text, wiFontParams params = wiFontParams(), int style = 0); ~wiFont(); void Draw(GRAPHICSTHREAD threadID); diff --git a/WickedEngine/wiFont_BindLua.cpp b/WickedEngine/wiFont_BindLua.cpp index 18edf9675..a98548d2c 100644 --- a/WickedEngine/wiFont_BindLua.cpp +++ b/WickedEngine/wiFont_BindLua.cpp @@ -79,7 +79,7 @@ int wiFont_BindLua::SetSize(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - font->props.size = wiLua::SGetInt(L, 1); + font->params.size = wiLua::SGetInt(L, 1); } else wiLua::SError(L, "SetSize(int size) not enough arguments!"); @@ -93,8 +93,8 @@ int wiFont_BindLua::SetPos(lua_State* L) Vector_BindLua* param = Luna::lightcheck(L, 1); if (param != nullptr) { - font->props.posX = (int)XMVectorGetX(param->vector); - font->props.posY = (int)XMVectorGetY(param->vector); + font->params.posX = (int)XMVectorGetX(param->vector); + font->params.posY = (int)XMVectorGetY(param->vector); } else wiLua::SError(L, "SetPos(Vector pos) argument is not a vector!"); @@ -111,8 +111,8 @@ int wiFont_BindLua::SetSpacing(lua_State* L) Vector_BindLua* param = Luna::lightcheck(L, 1); if (param != nullptr) { - font->props.spacingX = (int)XMVectorGetX(param->vector); - font->props.spacingY = (int)XMVectorGetY(param->vector); + font->params.spacingX = (int)XMVectorGetX(param->vector); + font->params.spacingY = (int)XMVectorGetY(param->vector); } else wiLua::SError(L, "SetSpacing(Vector spacing) argument is not a vector!"); @@ -126,10 +126,10 @@ int wiFont_BindLua::SetAlign(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - font->props.h_align = (wiFontAlign)wiLua::SGetInt(L, 1); + font->params.h_align = (wiFontAlign)wiLua::SGetInt(L, 1); if (argc > 1) { - font->props.v_align = (wiFontAlign)wiLua::SGetInt(L, 2); + font->params.v_align = (wiFontAlign)wiLua::SGetInt(L, 2); } } else @@ -144,23 +144,23 @@ int wiFont_BindLua::GetText(lua_State* L) } int wiFont_BindLua::GetSize(lua_State* L) { - wiLua::SSetInt(L, font->props.size); + wiLua::SSetInt(L, font->params.size); return 1; } int wiFont_BindLua::GetPos(lua_State* L) { - Luna::push(L, new Vector_BindLua(XMVectorSet((float)font->props.posX, (float)font->props.posY, 0, 0))); + Luna::push(L, new Vector_BindLua(XMVectorSet((float)font->params.posX, (float)font->params.posY, 0, 0))); return 1; } int wiFont_BindLua::GetSpacing(lua_State* L) { - Luna::push(L, new Vector_BindLua(XMVectorSet((float)font->props.spacingX, (float)font->props.spacingY, 0, 0))); + Luna::push(L, new Vector_BindLua(XMVectorSet((float)font->params.spacingX, (float)font->params.spacingY, 0, 0))); return 1; } int wiFont_BindLua::GetAlign(lua_State* L) { - wiLua::SSetInt(L, font->props.h_align); - wiLua::SSetInt(L, font->props.v_align); + wiLua::SSetInt(L, font->params.h_align); + wiLua::SSetInt(L, font->params.v_align); return 2; } diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index 579064864..1bce33d69 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -96,16 +96,16 @@ namespace wiImage device->BindSampler(PS, wiRenderer::GetSampler(SSLOT_ANISO_CLAMP), SSLOT_ONDEMAND0, threadID); } - if (params.presentFullScreen) + if (params.isFullScreenEnabled()) { - device->BindGraphicsPSO(&imagePSO[IMAGE_SHADER_FULLSCREEN][params.blendFlag][params.stencilComp][params.hdr], threadID); + device->BindGraphicsPSO(&imagePSO[IMAGE_SHADER_FULLSCREEN][params.blendFlag][params.stencilComp][params.isHDREnabled()], threadID); device->Draw(3, 0, threadID); device->EventEnd(threadID); return; } - if (!params.process.isActive()) // not post process, ust regular image + if (!params.process.isActive()) // not post process, just regular image { ImageCB cb; if (params.typeFlag == SCREEN) @@ -151,24 +151,39 @@ namespace wiImage )); } - // todo: params.drawRec -> texmuladd! - cb.xTexMulAdd = XMFLOAT4(1, 1, params.texOffset.x, params.texOffset.y); + const TextureDesc& desc = texture->GetDesc(); + const float inv_width = 1.0f / float(desc.Width); + const float inv_height = 1.0f / float(desc.Height); + + if (params.isDrawRectEnabled()) + { + cb.xTexMulAdd.x = params.drawRect.z * inv_width; // drawRec.width: mul + cb.xTexMulAdd.y = params.drawRect.w * inv_height; // drawRec.heigh: mul + cb.xTexMulAdd.z = params.drawRect.x * inv_width; // drawRec.x: add + cb.xTexMulAdd.w = params.drawRect.y * inv_height; // drawRec.y: add + } + else + { + cb.xTexMulAdd = XMFLOAT4(1, 1, 0, 0); // disabled draw rect + } + cb.xTexMulAdd.z += params.texOffset.x * inv_width; // texOffset.x: add + cb.xTexMulAdd.w += params.texOffset.y * inv_height; // texOffset.y: add cb.xColor = params.col; - cb.xColor.x *= 1 - params.fade; - cb.xColor.y *= 1 - params.fade; - cb.xColor.z *= 1 - params.fade; + const float darken = 1 - params.fade; + cb.xColor.x *= darken; + cb.xColor.y *= darken; + cb.xColor.z *= darken; cb.xColor.w *= params.opacity; cb.xPivot = params.pivot; - cb.xMirror = params.mirror; - cb.xPivot = params.pivot; + cb.xMirror = params.isMirrorEnabled() ? 1 : 0; cb.xMipLevel = params.mipLevel; device->UpdateBuffer(&constantBuffer, &cb, threadID); // Determine relevant image rendering pixel shader: IMAGE_SHADER targetShader; - bool NormalmapSeparate = params.extractNormalMap; + bool NormalmapSeparate = params.isExtractNormalMapEnabled(); bool Mask = params.maskMap != nullptr; bool Distort = params.distortionMap != nullptr; if (NormalmapSeparate) @@ -198,7 +213,7 @@ namespace wiImage } } - device->BindGraphicsPSO(&imagePSO[targetShader][params.blendFlag][params.stencilComp][params.hdr], threadID); + device->BindGraphicsPSO(&imagePSO[targetShader][params.blendFlag][params.stencilComp][params.isHDREnabled()], threadID); fullScreenEffect = false; } diff --git a/WickedEngine/wiImage.h b/WickedEngine/wiImage.h index 00b7128bb..66f733336 100644 --- a/WickedEngine/wiImage.h +++ b/WickedEngine/wiImage.h @@ -48,25 +48,32 @@ enum ImageType struct wiImageParams { + enum FLAGS + { + EMPTY = 0, + DRAWRECT = 1 << 0, + MIRROR = 1 << 1, + EXTRACT_NORMALMAP = 1 << 2, + HDR = 1 << 3, + FULLSCREEN = 1 << 4, + }; + uint32_t _flags = EMPTY; + XMFLOAT3 pos; - float rotation; XMFLOAT2 siz; XMFLOAT2 scale; XMFLOAT4 col; - XMFLOAT4 drawRec; + XMFLOAT4 drawRect; XMFLOAT4 lookAt; //(x,y,z) : direction, (w) :isenabled? XMFLOAT2 texOffset; XMFLOAT2 pivot; // (0,0) : upperleft, (0.5,0.5) : center, (1,1) : bottomright + float rotation; float mipLevel; float fade; float opacity; + UINT stencilRef; STENCILMODE stencilComp; - bool mirror; // horizontal mirroring - bool extractNormalMap; - bool hdr; // is it rendered to HDR render target? - bool presentFullScreen; // don't set anything, just fill the whole screen - BLENDMODE blendFlag; ImageType typeFlag; SAMPLEMODE sampleFlag; @@ -152,23 +159,20 @@ struct wiImageParams void init() { + _flags = EMPTY; pos = XMFLOAT3(0, 0, 0); siz = XMFLOAT2(1, 1); col = XMFLOAT4(1, 1, 1, 1); scale = XMFLOAT2(1, 1); - drawRec = XMFLOAT4(0, 0, 0, 0); + drawRect = XMFLOAT4(0, 0, 0, 0); texOffset = XMFLOAT2(0, 0); lookAt = XMFLOAT4(0, 0, 0, 0); pivot = XMFLOAT2(0, 0); - mirror = false; fade = rotation = 0.0f; opacity = 1.0f; - extractNormalMap = false; - hdr = false; mipLevel = 0.f; stencilRef = 0; stencilComp = STENCILMODE_DISABLED; - presentFullScreen = false; blendFlag = BLENDMODE_ALPHA; typeFlag = SCREEN; sampleFlag = SAMPLEMODE_MIRROR; @@ -178,6 +182,34 @@ struct wiImageParams refractionSource = nullptr; } + constexpr bool isDrawRectEnabled() const { return _flags & DRAWRECT; } + constexpr bool isMirrorEnabled() const { return _flags & MIRROR; } + constexpr bool isExtractNormalMapEnabled() const { return _flags & EXTRACT_NORMALMAP; } + constexpr bool isHDREnabled() const { return _flags & HDR; } + constexpr bool isFullScreenEnabled() const { return _flags & FULLSCREEN; } + + // enables draw rectangle (cutout texture outside draw rectangle) + void enableDrawRect(const XMFLOAT4& rect) { _flags |= DRAWRECT; drawRect = rect; } + // mirror the image horizontally + void enableMirror() { _flags |= MIRROR; } + // enable normal map extraction shader that will perform texcolor * 2 - 1 (preferably onto a signed render target) + void enableExtractNormalMap() { _flags |= EXTRACT_NORMALMAP; } + // enable HDR blending to float render target + void enableHDR() { _flags |= HDR; } + // enable full screen override. It just draws texture onto the full screen, disabling any other setup except sampler and stencil) + void enableFullScreen() { _flags |= FULLSCREEN; } + + // disable draw rectangle (whole texture will be drawn, no cutout) + void disableDrawRect() { _flags &= ~DRAWRECT; } + // disable mirroring + void disableMirror() { _flags &= ~MIRROR; } + // disable normal map extraction shader + void disableExtractNormalMap() { _flags &= ~EXTRACT_NORMALMAP; } + // if you want to render onto normalized render target + void disableHDR() { _flags &= ~HDR; } + // disable full screen override + void disableFullScreen() { _flags &= ~FULLSCREEN; } + wiImageParams() { init(); diff --git a/WickedEngine/wiImageParams_BindLua.cpp b/WickedEngine/wiImageParams_BindLua.cpp index c1d6ce2c8..27c3d704c 100644 --- a/WickedEngine/wiImageParams_BindLua.cpp +++ b/WickedEngine/wiImageParams_BindLua.cpp @@ -24,38 +24,38 @@ Luna::PropertyType wiImageParams_BindLua::properties[] = }; -wiImageParams_BindLua::wiImageParams_BindLua(const wiImageParams& effects) :effects(effects) +wiImageParams_BindLua::wiImageParams_BindLua(const wiImageParams& params) :params(params) { } int wiImageParams_BindLua::GetPos(lua_State* L) { - Luna::push(L, new Vector_BindLua(XMLoadFloat3(&effects.pos))); + Luna::push(L, new Vector_BindLua(XMLoadFloat3(¶ms.pos))); return 1; } int wiImageParams_BindLua::GetSize(lua_State* L) { - Luna::push(L, new Vector_BindLua(XMLoadFloat2(&effects.siz))); + Luna::push(L, new Vector_BindLua(XMLoadFloat2(¶ms.siz))); return 1; } int wiImageParams_BindLua::GetOpacity(lua_State* L) { - wiLua::SSetFloat(L, effects.opacity); + wiLua::SSetFloat(L, params.opacity); return 1; } int wiImageParams_BindLua::GetFade(lua_State* L) { - wiLua::SSetFloat(L, effects.fade); + wiLua::SSetFloat(L, params.fade); return 1; } int wiImageParams_BindLua::GetRotation(lua_State* L) { - wiLua::SSetFloat(L, effects.rotation); + wiLua::SSetFloat(L, params.rotation); return 1; } int wiImageParams_BindLua::GetMipLevel(lua_State* L) { - wiLua::SSetFloat(L, effects.mipLevel); + wiLua::SSetFloat(L, params.mipLevel); return 1; } @@ -67,7 +67,7 @@ int wiImageParams_BindLua::SetPos(lua_State* L) Vector_BindLua* vector = Luna::lightcheck(L, 1); if (vector != nullptr) { - XMStoreFloat3(&effects.pos, vector->vector); + XMStoreFloat3(¶ms.pos, vector->vector); } } else @@ -84,7 +84,7 @@ int wiImageParams_BindLua::SetSize(lua_State* L) Vector_BindLua* vector = Luna::lightcheck(L, 1); if (vector != nullptr) { - XMStoreFloat2(&effects.siz, vector->vector); + XMStoreFloat2(¶ms.siz, vector->vector); } } else @@ -98,7 +98,7 @@ int wiImageParams_BindLua::SetOpacity(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - effects.opacity = wiLua::SGetFloat(L, 1); + params.opacity = wiLua::SGetFloat(L, 1); } else { @@ -111,7 +111,7 @@ int wiImageParams_BindLua::SetFade(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - effects.fade = wiLua::SGetFloat(L, 1); + params.fade = wiLua::SGetFloat(L, 1); } else { @@ -124,7 +124,7 @@ int wiImageParams_BindLua::SetRotation(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - effects.rotation = wiLua::SGetFloat(L, 1); + params.rotation = wiLua::SGetFloat(L, 1); } else { @@ -137,7 +137,7 @@ int wiImageParams_BindLua::SetMipLevel(lua_State* L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - effects.mipLevel = wiLua::SGetFloat(L, 1); + params.mipLevel = wiLua::SGetFloat(L, 1); } else { @@ -170,7 +170,7 @@ wiImageParams_BindLua::wiImageParams_BindLua(lua_State *L) } } } - effects = wiImageParams(x, y, w, h); + params = wiImageParams(x, y, w, h); } wiImageParams_BindLua::~wiImageParams_BindLua() diff --git a/WickedEngine/wiImageParams_BindLua.h b/WickedEngine/wiImageParams_BindLua.h index e54497aaf..d5d9fb70b 100644 --- a/WickedEngine/wiImageParams_BindLua.h +++ b/WickedEngine/wiImageParams_BindLua.h @@ -6,13 +6,13 @@ class wiImageParams_BindLua { public: - wiImageParams effects; + wiImageParams params; static const char className[]; static Luna::FunctionType methods[]; static Luna::PropertyType properties[]; - wiImageParams_BindLua(const wiImageParams& effects); + wiImageParams_BindLua(const wiImageParams& params); wiImageParams_BindLua(lua_State *L); ~wiImageParams_BindLua(); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 57bc2e2dd..410b3e600 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -4131,20 +4131,20 @@ void PutWaterRipple(const std::string& image, const XMFLOAT3& pos) img->anim.fad=0.01f; img->anim.scaleX=0.2f; img->anim.scaleY=0.2f; - img->effects.pos=pos; - img->effects.rotation=(wiRandom::getRandom(0,1000)*0.001f)*2*3.1415f; - img->effects.siz=XMFLOAT2(1,1); - img->effects.typeFlag=WORLD; - img->effects.quality=QUALITY_ANISOTROPIC; - img->effects.pivot = XMFLOAT2(0.5f, 0.5f); - img->effects.lookAt=waterPlane; - img->effects.lookAt.w=1; + img->params.pos=pos; + img->params.rotation=(wiRandom::getRandom(0,1000)*0.001f)*2*3.1415f; + img->params.siz=XMFLOAT2(1,1); + img->params.typeFlag=WORLD; + img->params.quality=QUALITY_ANISOTROPIC; + img->params.pivot = XMFLOAT2(0.5f, 0.5f); + img->params.lookAt=waterPlane; + img->params.lookAt.w=1; waterRipples.push_back(img); } void ManageWaterRipples(){ while( !waterRipples.empty() && - (waterRipples.front()->effects.opacity <= 0 + FLT_EPSILON || waterRipples.front()->effects.fade==1) + (waterRipples.front()->params.opacity <= 0 + FLT_EPSILON || waterRipples.front()->params.fade==1) ) waterRipples.pop_front(); } diff --git a/WickedEngine/wiSprite.cpp b/WickedEngine/wiSprite.cpp index ee7992f7a..e6bee273e 100644 --- a/WickedEngine/wiSprite.cpp +++ b/WickedEngine/wiSprite.cpp @@ -25,106 +25,116 @@ wiSprite::wiSprite(const std::string& newTexture, wiResourceManager* contentHold Init(); CreateReference(newTexture,"",""); } -void wiSprite::Init(){ +void wiSprite::Init() +{ if (ContentHolder == nullptr) { ContentHolder = &wiResourceManager::GetGlobal(); } - texture=""; - mask=""; - normal=""; - name=""; - texturePointer=maskPointer=normalPointer=nullptr; + texture = ""; + mask = ""; + normal = ""; + name = ""; + texturePointer = maskPointer = normalPointer = nullptr; } -void wiSprite::CreateReference(const std::string& newTexture, const std::string& newMask, const std::string& newNormal){ - if(newTexture.length()) { +void wiSprite::CreateReference(const std::string& newTexture, const std::string& newMask, const std::string& newNormal) +{ + if (newTexture.length()) + { texture = newTexture; texturePointer = (Texture2D*)ContentHolder->add(newTexture); } - if(newMask.length()) { + if (newMask.length()) + { maskPointer = (Texture2D*)ContentHolder->add(newMask); - effects.setMaskMap( maskPointer ); + params.setMaskMap(maskPointer); mask = newMask; } - if(newNormal.length()) { + if (newNormal.length()) + { normalPointer = (Texture2D*)ContentHolder->add(newNormal); - //effects.setNormalMap( normalPointer ); normal = newNormal; } } -void wiSprite::CleanUp(){ +void wiSprite::CleanUp() +{ ContentHolder->del(texture); ContentHolder->del(normal); ContentHolder->del(mask); } -void wiSprite::Draw(Texture2D* refracRes, GRAPHICSTHREAD threadID){ - if(effects.opacity>0 && ((effects.blendFlag==BLENDMODE_ADDITIVE && effects.fade<1) || effects.blendFlag!=BLENDMODE_ADDITIVE) ){ - effects.setRefractionSource(refracRes); - wiImage::Draw(texturePointer,effects,threadID); +void wiSprite::Draw(Texture2D* refracRes, GRAPHICSTHREAD threadID) +{ + if(params.opacity>0 && ((params.blendFlag==BLENDMODE_ADDITIVE && params.fade<1) || params.blendFlag!=BLENDMODE_ADDITIVE) ) + { + params.setRefractionSource(refracRes); + wiImage::Draw(texturePointer,params,threadID); } } -void wiSprite::Draw(GRAPHICSTHREAD threadID){ +void wiSprite::Draw(GRAPHICSTHREAD threadID) +{ wiSprite::Draw(nullptr, threadID); } -void wiSprite::DrawNormal(GRAPHICSTHREAD threadID){ - if(normalPointer && effects.opacity>0 && ((effects.blendFlag==BLENDMODE_ADDITIVE && effects.fade<1) || effects.blendFlag!=BLENDMODE_ADDITIVE)){ - //effects.setRefractionMap(refracRes); - - wiImageParams effectsMod(effects); +void wiSprite::DrawNormal(GRAPHICSTHREAD threadID) +{ + if(normalPointer && params.opacity>0 && ((params.blendFlag==BLENDMODE_ADDITIVE && params.fade<1) || params.blendFlag!=BLENDMODE_ADDITIVE)) + { + wiImageParams effectsMod(params); effectsMod.blendFlag=BLENDMODE_ADDITIVE; - effectsMod.extractNormalMap=true; + effectsMod.enableExtractNormalMap(); wiImage::Draw(normalPointer,effectsMod,threadID); } } -void wiSprite::Update(float gameSpeed){ - effects.pos.x+=anim.vel.x*gameSpeed; - effects.pos.y+=anim.vel.y*gameSpeed; - effects.pos.z+=anim.vel.z*gameSpeed; - effects.rotation+=anim.rot*gameSpeed; - effects.scale.x+=anim.scaleX*gameSpeed; - effects.scale.y+=anim.scaleY*gameSpeed; - effects.opacity+=anim.opa*gameSpeed; - if(effects.opacity>=1) { - if(anim.repeatable) {effects.opacity=0.99f; anim.opa*=-1;} - else effects.opacity=1; - } - else if(effects.opacity<=0){ - if(anim.repeatable) {effects.opacity=0.01f; anim.opa*=-1;} - else effects.opacity=0; - } - effects.fade+=anim.fad*gameSpeed; - if(effects.fade>=1) { - if(anim.repeatable) {effects.fade=0.99f; anim.fad*=-1;} - else effects.fade=1; - } - else if(effects.fade<=0){ - if(anim.repeatable) {effects.fade=0.01f; anim.fad*=-1;} - else effects.fade=0; - } - - effects.texOffset.x+=anim.movingTexAnim.speedX*gameSpeed; - effects.texOffset.y+=anim.movingTexAnim.speedY*gameSpeed; - - if(anim.drawRecAnim.elapsedFrames>=anim.drawRecAnim.onFrameChangeWait){ - effects.drawRec.x+=effects.drawRec.z*anim.drawRecAnim.jumpX; - effects.drawRec.y+=effects.drawRec.w*anim.drawRecAnim.jumpY; +void wiSprite::Update(float gameSpeed) +{ + params.pos.x += anim.vel.x*gameSpeed; + params.pos.y += anim.vel.y*gameSpeed; + params.pos.z += anim.vel.z*gameSpeed; + params.rotation += anim.rot*gameSpeed; + params.scale.x += anim.scaleX*gameSpeed; + params.scale.y += anim.scaleY*gameSpeed; + params.opacity += anim.opa*gameSpeed; + if (params.opacity >= 1) { + if (anim.repeatable) { params.opacity = 0.99f; anim.opa *= -1; } + else params.opacity = 1; + } + else if (params.opacity <= 0) { + if (anim.repeatable) { params.opacity = 0.01f; anim.opa *= -1; } + else params.opacity = 0; + } + params.fade += anim.fad*gameSpeed; + if (params.fade >= 1) { + if (anim.repeatable) { params.fade = 0.99f; anim.fad *= -1; } + else params.fade = 1; + } + else if (params.fade <= 0) { + if (anim.repeatable) { params.fade = 0.01f; anim.fad *= -1; } + else params.fade = 0; + } - if(anim.drawRecAnim.currentFrame>=anim.drawRecAnim.frameCount){ - effects.drawRec.z-=anim.drawRecAnim.sizX*anim.drawRecAnim.frameCount; - effects.drawRec.w-=anim.drawRecAnim.sizY*anim.drawRecAnim.frameCount; - anim.drawRecAnim.currentFrame=0; + params.texOffset.x += anim.movingTexAnim.speedX*gameSpeed; + params.texOffset.y += anim.movingTexAnim.speedY*gameSpeed; + + if (anim.drawRecAnim.elapsedFrames >= anim.drawRecAnim.onFrameChangeWait) { + params.drawRect.x += params.drawRect.z*anim.drawRecAnim.jumpX; + params.drawRect.y += params.drawRect.w*anim.drawRecAnim.jumpY; + + if (anim.drawRecAnim.currentFrame >= anim.drawRecAnim.frameCount) { + params.drawRect.z -= anim.drawRecAnim.sizX*anim.drawRecAnim.frameCount; + params.drawRect.w -= anim.drawRecAnim.sizY*anim.drawRecAnim.frameCount; + anim.drawRecAnim.currentFrame = 0; } - else{ - effects.drawRec.z+=anim.drawRecAnim.sizX; - effects.drawRec.w+=anim.drawRecAnim.sizY; + else { + params.drawRect.z += anim.drawRecAnim.sizX; + params.drawRect.w += anim.drawRecAnim.sizY; anim.drawRecAnim.currentFrame++; } - anim.drawRecAnim.elapsedFrames=0; + anim.drawRecAnim.elapsedFrames = 0; } - else anim.drawRecAnim.elapsedFrames+=gameSpeed; + else anim.drawRecAnim.elapsedFrames += gameSpeed; } -void wiSprite::Update(){ +void wiSprite::Update() +{ Update(1); } diff --git a/WickedEngine/wiSprite.h b/WickedEngine/wiSprite.h index 7c2221aad..45fd18995 100644 --- a/WickedEngine/wiSprite.h +++ b/WickedEngine/wiSprite.h @@ -27,7 +27,7 @@ public: std::string name; - wiImageParams effects; + wiImageParams params; struct Anim{ struct MovingTexData{ diff --git a/WickedEngine/wiSprite_BindLua.cpp b/WickedEngine/wiSprite_BindLua.cpp index 61cbf668e..1110766c9 100644 --- a/WickedEngine/wiSprite_BindLua.cpp +++ b/WickedEngine/wiSprite_BindLua.cpp @@ -57,10 +57,10 @@ int wiSprite_BindLua::SetParams(lua_State *L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - wiImageParams_BindLua* effects = Luna::check(L, 1); - if (effects != nullptr) + wiImageParams_BindLua* params = Luna::check(L, 1); + if (params != nullptr) { - sprite->effects = effects->effects; + sprite->params = params->params; } } else @@ -76,7 +76,7 @@ int wiSprite_BindLua::GetParams(lua_State *L) wiLua::SError(L, "GetParams() sprite is null!"); return 0; } - Luna::push(L, new wiImageParams_BindLua(sprite->effects)); + Luna::push(L, new wiImageParams_BindLua(sprite->params)); return 1; } int wiSprite_BindLua::SetAnim(lua_State *L) diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 8d6779e75..fe022cc07 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 23; // minor bug fixes, alterations, refactors, updates - const int revision = 1; + const int revision = 2; long GetVersion() diff --git a/WickedEngine/wiWidget.cpp b/WickedEngine/wiWidget.cpp index 9a69898b3..7aabf313e 100644 --- a/WickedEngine/wiWidget.cpp +++ b/WickedEngine/wiWidget.cpp @@ -115,7 +115,7 @@ void wiWidget::RenderTooltip(wiGUI* gui) if (tooltipPos.x > wiRenderer::GetDevice()->GetScreenWidth() - textWidth) { tooltipPos.x -= textWidth + 10; - tooltipFont.props.posX = (int)tooltipPos.x; + tooltipFont.params.posX = (int)tooltipPos.x; } static const float _border = 2; @@ -127,8 +127,8 @@ void wiWidget::RenderTooltip(wiGUI* gui) if (!scriptTip.empty()) { tooltipFont.SetText(scriptTip); - tooltipFont.props.posY += (int)(fontHeight / 2); - tooltipFont.props.color = wiColor(25, 25, 25, 110); + tooltipFont.params.posY += (int)(fontHeight / 2); + tooltipFont.params.color = wiColor(25, 25, 25, 110); tooltipFont.Draw(gui->GetGraphicsThread()); } }