diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index 8d7b888b0..ef58645a6 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -16,80 +16,176 @@ using namespace wiGraphicsTypes; #define WHITESPACE_SIZE 3 -static std::string FONTPATH = "fonts/"; -static GPURingBuffer vertexBuffer; -static GPUBuffer indexBuffer; -static GPUBuffer constantBuffer; -static BlendState blendState; -static RasterizerState rasterizerState; -static DepthStencilState depthStencilState; -static Sampler sampler; - -static VertexLayout *vertexLayout = nullptr; -static VertexShader *vertexShader = nullptr; -static PixelShader *pixelShader = nullptr; -static GraphicsPSO *PSO = nullptr; - -static bool initialized = false; - -struct wiFontStyle +namespace wiFont_Internal { - std::string name; - wiGraphicsTypes::Texture2D* texture = nullptr; + std::string FONTPATH = "fonts/"; + GPURingBuffer vertexBuffer; + GPUBuffer indexBuffer; + GPUBuffer constantBuffer; + BlendState blendState; + RasterizerState rasterizerState; + DepthStencilState depthStencilState; + Sampler sampler; - struct LookUp + VertexLayout *vertexLayout = nullptr; + VertexShader *vertexShader = nullptr; + PixelShader *pixelShader = nullptr; + GraphicsPSO *PSO = nullptr; + + bool initialized = false; + + struct wiFontStyle { - int ascii; - char character; - float left; - float right; - int pixelWidth; - }; - LookUp lookup[128]; - int texWidth, texHeight; - int lineHeight; + std::string name; + wiGraphicsTypes::Texture2D* texture = nullptr; - wiFontStyle() {} - wiFontStyle(const std::string& newName) - { - name = newName; - - ZeroMemory(lookup, sizeof(lookup)); - - std::stringstream ss(""), ss1(""); - ss << FONTPATH << name << ".wifont"; - ss1 << FONTPATH << name << ".dds"; - std::ifstream file(ss.str()); - if (file.is_open()) + struct LookUp { - texture = (Texture2D*)wiResourceManager::GetGlobal()->add(ss1.str()); - if (texture == nullptr) + int ascii; + char character; + float left; + float right; + int pixelWidth; + }; + LookUp lookup[128]; + int texWidth, texHeight; + int lineHeight; + + wiFontStyle() {} + wiFontStyle(const std::string& newName) + { + name = newName; + + ZeroMemory(lookup, sizeof(lookup)); + + std::stringstream ss(""), ss1(""); + ss << FONTPATH << name << ".wifont"; + ss1 << FONTPATH << name << ".dds"; + std::ifstream file(ss.str()); + if (file.is_open()) { - return; - } - texWidth = texture->GetDesc().Width; - texHeight = texture->GetDesc().Height; + texture = (Texture2D*)wiResourceManager::GetGlobal()->add(ss1.str()); + if (texture == nullptr) + { + return; + } + texWidth = texture->GetDesc().Width; + texHeight = texture->GetDesc().Height; - string voidStr; - file >> voidStr >> lineHeight; - while (!file.eof()) + string voidStr; + file >> voidStr >> lineHeight; + while (!file.eof()) + { + int code = 0; + file >> code; + lookup[code].ascii = code; + file >> lookup[code].character >> lookup[code].left >> lookup[code].right >> lookup[code].pixelWidth; + } + + + file.close(); + } + else { - int code = 0; - file >> code; - lookup[code].ascii = code; - file >> lookup[code].character >> lookup[code].left >> lookup[code].right >> lookup[code].pixelWidth; + wiHelper::messageBox(name, "Could not load Font Data: " + ss.str()); } - - - file.close(); } - else + }; + std::vector fontStyles; + + struct FontVertex + { + XMFLOAT2 Pos; + XMHALF2 Tex; + }; + + void ModifyGeo(volatile FontVertex* vertexList, const std::wstring& text, wiFontProps props, int style) + { + size_t vertexCount = text.length() * 4; + + const int lineHeight = (props.size < 0 ? fontStyles[style].lineHeight : props.size); + const float relativeSize = (props.size < 0 ? 1 : (float)props.size / (float)fontStyles[style].lineHeight); + + int line = 0; + int pos = 0; + for (unsigned int i = 0; i < vertexCount; i += 4) { - wiHelper::messageBox(name, "Could not load Font Data: " + ss.str()); + bool compatible = false; + wiFontStyle::LookUp lookup; + + if (text[i / 4] == '\n') + { + line += lineHeight + props.spacingY; + pos = 0; + } + else if (text[i / 4] == ' ') + { + pos += WHITESPACE_SIZE + props.spacingX; + } + else if (text[i / 4] == '\t') + { + pos += (WHITESPACE_SIZE + props.spacingX) * 5; + } + else if (text[i / 4] < ARRAYSIZE(fontStyles[style].lookup) && fontStyles[style].lookup[text[i / 4]].character == text[i / 4]) + { + lookup = fontStyles[style].lookup[text[i / 4]]; + compatible = true; + } + + HALF h0 = XMConvertFloatToHalf(0.0f); + + if (compatible) + { + int characterWidth = (int)(lookup.pixelWidth * relativeSize); + + HALF h1 = XMConvertFloatToHalf(1.0f); + HALF hl = XMConvertFloatToHalf(lookup.left); + HALF hr = XMConvertFloatToHalf(lookup.right); + + vertexList[i + 0].Pos.x = (float)pos; + vertexList[i + 0].Pos.y = (float)line; + vertexList[i + 1].Pos.x = (float)pos + (float)characterWidth; + vertexList[i + 1].Pos.y = (float)line; + vertexList[i + 2].Pos.x = (float)pos; + vertexList[i + 2].Pos.y = (float)line + (float)lineHeight; + vertexList[i + 3].Pos.x = (float)pos + (float)characterWidth; + vertexList[i + 3].Pos.y = (float)line + (float)lineHeight; + + vertexList[i + 0].Tex.x = hl; + vertexList[i + 0].Tex.y = h0; + vertexList[i + 1].Tex.x = hr; + vertexList[i + 1].Tex.y = h0; + vertexList[i + 2].Tex.x = hl; + vertexList[i + 2].Tex.y = h1; + vertexList[i + 3].Tex.x = hr; + vertexList[i + 3].Tex.y = h1; + + pos += characterWidth + props.spacingX; + } + else + { + vertexList[i + 0].Pos.x = 0; + vertexList[i + 0].Pos.y = 0; + vertexList[i + 0].Tex.x = h0; + vertexList[i + 0].Tex.y = h0; + vertexList[i + 1].Pos.x = 0; + vertexList[i + 1].Pos.y = 0; + vertexList[i + 1].Tex.x = h0; + vertexList[i + 1].Tex.y = h0; + vertexList[i + 2].Pos.x = 0; + vertexList[i + 2].Pos.y = 0; + vertexList[i + 2].Tex.x = h0; + vertexList[i + 2].Tex.y = h0; + vertexList[i + 3].Pos.x = 0; + vertexList[i + 3].Pos.y = 0; + vertexList[i + 3].Tex.x = h0; + vertexList[i + 3].Tex.y = h0; + } } } -}; -static std::vector fontStyles; + +} +using namespace wiFont_Internal; wiFont::wiFont(const std::string& text, wiFontProps props, int style) : props(props), style(style) @@ -265,91 +361,6 @@ void wiFont::BindPersistentState(GRAPHICSTHREAD threadID) device->BindConstantBuffer(PS, &constantBuffer, CB_GETBINDSLOT(FontCB), threadID); } -void wiFont::ModifyGeo(volatile Vertex* vertexList, const std::wstring& text, wiFontProps props, int style) -{ - size_t vertexCount = text.length() * 4; - - const int lineHeight = (props.size < 0 ? fontStyles[style].lineHeight : props.size); - const float relativeSize = (props.size < 0 ? 1 : (float)props.size / (float)fontStyles[style].lineHeight); - - int line = 0; - int pos = 0; - for (unsigned int i = 0; iAllocateFromRingBuffer(&vertexBuffer, sizeof(Vertex) * text.length() * 4, vboffset, threadID); + volatile FontVertex* textBuffer = (volatile FontVertex*)device->AllocateFromRingBuffer(&vertexBuffer, sizeof(FontVertex) * text.length() * 4, vboffset, threadID); if (textBuffer == nullptr) { return; @@ -391,7 +402,7 @@ void wiFont::Draw(GRAPHICSTHREAD threadID) &vertexBuffer, }; const UINT strides[] = { - sizeof(Vertex), + sizeof(FontVertex), }; const UINT offsets[] = { vboffset, diff --git a/WickedEngine/wiFont.h b/WickedEngine/wiFont.h index 64fd97828..0f4a35c43 100644 --- a/WickedEngine/wiFont.h +++ b/WickedEngine/wiFont.h @@ -19,9 +19,8 @@ enum wiFontAlign WIFALIGN_COUNT, }; -class wiFontProps +struct wiFontProps { -public: int size; int spacingX, spacingY; int posX, posY; @@ -37,19 +36,6 @@ public: class wiFont { -protected: - struct Vertex - { - XMFLOAT2 Pos; - XMHALF2 Tex; - }; - -private: - - - - static void ModifyGeo(volatile Vertex* vertexList, const std::wstring& text, wiFontProps props, int style); - public: static void Initialize(); static void CleanUp(); diff --git a/WickedEngine/wiOcean.cpp b/WickedEngine/wiOcean.cpp index 76a397438..9b1e196ea 100644 --- a/WickedEngine/wiOcean.cpp +++ b/WickedEngine/wiOcean.cpp @@ -9,23 +9,29 @@ using namespace std; using namespace wiGraphicsTypes; using namespace wiSceneSystem; -ComputeShader* wiOcean::m_pUpdateSpectrumCS = nullptr; -ComputeShader* wiOcean::m_pUpdateDisplacementMapCS = nullptr; -ComputeShader* wiOcean::m_pUpdateGradientFoldingCS = nullptr; -VertexShader* wiOcean::g_pOceanSurfVS = nullptr; -PixelShader* wiOcean::g_pWireframePS = nullptr; -PixelShader* wiOcean::g_pOceanSurfPS = nullptr; +namespace wiOcean_Internal +{ + ComputeShader* m_pUpdateSpectrumCS = nullptr; + ComputeShader* m_pUpdateDisplacementMapCS = nullptr; + ComputeShader* m_pUpdateGradientFoldingCS = nullptr; + VertexShader* g_pOceanSurfVS = nullptr; + PixelShader* g_pWireframePS = nullptr; + PixelShader* g_pOceanSurfPS = nullptr; -GPUBuffer* wiOcean::g_pShadingCB = nullptr; -RasterizerState wiOcean::rasterizerState; -RasterizerState wiOcean::wireRS; -DepthStencilState wiOcean::depthStencilState; -BlendState wiOcean::blendState; + GPUBuffer* g_pShadingCB = nullptr; + RasterizerState rasterizerState; + RasterizerState wireRS; + DepthStencilState depthStencilState; + BlendState blendState; -GraphicsPSO wiOcean::PSO, wiOcean::PSO_wire; -ComputePSO wiOcean::CPSO_updateSpectrum, wiOcean::CPSO_updateDisplacementMap, wiOcean::CPSO_updateGradientFolding; + GraphicsPSO PSO, PSO_wire; + ComputePSO CPSO_updateSpectrum; + ComputePSO CPSO_updateDisplacementMap; + ComputePSO CPSO_updateGradientFolding; -CSFFT512x512_Plan wiOcean::m_fft_plan; + CSFFT512x512_Plan m_fft_plan; +} +using namespace wiOcean_Internal; #define HALF_SQRT_2 0.7071068f diff --git a/WickedEngine/wiOcean.h b/WickedEngine/wiOcean.h index 1fc34f737..62308a22f 100644 --- a/WickedEngine/wiOcean.h +++ b/WickedEngine/wiOcean.h @@ -47,26 +47,6 @@ protected: wiGraphicsTypes::GPUBuffer* m_pImmutableCB; wiGraphicsTypes::GPUBuffer* m_pPerFrameCB; - - - static CSFFT512x512_Plan m_fft_plan; - - static wiGraphicsTypes::ComputeShader* m_pUpdateSpectrumCS; - static wiGraphicsTypes::ComputeShader* m_pUpdateDisplacementMapCS; - static wiGraphicsTypes::ComputeShader* m_pUpdateGradientFoldingCS; - static wiGraphicsTypes::VertexShader* g_pOceanSurfVS; - static wiGraphicsTypes::PixelShader* g_pOceanSurfPS; - static wiGraphicsTypes::PixelShader* g_pWireframePS; - - static wiGraphicsTypes::GPUBuffer* g_pShadingCB; - - static wiGraphicsTypes::RasterizerState rasterizerState; - static wiGraphicsTypes::RasterizerState wireRS; - static wiGraphicsTypes::DepthStencilState depthStencilState; - static wiGraphicsTypes::BlendState blendState; - - static wiGraphicsTypes::GraphicsPSO PSO, PSO_wire; - static wiGraphicsTypes::ComputePSO CPSO_updateSpectrum, CPSO_updateDisplacementMap, CPSO_updateGradientFolding; }; #endif // _OCEAN_SIMULATOR_H diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 424021fc0..089e74162 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 21; // minor bug fixes, alterations, refactors, updates - const int revision = 25; + const int revision = 26; long GetVersion()