diff --git a/NexgenRedux-OG/NexgenRedux-OG.vcproj b/NexgenRedux-OG/NexgenRedux-OG.vcproj
index 3c0e809..b9e0d50 100644
--- a/NexgenRedux-OG/NexgenRedux-OG.vcproj
+++ b/NexgenRedux-OG/NexgenRedux-OG.vcproj
@@ -447,6 +447,12 @@
+
+
+
+
@@ -524,6 +530,9 @@
+
+
diff --git a/NexgenRedux-Shared/AngelScriptRunner.cpp b/NexgenRedux-Shared/AngelScriptRunner.cpp
index a2c7aba..8f1f0b0 100644
--- a/NexgenRedux-Shared/AngelScriptRunner.cpp
+++ b/NexgenRedux-Shared/AngelScriptRunner.cpp
@@ -13,6 +13,7 @@
#include "EntityEngine/Fog.h"
#include "EntityEngine/Lighting.h"
#include "EntityEngine/Sprite.h"
+#include "EntityEngine/PreLoader.h"
#include "EntityEngine/Text.h"
#include
@@ -967,6 +968,11 @@ bool AngelScriptRunner::Init()
result = m_engine->RegisterGlobalFunction("void SceneManager::SetCurrentScene(uint)", asFUNCTION(SceneManager::SetCurrentScene), asCALL_CDECL); if (result < 0) { return false; }
result = m_engine->RegisterGlobalFunction("bool SceneManager::AssignNode(Node@, uint)", asFUNCTION(SceneManager::AssignNode), asCALL_CDECL); if (result < 0) { return false; }
+ result = m_engine->SetDefaultNamespace("PreLoader"); if (result < 0) { return false; }
+ result = m_engine->RegisterGlobalFunction("void LoadTexture(string)", asFUNCTION(PreLoader::LoadTexture), asCALL_CDECL); if (result < 0) { return false; }
+ result = m_engine->RegisterGlobalFunction("void UnLoadTexture(string)", asFUNCTION(PreLoader::UnLoadTexture), asCALL_CDECL); if (result < 0) { return false; }
+ result = m_engine->RegisterGlobalFunction("void WaitTexturesLoaded()", asFUNCTION(PreLoader::WaitTexturesLoaded), asCALL_CDECL); if (result < 0) { return false; }
+
result = m_engine->SetDefaultNamespace("FontManager"); if (result < 0) { return false; }
result = m_engine->RegisterGlobalFunction("bool FontManager::LoadFont(string)", asFUNCTION(FontManager::LoadFont), asCALL_CDECL); if (result < 0) { return false; }
diff --git a/NexgenRedux-Shared/EntityEngine/PreLoader.cpp b/NexgenRedux-Shared/EntityEngine/PreLoader.cpp
new file mode 100644
index 0000000..5d4d4f3
--- /dev/null
+++ b/NexgenRedux-Shared/EntityEngine/PreLoader.cpp
@@ -0,0 +1,97 @@
+#include "PreLoader.h"
+#include "RenderStateManager.h"
+#include "TextureManager.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace Gensys;
+using namespace NexgenRedux;
+
+namespace
+{
+ std::vector m_textureKeys;
+}
+
+void PreLoader::Close(void)
+{
+ RenderStateManager* renderStateManager = RenderStateManager::GetInstance();
+
+ for (size_t i = 0; i < m_textureKeys.size(); ++i)
+ {
+ const std::string value = m_textureKeys[i];
+
+ uint32_t textureID = 0;
+ bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(value), textureID);
+ if (textureExists == true)
+ {
+ renderStateManager->DeleteTextureReference(textureID);
+ }
+ }
+}
+
+void PreLoader::LoadTexture(const std::string value)
+{
+ // Only load if we dont a ref to key ourselves
+ if (std::find(m_textureKeys.begin(), m_textureKeys.end(), value) != m_textureKeys.end())
+ {
+ return;
+ }
+
+ RenderStateManager* renderStateManager = RenderStateManager::GetInstance();
+
+ uint32_t textureID = 0;
+
+ bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(value), textureID);
+ renderStateManager->CreateTextureReference(StringUtility::ToWideString(value), textureID);
+ if (textureExists == false)
+ {
+ TextureManager::Request(StringUtility::ToWideString(value), textureID);
+ }
+}
+
+void PreLoader::UnLoadTexture(const std::string value)
+{
+ // Only unload if we have a ref to key ourselves
+ if (std::find(m_textureKeys.begin(), m_textureKeys.end(), value) == m_textureKeys.end())
+ {
+ return;
+ }
+
+ RenderStateManager* renderStateManager = RenderStateManager::GetInstance();
+
+ uint32_t textureID = 0;
+
+ bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(value), textureID);
+ if (textureExists == true)
+ {
+ renderStateManager->DeleteTextureReference(textureID);
+ }
+}
+
+void PreLoader::WaitTexturesLoaded()
+{
+ // This should not be called until render engine / window created
+
+ RenderStateManager* renderStateManager = RenderStateManager::GetInstance();
+
+ for (size_t i = 0; i < m_textureKeys.size(); ++i)
+ {
+ const std::string value = m_textureKeys[i];
+
+ uint32_t textureID = 0;
+ bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(value), textureID);
+ if (textureExists == true)
+ {
+ while (renderStateManager->IsTextureLoaded(textureID) == false)
+ {
+ TimeUtility::SleepMilliseconds(100);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/NexgenRedux-Shared/EntityEngine/PreLoader.h b/NexgenRedux-Shared/EntityEngine/PreLoader.h
new file mode 100644
index 0000000..5419f8e
--- /dev/null
+++ b/NexgenRedux-Shared/EntityEngine/PreLoader.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include
+
+namespace NexgenRedux
+{
+ class PreLoader
+ {
+ public:
+ static void Close(void);
+ static void LoadTexture(const std::string value);
+ static void UnLoadTexture(const std::string value);
+ static void WaitTexturesLoaded();
+ };
+}
\ No newline at end of file
diff --git a/NexgenRedux-Shared/EntityEngine/Sprite.cpp b/NexgenRedux-Shared/EntityEngine/Sprite.cpp
index d1619f5..3e6e259 100644
--- a/NexgenRedux-Shared/EntityEngine/Sprite.cpp
+++ b/NexgenRedux-Shared/EntityEngine/Sprite.cpp
@@ -54,7 +54,7 @@ void Sprite::Update(float dt)
{
renderStateManager->DeleteTextureReference(m_textureID);
}
- bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(m_texturePath));
+ bool textureExists = renderStateManager->TextureExists(StringUtility::ToWideString(m_texturePath), m_textureID);
renderStateManager->CreateTextureReference(StringUtility::ToWideString(m_texturePath), m_textureID);
if (textureExists == false)
{
diff --git a/NexgenRedux-Shared/IRenderingHelper.h b/NexgenRedux-Shared/IRenderingHelper.h
index 7374852..ff31f82 100644
--- a/NexgenRedux-Shared/IRenderingHelper.h
+++ b/NexgenRedux-Shared/IRenderingHelper.h
@@ -41,7 +41,7 @@ namespace NexgenRedux
virtual void SetViewport(const MathUtility::RectI rect) = 0;
virtual void SetScissor(const ScissorOperation& operation, const MathUtility::RectI& rect) = 0;
virtual bool LoadTexture(const std::wstring& path, uint32_t& textureID) = 0;
- virtual bool TextureExists(const std::wstring& key) = 0;
+ virtual bool TextureExists(const std::wstring& key, uint32_t& textureID) = 0;
virtual bool CreateTextureReference(const std::wstring& key, uint32_t& textureID) = 0;
virtual bool DeleteTextureReference(const uint32_t& textureID) = 0;
virtual bool IsTextureLoaded(const uint32_t& textureID) = 0;
diff --git a/NexgenRedux-Shared/Media/Shooter/main.as b/NexgenRedux-Shared/Media/Shooter/main.as
index d14169f..d0bd70b 100644
--- a/NexgenRedux-Shared/Media/Shooter/main.as
+++ b/NexgenRedux-Shared/Media/Shooter/main.as
@@ -663,6 +663,13 @@ void UpdateBackground(double dt)
void Init()
{
FontManager::LoadFont("skin:asset\\fonts\\freesans.sfn");
+ //PreLoader::LoadTexture("asset:images\\TR_Banner_Background.jpg");
+ //PreLoader::LoadTexture("asset:images\\game\\playerbullet.png");
+ //PreLoader::LoadTexture("asset:images\\game\\boss.png");
+ //PreLoader::LoadTexture("asset:images\\game\\PineappleShip.png");
+ //PreLoader::LoadTexture("asset:images\\backgrounds\\Nebula Aqua-Pink.png");
+ //PreLoader::LoadTexture("asset:images\\backgrounds\\Stars-Big_1_2_PC.png");
+ //PreLoader::LoadTexture("asset:images\\backgrounds\\Stars-Big_1_1_PC.png");
uint sceneID = SceneManager::CreateScene(true);
SceneManager::SetCurrentScene(sceneID);
@@ -706,6 +713,8 @@ void Init()
// Create window example
WindowCreateWithSize(640, 480, "Nexgen Redux - Shooter Demo");
+
+ PreLoader::WaitTexturesLoaded();
SetWindowIconifyCallback(OnWindowIconify);
diff --git a/NexgenRedux-Shared/OpenGLRenderingHelper.cpp b/NexgenRedux-Shared/OpenGLRenderingHelper.cpp
index c822034..9c75dc0 100644
--- a/NexgenRedux-Shared/OpenGLRenderingHelper.cpp
+++ b/NexgenRedux-Shared/OpenGLRenderingHelper.cpp
@@ -874,7 +874,7 @@ bool OpenGLRenderingHelper::LoadTexture(const std::wstring& path, uint32_t& text
return false;
}
-bool OpenGLRenderingHelper::TextureExists(const std::wstring& key)
+bool OpenGLRenderingHelper::TextureExists(const std::wstring& key, uint32_t& textureID)
{
for (std::map::iterator it = m_textureContainerMap.begin(); it != m_textureContainerMap.end(); ++it)
{
@@ -882,6 +882,7 @@ bool OpenGLRenderingHelper::TextureExists(const std::wstring& key)
{
continue;
}
+ textureID = it->first;
return true;
}
return false;
diff --git a/NexgenRedux-Shared/OpenGLRenderingHelper.h b/NexgenRedux-Shared/OpenGLRenderingHelper.h
index 0a7bead..73b6568 100644
--- a/NexgenRedux-Shared/OpenGLRenderingHelper.h
+++ b/NexgenRedux-Shared/OpenGLRenderingHelper.h
@@ -68,7 +68,7 @@ namespace NexgenRedux
void SetScissor(const ScissorOperation& operation, const MathUtility::RectI& rect) override;
bool LoadTexture(const std::wstring& path, uint32_t& textureID) override;
- bool TextureExists(const std::wstring& key) override;
+ bool TextureExists(const std::wstring& key, uint32_t& textureID) override;
bool CreateTextureReference(const std::wstring& key, uint32_t& textureID) override;
bool DeleteTextureReference(const uint32_t& textureID) override;
bool IsTextureLoaded(const uint32_t& textureID);
diff --git a/NexgenRedux-Shared/RenderStateManager.cpp b/NexgenRedux-Shared/RenderStateManager.cpp
index c7ed060..c35b734 100644
--- a/NexgenRedux-Shared/RenderStateManager.cpp
+++ b/NexgenRedux-Shared/RenderStateManager.cpp
@@ -189,9 +189,9 @@ bool RenderStateManager::LoadTexture(const std::wstring& path, uint32_t& texture
return m_renderingHelper->LoadTexture(path, textureID);
}
-bool RenderStateManager::TextureExists(const std::wstring& key)
+bool RenderStateManager::TextureExists(const std::wstring& key, uint32_t& textureID)
{
- return m_renderingHelper->TextureExists(key);
+ return m_renderingHelper->TextureExists(key, textureID);
}
bool RenderStateManager::CreateTextureReference(const std::wstring& key, uint32_t& textureID)
diff --git a/NexgenRedux-Shared/RenderStateManager.h b/NexgenRedux-Shared/RenderStateManager.h
index 39a7d74..b41514d 100644
--- a/NexgenRedux-Shared/RenderStateManager.h
+++ b/NexgenRedux-Shared/RenderStateManager.h
@@ -25,7 +25,7 @@ namespace NexgenRedux
RenderState* GetRenderState(void);
bool CanBatch(void);
bool LoadTexture(const std::wstring& path, uint32_t& textureID);
- bool TextureExists(const std::wstring& key);
+ bool TextureExists(const std::wstring& key, uint32_t& textureID);
bool CreateTextureReference(const std::wstring& key, uint32_t& textureID);
bool DeleteTextureReference(const uint32_t& textureID);
bool IsTextureLoaded(const uint32_t& textureID);
diff --git a/NexgenRedux-Shared/XboxOGRenderingHelper.cpp b/NexgenRedux-Shared/XboxOGRenderingHelper.cpp
index 81ad589..cc76213 100644
--- a/NexgenRedux-Shared/XboxOGRenderingHelper.cpp
+++ b/NexgenRedux-Shared/XboxOGRenderingHelper.cpp
@@ -1058,7 +1058,7 @@ bool XboxOGRenderingHelper::LoadTexture(const std::wstring& path, uint32_t& text
return true;
}
-bool XboxOGRenderingHelper::TextureExists(const std::wstring& key)
+bool XboxOGRenderingHelper::TextureExists(const std::wstring& key, uint32_t& textureID)
{
for (std::map::iterator it = m_textureContainerMap.begin(); it != m_textureContainerMap.end(); ++it)
{
@@ -1066,6 +1066,7 @@ bool XboxOGRenderingHelper::TextureExists(const std::wstring& key)
{
continue;
}
+ textureID = it->first;
return true;
}
return false;
diff --git a/NexgenRedux-Shared/XboxOGRenderingHelper.h b/NexgenRedux-Shared/XboxOGRenderingHelper.h
index 0716f73..5d00aab 100644
--- a/NexgenRedux-Shared/XboxOGRenderingHelper.h
+++ b/NexgenRedux-Shared/XboxOGRenderingHelper.h
@@ -68,7 +68,7 @@ namespace NexgenRedux
void SetScissor(const ScissorOperation& operation, const MathUtility::RectI& rect);
bool LoadTexture(const std::wstring& path, uint32_t& textureID);
- bool TextureExists(const std::wstring& key);
+ bool TextureExists(const std::wstring& key, uint32_t& textureID);
bool CreateTextureReference(const std::wstring& key, uint32_t& textureID);
bool DeleteTextureReference(const uint32_t& textureID);
bool IsTextureLoaded(const uint32_t& textureID);