mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-07-15 09:25:52 +00:00
Thermal Hot GLSL filter
This commit is contained in:
parent
135aac5fef
commit
9222a928ef
@ -13,6 +13,7 @@
|
|||||||
#include "Runtime/Graphics/CModel.hpp"
|
#include "Runtime/Graphics/CModel.hpp"
|
||||||
#include "Runtime/Graphics/CGraphics.hpp"
|
#include "Runtime/Graphics/CGraphics.hpp"
|
||||||
#include "Runtime/Character/CSkinRules.hpp"
|
#include "Runtime/Character/CSkinRules.hpp"
|
||||||
|
#include "Graphics/CMetroidModelInstance.hpp"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
using YAMLNode = athena::io::YAMLNode;
|
using YAMLNode = athena::io::YAMLNode;
|
||||||
@ -21,6 +22,7 @@ namespace urde
|
|||||||
{
|
{
|
||||||
|
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
||||||
|
URDE_DECL_SPECIALIZE_SHADER(CThermalHotFilter)
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CSpaceWarpFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CSpaceWarpFilter)
|
||||||
|
|
||||||
void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
|
void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
|
||||||
@ -77,29 +79,35 @@ void ViewManager::ParticleView::draw(boo::IGraphicsCommandQueue *gfxQ)
|
|||||||
{
|
{
|
||||||
CModelFlags flags;
|
CModelFlags flags;
|
||||||
|
|
||||||
flags.m_extendedShaderIdx = 1;
|
flags.m_extendedShaderIdx = 0;
|
||||||
//flags.m_extendedShaderIdx = 2;
|
//flags.m_extendedShaderIdx = 2;
|
||||||
//if (std::fmod(m_theta, M_PIF) < M_PIF / 2.f)
|
//if (std::fmod(m_theta, M_PIF) < M_PIF / 2.f)
|
||||||
// flags.m_extendedShaderIdx = 1;
|
// flags.m_extendedShaderIdx = 1;
|
||||||
|
|
||||||
m_theta += 0.01f;
|
m_theta += 0.01f;
|
||||||
CGraphics::SetModelMatrix(zeus::CTransform::Translate(0.f, 0.f, -3.f) *
|
CGraphics::SetModelMatrix(zeus::CTransform::RotateZ(m_theta));
|
||||||
zeus::CTransform::RotateZ(m_theta) *
|
g_Renderer->SetWorldViewpoint(zeus::lookAt(zeus::CVector3f{0.f, -10.f, 7.f},
|
||||||
zeus::CTransform::Scale(1.f));
|
{0.f, 0.f, 3.f}));
|
||||||
//CGraphics::SetModelMatrix(zeus::CTransform::Identity());
|
|
||||||
CGraphics::SetViewPointMatrix(zeus::lookAt(zeus::CVector3f{0.f, -10.f, 4.f}, {0.f, 0.f, 0.f}));
|
|
||||||
boo::SWindowRect windowRect = m_vm.m_mainWindow->getWindowFrame();
|
boo::SWindowRect windowRect = m_vm.m_mainWindow->getWindowFrame();
|
||||||
float aspect = windowRect.size[0] / float(windowRect.size[1]);
|
float aspect = windowRect.size[0] / float(windowRect.size[1]);
|
||||||
|
|
||||||
CGraphics::SetPerspective(55.0, aspect, 0.1f, 1000.f);
|
CGraphics::SetPerspective(55.0, aspect, 0.1f, 1000.f);
|
||||||
|
zeus::CFrustum frustum;
|
||||||
|
frustum.updatePlanes(CGraphics::g_GXModelView, zeus::SProjPersp(55.0, aspect, 0.1f, 1000.f));
|
||||||
|
g_Renderer->SetClippingPlanes(frustum);
|
||||||
|
|
||||||
std::vector<CLight> lights = {CLight::BuildLocalAmbient({}, {0.05f, 0.05f, 0.05f, 1.f}),
|
std::vector<CLight> lights = {CLight::BuildLocalAmbient({}, {0.05f, 0.05f, 0.05f, 1.f}),
|
||||||
CLight::BuildCustom({5.f, -20.f, 10.f}, {0.f, 1.f, 0.f},
|
CLight::BuildCustom({5.f, -20.f, 10.f}, {0.f, 1.f, 0.f},
|
||||||
{200.f, 200.f, 200.f}, 0.f, 0.f, 1.f, 1.f, 0.f, 0.f)};
|
{200.f, 200.f, 200.f}, 0.f, 0.f, 1.f, 1.f, 0.f, 0.f)};
|
||||||
//lights = {CLight::BuildLocalAmbient({}, {1.0f, 0.0f, 0.0f, 1.f})};
|
//lights = {CLight::BuildLocalAmbient({}, {1.0f, 0.0f, 0.0f, 1.f})};
|
||||||
m_vm.m_modelTest->GetInstance().ActivateLights(lights);
|
//m_vm.m_modelTest->GetInstance().ActivateLights(lights);
|
||||||
|
g_Renderer->SetThermal(true, 1.f, zeus::CColor::skWhite);
|
||||||
|
g_Renderer->SetThermalColdScale(std::sin(m_theta) * 0.5f + 0.5f);
|
||||||
|
g_Renderer->DoThermalBlendCold();
|
||||||
|
flags.m_extendedShaderIdx = 2;
|
||||||
m_vm.m_modelTest->Draw(flags);
|
m_vm.m_modelTest->Draw(flags);
|
||||||
|
g_Renderer->DoThermalBlendHot();
|
||||||
m_spaceWarpFilter.setStrength(std::sin(m_theta * 5.f) * 0.5f + 0.5f);
|
//m_spaceWarpFilter.setStrength(std::sin(m_theta * 5.f) * 0.5f + 0.5f);
|
||||||
//m_spaceWarpFilter.draw(zeus::CVector2f{0.f, 0.f});
|
//m_spaceWarpFilter.draw(zeus::CVector2f{0.f, 0.f});
|
||||||
}
|
}
|
||||||
if (m_vm.m_partGen)
|
if (m_vm.m_partGen)
|
||||||
@ -369,6 +377,7 @@ void ViewManager::stop()
|
|||||||
m_videoVoice.reset();
|
m_videoVoice.reset();
|
||||||
m_projManager.shutdown();
|
m_projManager.shutdown();
|
||||||
TShader<CThermalColdFilter>::Shutdown();
|
TShader<CThermalColdFilter>::Shutdown();
|
||||||
|
TShader<CThermalHotFilter>::Shutdown();
|
||||||
TShader<CSpaceWarpFilter>::Shutdown();
|
TShader<CSpaceWarpFilter>::Shutdown();
|
||||||
CElementGen::Shutdown();
|
CElementGen::Shutdown();
|
||||||
CMoviePlayer::Shutdown();
|
CMoviePlayer::Shutdown();
|
||||||
|
@ -83,10 +83,10 @@ void Buckets::Sort()
|
|||||||
for (auto it = sBuckets->rbegin() ; it != sBuckets->rend() ; ++it)
|
for (auto it = sBuckets->rbegin() ; it != sBuckets->rend() ; ++it)
|
||||||
{
|
{
|
||||||
--bucketIdx;
|
--bucketIdx;
|
||||||
sBucketIndex.push_back(bucketIdx);
|
|
||||||
rstl::reserved_vector<CDrawable*, 128>& bucket = *it;
|
rstl::reserved_vector<CDrawable*, 128>& bucket = *it;
|
||||||
if (bucket.size())
|
if (bucket.size())
|
||||||
{
|
{
|
||||||
|
sBucketIndex.push_back(bucketIdx);
|
||||||
std::sort(bucket.begin(), bucket.end(),
|
std::sort(bucket.begin(), bucket.end(),
|
||||||
[](CDrawable* a, CDrawable* b) -> bool
|
[](CDrawable* a, CDrawable* b) -> bool
|
||||||
{
|
{
|
||||||
@ -191,11 +191,14 @@ void CBooRenderer::ActivateLightsForModel(CAreaListItem* item, CBooModel& model)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model.ActivateLights(thisLights);
|
//model.ActivateLights(thisLights);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::RenderBucketItems(CAreaListItem* item)
|
void CBooRenderer::RenderBucketItems(CAreaListItem* item)
|
||||||
{
|
{
|
||||||
|
CModelFlags flags;
|
||||||
|
flags.m_extendedShaderIdx = 1;
|
||||||
|
|
||||||
for (u16 idx : Buckets::sBucketIndex)
|
for (u16 idx : Buckets::sBucketIndex)
|
||||||
{
|
{
|
||||||
rstl::reserved_vector<CDrawable*, 128>& bucket = (*Buckets::sBuckets)[idx];
|
rstl::reserved_vector<CDrawable*, 128>& bucket = (*Buckets::sBuckets)[idx];
|
||||||
@ -208,14 +211,14 @@ void CBooRenderer::RenderBucketItems(CAreaListItem* item)
|
|||||||
static_cast<CParticleGen*>((void*)drawable->GetData())->Render();
|
static_cast<CParticleGen*>((void*)drawable->GetData())->Render();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EDrawableType::Surface:
|
case EDrawableType::WorldSurface:
|
||||||
{
|
{
|
||||||
CBooSurface* surf = static_cast<CBooSurface*>((void*)drawable->GetData());
|
CBooSurface* surf = static_cast<CBooSurface*>((void*)drawable->GetData());
|
||||||
CBooModel* model = surf->m_parent;
|
CBooModel* model = surf->m_parent;
|
||||||
if (model)
|
if (model)
|
||||||
{
|
{
|
||||||
ActivateLightsForModel(item, *model);
|
ActivateLightsForModel(item, *model);
|
||||||
model->DrawSurface(*surf, CModelFlags{});
|
model->DrawSurface(*surf, flags);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -237,9 +240,11 @@ void CBooRenderer::HandleUnsortedModel(CAreaListItem* item, CBooModel& model)
|
|||||||
{
|
{
|
||||||
ActivateLightsForModel(item, model);
|
ActivateLightsForModel(item, model);
|
||||||
CBooSurface* surf = model.x38_firstUnsortedSurface;
|
CBooSurface* surf = model.x38_firstUnsortedSurface;
|
||||||
|
CModelFlags flags;
|
||||||
|
flags.m_extendedShaderIdx = 1;
|
||||||
while (surf)
|
while (surf)
|
||||||
{
|
{
|
||||||
model.DrawSurface(*surf, CModelFlags{});
|
model.DrawSurface(*surf, flags);
|
||||||
surf = surf->m_next;
|
surf = surf->m_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -283,12 +288,13 @@ void CBooRenderer::LoadThermoPalette()
|
|||||||
m_thermoPaletteTex = xc_store.GetObj("TXTR_ThermoPalette");
|
m_thermoPaletteTex = xc_store.GetObj("TXTR_ThermoPalette");
|
||||||
CTexture* thermoTexObj = m_thermoPaletteTex.GetObj();
|
CTexture* thermoTexObj = m_thermoPaletteTex.GetObj();
|
||||||
if (thermoTexObj)
|
if (thermoTexObj)
|
||||||
x288_thermoPalette = thermoTexObj->GetBooTexture();
|
x288_thermoPalette = thermoTexObj->GetPaletteTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac)
|
CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac)
|
||||||
: x8_factory(resFac), xc_store(store), x2a8_thermalRand(20)
|
: x8_factory(resFac), xc_store(store), x2a8_thermalRand(20)
|
||||||
{
|
{
|
||||||
|
g_Renderer = this;
|
||||||
xee_24_ = true;
|
xee_24_ = true;
|
||||||
|
|
||||||
m_gfxToken = CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx) -> bool
|
m_gfxToken = CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx) -> bool
|
||||||
@ -298,6 +304,7 @@ CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac)
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
LoadThermoPalette();
|
LoadThermoPalette();
|
||||||
|
m_thermHotFilter.emplace();
|
||||||
|
|
||||||
Buckets::Init();
|
Buckets::Init();
|
||||||
}
|
}
|
||||||
@ -307,10 +314,10 @@ void CBooRenderer::AddWorldSurfaces(CBooModel& model)
|
|||||||
CBooSurface* surf = model.x3c_firstSortedSurface;
|
CBooSurface* surf = model.x3c_firstSortedSurface;
|
||||||
while (surf)
|
while (surf)
|
||||||
{
|
{
|
||||||
const CBooModel::MaterialSet::Material& mat = model.GetMaterialByIndex(surf->selfIdx);
|
const CBooModel::MaterialSet::Material& mat = model.GetMaterialByIndex(surf->m_data.matIdx);
|
||||||
zeus::CAABox aabb = surf->GetBounds();
|
zeus::CAABox aabb = surf->GetBounds();
|
||||||
zeus::CVector3f pt = aabb.closestPointAlongVector(xb0_viewPlane.vec);
|
zeus::CVector3f pt = aabb.closestPointAlongVector(xb0_viewPlane.vec);
|
||||||
Buckets::Insert(pt, aabb, EDrawableType::Surface, surf, xb0_viewPlane,
|
Buckets::Insert(pt, aabb, EDrawableType::WorldSurface, surf, xb0_viewPlane,
|
||||||
mat.heclIr.m_blendDst != boo::BlendFactor::Zero);
|
mat.heclIr.m_blendDst != boo::BlendFactor::Zero);
|
||||||
surf = surf->m_next;
|
surf = surf->m_next;
|
||||||
}
|
}
|
||||||
@ -617,7 +624,6 @@ void CBooRenderer::SetThermal(bool thermal, float level, const zeus::CColor& col
|
|||||||
void CBooRenderer::SetThermalColdScale(float scale)
|
void CBooRenderer::SetThermalColdScale(float scale)
|
||||||
{
|
{
|
||||||
x2f8_thermColdScale = zeus::clamp(0.f, scale, 1.f);
|
x2f8_thermColdScale = zeus::clamp(0.f, scale, 1.f);
|
||||||
m_thermColdFilter.setScale(x2f8_thermColdScale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::DoThermalBlendCold()
|
void CBooRenderer::DoThermalBlendCold()
|
||||||
@ -645,6 +651,7 @@ void CBooRenderer::DoThermalBlendCold()
|
|||||||
|
|
||||||
void CBooRenderer::DoThermalBlendHot()
|
void CBooRenderer::DoThermalBlendHot()
|
||||||
{
|
{
|
||||||
|
m_thermHotFilter->draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 CBooRenderer::GetStaticWorldDataSize()
|
u32 CBooRenderer::GetStaticWorldDataSize()
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "CDrawable.hpp"
|
#include "CDrawable.hpp"
|
||||||
#include "CDrawablePlaneObject.hpp"
|
#include "CDrawablePlaneObject.hpp"
|
||||||
#include "Shaders/CThermalColdFilter.hpp"
|
#include "Shaders/CThermalColdFilter.hpp"
|
||||||
|
#include "Shaders/CThermalHotFilter.hpp"
|
||||||
#include "Shaders/CSpaceWarpFilter.hpp"
|
#include "Shaders/CSpaceWarpFilter.hpp"
|
||||||
#include "CRandom16.hpp"
|
#include "CRandom16.hpp"
|
||||||
#include "CPVSVisSet.hpp"
|
#include "CPVSVisSet.hpp"
|
||||||
@ -107,6 +108,7 @@ class CBooRenderer : public IRenderer
|
|||||||
zeus::CColor x2f4_thermColor;
|
zeus::CColor x2f4_thermColor;
|
||||||
float x2f8_thermColdScale = 0.f;
|
float x2f8_thermColdScale = 0.f;
|
||||||
CThermalColdFilter m_thermColdFilter;
|
CThermalColdFilter m_thermColdFilter;
|
||||||
|
std::experimental::optional<CThermalHotFilter> m_thermHotFilter;
|
||||||
|
|
||||||
std::vector<CLight> x304_lights;
|
std::vector<CLight> x304_lights;
|
||||||
|
|
||||||
@ -197,6 +199,8 @@ public:
|
|||||||
void DoThermalBlendHot();
|
void DoThermalBlendHot();
|
||||||
u32 GetStaticWorldDataSize();
|
u32 GetStaticWorldDataSize();
|
||||||
|
|
||||||
|
boo::ITexture* GetThermoPalette() {return x288_thermoPalette;}
|
||||||
|
|
||||||
void BindMainDrawTarget() {CGraphics::g_BooMainCommandQueue->setRenderTarget(CGraphics::g_SpareTexture);}
|
void BindMainDrawTarget() {CGraphics::g_BooMainCommandQueue->setRenderTarget(CGraphics::g_SpareTexture);}
|
||||||
void BindReflectionDrawTarget() {CGraphics::g_BooMainCommandQueue->setRenderTarget(x14c_reflectionTex);}
|
void BindReflectionDrawTarget() {CGraphics::g_BooMainCommandQueue->setRenderTarget(x14c_reflectionTex);}
|
||||||
};
|
};
|
||||||
|
@ -8,7 +8,7 @@ namespace urde
|
|||||||
{
|
{
|
||||||
enum class EDrawableType : u16
|
enum class EDrawableType : u16
|
||||||
{
|
{
|
||||||
Surface,
|
WorldSurface,
|
||||||
Particle,
|
Particle,
|
||||||
UnsortedCallback,
|
UnsortedCallback,
|
||||||
SortedCallback
|
SortedCallback
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CMetroidModelInstance::CMetroidModelInstance(CBooModel* inst)
|
||||||
|
: x0_visorFlags(0), m_instance(inst)
|
||||||
|
{
|
||||||
|
x34_aabb = inst->x20_aabb;
|
||||||
|
}
|
||||||
|
|
||||||
CMetroidModelInstance::CMetroidModelInstance
|
CMetroidModelInstance::CMetroidModelInstance
|
||||||
(const void* modelHeader, CBooModel* inst)
|
(const void* modelHeader, CBooModel* inst)
|
||||||
: x0_visorFlags(hecl::SBig(*static_cast<const u32*>(modelHeader))), m_instance(inst)
|
: x0_visorFlags(hecl::SBig(*static_cast<const u32*>(modelHeader))), m_instance(inst)
|
||||||
|
@ -19,6 +19,7 @@ class CMetroidModelInstance
|
|||||||
zeus::CAABox x34_aabb;
|
zeus::CAABox x34_aabb;
|
||||||
CBooModel* m_instance;
|
CBooModel* m_instance;
|
||||||
public:
|
public:
|
||||||
|
CMetroidModelInstance(CBooModel* inst);
|
||||||
CMetroidModelInstance(const void* modelHeader, CBooModel* inst);
|
CMetroidModelInstance(const void* modelHeader, CBooModel* inst);
|
||||||
~CMetroidModelInstance();
|
~CMetroidModelInstance();
|
||||||
};
|
};
|
||||||
|
@ -61,6 +61,7 @@ class CBooModel
|
|||||||
{
|
{
|
||||||
friend class CModel;
|
friend class CModel;
|
||||||
friend class CBooRenderer;
|
friend class CBooRenderer;
|
||||||
|
friend class CMetroidModelInstance;
|
||||||
public:
|
public:
|
||||||
using MaterialSet = DataSpec::DNAMP1::HMDLMaterialSet;
|
using MaterialSet = DataSpec::DNAMP1::HMDLMaterialSet;
|
||||||
using UVAnimation = DataSpec::DNAMP1::MaterialSet::Material::UVAnimation;
|
using UVAnimation = DataSpec::DNAMP1::MaterialSet::Material::UVAnimation;
|
||||||
@ -105,7 +106,6 @@ private:
|
|||||||
std::vector<std::vector<boo::IShaderDataBinding*>> m_shaderDataBindings;
|
std::vector<std::vector<boo::IShaderDataBinding*>> m_shaderDataBindings;
|
||||||
|
|
||||||
void BuildGfxToken();
|
void BuildGfxToken();
|
||||||
void UpdateUniformData(const CModelFlags& flags) const;
|
|
||||||
void DrawAlphaSurfaces(const CModelFlags& flags) const;
|
void DrawAlphaSurfaces(const CModelFlags& flags) const;
|
||||||
void DrawNormalSurfaces(const CModelFlags& flags) const;
|
void DrawNormalSurfaces(const CModelFlags& flags) const;
|
||||||
void DrawSurfaces(const CModelFlags& flags) const;
|
void DrawSurfaces(const CModelFlags& flags) const;
|
||||||
@ -125,6 +125,7 @@ public:
|
|||||||
void RemapMaterialData(SShader& shader);
|
void RemapMaterialData(SShader& shader);
|
||||||
bool TryLockTextures() const;
|
bool TryLockTextures() const;
|
||||||
void UnlockTextures() const;
|
void UnlockTextures() const;
|
||||||
|
void UpdateUniformData(const CModelFlags& flags) const;
|
||||||
void DrawAlpha(const CModelFlags& flags) const;
|
void DrawAlpha(const CModelFlags& flags) const;
|
||||||
void DrawNormal(const CModelFlags& flags) const;
|
void DrawNormal(const CModelFlags& flags) const;
|
||||||
void Draw(const CModelFlags& flags) const;
|
void Draw(const CModelFlags& flags) const;
|
||||||
|
@ -50,6 +50,7 @@ public:
|
|||||||
u16 GetHeight() const {return x6_h;}
|
u16 GetHeight() const {return x6_h;}
|
||||||
void Load(int slot, EClampMode clamp) const;
|
void Load(int slot, EClampMode clamp) const;
|
||||||
boo::ITexture* GetBooTexture() {return m_booTex;}
|
boo::ITexture* GetBooTexture() {return m_booTex;}
|
||||||
|
boo::ITexture* GetPaletteTexture() {return m_paletteTex;}
|
||||||
};
|
};
|
||||||
|
|
||||||
CFactoryFnReturn FTextureFactory(const urde::SObjectTag& tag,
|
CFactoryFnReturn FTextureFactory(const urde::SObjectTag& tag,
|
||||||
|
@ -27,7 +27,7 @@ public:
|
|||||||
|
|
||||||
enum class EDrawableSorting
|
enum class EDrawableSorting
|
||||||
{
|
{
|
||||||
SortedBuckets,
|
SortedCallback,
|
||||||
UnsortedCallback
|
UnsortedCallback
|
||||||
};
|
};
|
||||||
enum class EDebugOption
|
enum class EDebugOption
|
||||||
|
@ -12,8 +12,8 @@ class CThermalColdFilter
|
|||||||
{
|
{
|
||||||
friend struct CThermalColdFilterGLDataBindingFactory;
|
friend struct CThermalColdFilterGLDataBindingFactory;
|
||||||
friend struct CThermalColdFilterVulkanDataBindingFactory;
|
friend struct CThermalColdFilterVulkanDataBindingFactory;
|
||||||
friend struct CThemalColdFilterMetalDataBindingFactory;
|
friend struct CThermalColdFilterMetalDataBindingFactory;
|
||||||
friend struct CThemalColdFilterD3DDataBindingFactory;
|
friend struct CThermalColdFilterD3DDataBindingFactory;
|
||||||
|
|
||||||
struct Uniform
|
struct Uniform
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ static const char* FS =
|
|||||||
|
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
||||||
|
|
||||||
struct CThemalColdFilterD3DDataBindingFactory : TShader<CThermalColdFilter>::IDataBindingFactory
|
struct CThermalColdFilterD3DDataBindingFactory : TShader<CThermalColdFilter>::IDataBindingFactory
|
||||||
{
|
{
|
||||||
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalColdFilter& filter)
|
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalColdFilter& filter)
|
||||||
{
|
{
|
||||||
@ -104,7 +104,7 @@ TShader<CThermalColdFilter>::IDataBindingFactory* CThermalColdFilter::Initialize
|
|||||||
pipeOut = ctx.newShaderPipeline(VS, FS, ComPtr<ID3DBlob>(), ComPtr<ID3DBlob>(), ComPtr<ID3DBlob>(),
|
pipeOut = ctx.newShaderPipeline(VS, FS, ComPtr<ID3DBlob>(), ComPtr<ID3DBlob>(), ComPtr<ID3DBlob>(),
|
||||||
vtxFmtOut, boo::BlendFactor::One,
|
vtxFmtOut, boo::BlendFactor::One,
|
||||||
boo::BlendFactor::Zero, boo::Primitive::TriStrips, false, false, false);
|
boo::BlendFactor::Zero, boo::Primitive::TriStrips, false, false, false);
|
||||||
return new CThemalColdFilterD3DDataBindingFactory;
|
return new CThermalColdFilterD3DDataBindingFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ static const char* FS =
|
|||||||
|
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
||||||
|
|
||||||
struct CThemalColdFilterMetalDataBindingFactory : TShader<CThermalColdFilter>::IDataBindingFactory
|
struct CThermalColdFilterMetalDataBindingFactory : TShader<CThermalColdFilter>::IDataBindingFactory
|
||||||
{
|
{
|
||||||
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalColdFilter& filter)
|
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalColdFilter& filter)
|
||||||
{
|
{
|
||||||
@ -111,7 +111,7 @@ TShader<CThermalColdFilter>::IDataBindingFactory* CThermalColdFilter::Initialize
|
|||||||
vtxFmtOut = ctx.newVertexFormat(2, VtxVmt);
|
vtxFmtOut = ctx.newVertexFormat(2, VtxVmt);
|
||||||
pipeOut = ctx.newShaderPipeline(VS, FS, vtxFmtOut, CGraphics::g_ViewportSamples, boo::BlendFactor::One,
|
pipeOut = ctx.newShaderPipeline(VS, FS, vtxFmtOut, CGraphics::g_ViewportSamples, boo::BlendFactor::One,
|
||||||
boo::BlendFactor::Zero, boo::Primitive::TriStrips, false, false, false);
|
boo::BlendFactor::Zero, boo::Primitive::TriStrips, false, false, false);
|
||||||
return new CThemalColdFilterMetalDataBindingFactory;
|
return new CThermalColdFilterMetalDataBindingFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
#include "CThermalHotFilter.hpp"
|
||||||
|
#include "Graphics/CGraphics.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CThermalHotFilter::CThermalHotFilter()
|
||||||
|
{
|
||||||
|
m_token = CGraphics::g_BooFactory->commitTransaction([&](boo::IGraphicsDataFactory::Context& ctx) -> bool
|
||||||
|
{
|
||||||
|
struct Vert
|
||||||
|
{
|
||||||
|
zeus::CVector2f m_pos;
|
||||||
|
zeus::CVector2f m_uv;
|
||||||
|
} verts[4] =
|
||||||
|
{
|
||||||
|
{{-1.0, -1.0}, {0.0, 0.0}},
|
||||||
|
{{-1.0, 1.0}, {0.0, 1.0}},
|
||||||
|
{{ 1.0, -1.0}, {1.0, 0.0}},
|
||||||
|
{{ 1.0, 1.0}, {1.0, 1.0}},
|
||||||
|
};
|
||||||
|
m_vbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, verts, 32, 4);
|
||||||
|
m_uniBuf = ctx.newDynamicBuffer(boo::BufferUse::Uniform, sizeof(Uniform), 1);
|
||||||
|
m_dataBind = TShader<CThermalHotFilter>::BuildShaderDataBinding(ctx, *this);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void CThermalHotFilter::draw()
|
||||||
|
{
|
||||||
|
SClipScreenRect clipRect = {};
|
||||||
|
clipRect.xc_width = CGraphics::g_ViewportResolution.x;
|
||||||
|
clipRect.x10_height = CGraphics::g_ViewportResolution.y;
|
||||||
|
CGraphics::ResolveSpareTexture(clipRect);
|
||||||
|
|
||||||
|
//m_uniBuf->load(&m_uniform, sizeof(m_uniform));
|
||||||
|
|
||||||
|
CGraphics::g_BooMainCommandQueue->setShaderDataBinding(m_dataBind);
|
||||||
|
CGraphics::g_BooMainCommandQueue->draw(0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
URDE_SPECIALIZE_SHADER(CThermalHotFilter)
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef __URDE_CTHERMALHOTFILTER_HPP__
|
||||||
|
#define __URDE_CTHERMALHOTFILTER_HPP__
|
||||||
|
|
||||||
|
#include "TShader.hpp"
|
||||||
|
#include "zeus/CMatrix4f.hpp"
|
||||||
|
#include "zeus/CColor.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CThermalHotFilter
|
||||||
|
{
|
||||||
|
friend struct CThermalHotFilterGLDataBindingFactory;
|
||||||
|
friend struct CThermalHotFilterVulkanDataBindingFactory;
|
||||||
|
friend struct CThermalHotFilterMetalDataBindingFactory;
|
||||||
|
friend struct CThermalHotFilterD3DDataBindingFactory;
|
||||||
|
|
||||||
|
struct Uniform
|
||||||
|
{
|
||||||
|
zeus::CColor m_colorRegs[3];
|
||||||
|
};
|
||||||
|
boo::GraphicsDataToken m_token;
|
||||||
|
boo::IGraphicsBufferS* m_vbo;
|
||||||
|
boo::IGraphicsBufferD* m_uniBuf;
|
||||||
|
boo::IShaderDataBinding* m_dataBind = nullptr;
|
||||||
|
Uniform m_uniform;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CThermalHotFilter();
|
||||||
|
void setColorA(const zeus::CColor& color) {m_uniform.m_colorRegs[0] = color;}
|
||||||
|
void setColorB(const zeus::CColor& color) {m_uniform.m_colorRegs[1] = color;}
|
||||||
|
void setColorC(const zeus::CColor& color) {m_uniform.m_colorRegs[2] = color;}
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
using _CLS = CThermalHotFilter;
|
||||||
|
#include "TShaderDecl.hpp"
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CTHERMALHOTFILTER_HPP__
|
@ -0,0 +1,119 @@
|
|||||||
|
#include "CThermalHotFilter.hpp"
|
||||||
|
#include "Graphics/CBooRenderer.hpp"
|
||||||
|
#include "GameGlobalObjects.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
static const char* VS =
|
||||||
|
"#version 330\n"
|
||||||
|
BOO_GLSL_BINDING_HEAD
|
||||||
|
"layout(location=0) in vec4 posIn;\n"
|
||||||
|
"layout(location=1) in vec4 uvIn;\n"
|
||||||
|
"\n"
|
||||||
|
"UBINDING0 uniform ThermalHotUniform\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 colorReg0;\n"
|
||||||
|
" vec4 colorReg1;\n"
|
||||||
|
" vec4 colorReg2;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"struct VertToFrag\n"
|
||||||
|
"{\n"
|
||||||
|
" vec2 sceneUv;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"SBINDING(0) out VertToFrag vtf;\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" vtf.sceneUv = uvIn.xy;\n"
|
||||||
|
" gl_Position = vec4(posIn.xyz, 1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
static const char* FS =
|
||||||
|
"#version 330\n"
|
||||||
|
BOO_GLSL_BINDING_HEAD
|
||||||
|
"struct VertToFrag\n"
|
||||||
|
"{\n"
|
||||||
|
" vec2 sceneUv;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"SBINDING(0) in VertToFrag vtf;\n"
|
||||||
|
"layout(location=0) out vec4 colorOut;\n"
|
||||||
|
"TBINDING0 uniform sampler2D sceneTex;\n"
|
||||||
|
"TBINDING1 uniform sampler2D paletteTex;\n"
|
||||||
|
"const vec4 kRGBToYPrime = vec4(0.299, 0.587, 0.114, 0.0);\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" float sceneSample = dot(texture(sceneTex, vtf.sceneUv), kRGBToYPrime);\n"
|
||||||
|
" vec4 colorSample = texture(paletteTex, vec2(sceneSample / 17.0, 0.5));\n"
|
||||||
|
" colorOut = colorSample * sceneSample;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
URDE_DECL_SPECIALIZE_SHADER(CThermalHotFilter)
|
||||||
|
|
||||||
|
struct CThermalHotFilterGLDataBindingFactory : TShader<CThermalHotFilter>::IDataBindingFactory
|
||||||
|
{
|
||||||
|
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalHotFilter& filter)
|
||||||
|
{
|
||||||
|
boo::GLDataFactory::Context& cctx = static_cast<boo::GLDataFactory::Context&>(ctx);
|
||||||
|
|
||||||
|
const boo::VertexElementDescriptor VtxVmt[] =
|
||||||
|
{
|
||||||
|
{filter.m_vbo, nullptr, boo::VertexSemantic::Position4},
|
||||||
|
{filter.m_vbo, nullptr, boo::VertexSemantic::UV4}
|
||||||
|
};
|
||||||
|
boo::IGraphicsBuffer* bufs[] = {filter.m_uniBuf};
|
||||||
|
boo::PipelineStage stages[] = {boo::PipelineStage::Vertex};
|
||||||
|
boo::ITexture* texs[] = {CGraphics::g_SpareTexture, g_Renderer->GetThermoPalette()};
|
||||||
|
return cctx.newShaderDataBinding(TShader<CThermalHotFilter>::m_pipeline,
|
||||||
|
ctx.newVertexFormat(2, VtxVmt), filter.m_vbo, nullptr, nullptr,
|
||||||
|
1, bufs, stages, nullptr, nullptr, 2, texs);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#if BOO_HAS_VULKAN
|
||||||
|
struct CThermalHotFilterVulkanDataBindingFactory : TShader<CThermalHotFilter>::IDataBindingFactory
|
||||||
|
{
|
||||||
|
boo::IShaderDataBinding* BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CThermalHotFilter& filter)
|
||||||
|
{
|
||||||
|
boo::VulkanDataFactory::Context& cctx = static_cast<boo::VulkanDataFactory::Context&>(ctx);
|
||||||
|
|
||||||
|
boo::IGraphicsBuffer* bufs[] = {filter.m_uniBuf};
|
||||||
|
boo::ITexture* texs[] = {CGraphics::g_SpareTexture, g_Renderer->GetThermoPalette()};
|
||||||
|
return cctx.newShaderDataBinding(TShader<CThermalHotFilter>::m_pipeline,
|
||||||
|
TShader<CThermalHotFilter>::m_vtxFmt,
|
||||||
|
filter.m_vbo, nullptr, nullptr, 1, bufs,
|
||||||
|
nullptr, nullptr, nullptr, 2, texs);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TShader<CThermalHotFilter>::IDataBindingFactory* CThermalHotFilter::Initialize(boo::GLDataFactory::Context& ctx,
|
||||||
|
boo::IShaderPipeline*& pipeOut)
|
||||||
|
{
|
||||||
|
const char* texNames[] = {"sceneTex", "paletteTex"};
|
||||||
|
const char* uniNames[] = {"ThermalHotUniform"};
|
||||||
|
pipeOut = ctx.newShaderPipeline(VS, FS, 2, texNames, 1, uniNames, boo::BlendFactor::DstAlpha,
|
||||||
|
boo::BlendFactor::InvDstAlpha, boo::Primitive::TriStrips, false, false, false);
|
||||||
|
return new CThermalHotFilterGLDataBindingFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BOO_HAS_VULKAN
|
||||||
|
TShader<CThermalHotFilter>::IDataBindingFactory* CThermalHotFilter::Initialize(boo::VulkanDataFactory::Context& ctx,
|
||||||
|
boo::IShaderPipeline*& pipeOut,
|
||||||
|
boo::IVertexFormat*& vtxFmtOut)
|
||||||
|
{
|
||||||
|
const boo::VertexElementDescriptor VtxVmt[] =
|
||||||
|
{
|
||||||
|
{nullptr, nullptr, boo::VertexSemantic::Position4},
|
||||||
|
{nullptr, nullptr, boo::VertexSemantic::UV4}
|
||||||
|
};
|
||||||
|
vtxFmtOut = ctx.newVertexFormat(2, VtxVmt);
|
||||||
|
pipeOut = ctx.newShaderPipeline(VS, FS, vtxFmtOut, boo::BlendFactor::DstAlpha,
|
||||||
|
boo::BlendFactor::InvDstAlpha, boo::Primitive::TriStrips, false, false, false);
|
||||||
|
return new CThermalHotFilterVulkanDataBindingFactory;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
@ -1,11 +1,13 @@
|
|||||||
#include "MP1.hpp"
|
#include "MP1.hpp"
|
||||||
#include "Graphics/Shaders/CModelShaders.hpp"
|
#include "Graphics/Shaders/CModelShaders.hpp"
|
||||||
#include "Graphics/Shaders/CThermalColdFilter.hpp"
|
#include "Graphics/Shaders/CThermalColdFilter.hpp"
|
||||||
|
#include "Graphics/Shaders/CThermalHotFilter.hpp"
|
||||||
#include "Graphics/Shaders/CSpaceWarpFilter.hpp"
|
#include "Graphics/Shaders/CSpaceWarpFilter.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CThermalColdFilter)
|
||||||
|
URDE_DECL_SPECIALIZE_SHADER(CThermalHotFilter)
|
||||||
URDE_DECL_SPECIALIZE_SHADER(CSpaceWarpFilter)
|
URDE_DECL_SPECIALIZE_SHADER(CSpaceWarpFilter)
|
||||||
|
|
||||||
namespace MP1
|
namespace MP1
|
||||||
@ -35,6 +37,7 @@ void CMain::InitializeSubsystems(boo::IGraphicsDataFactory* factory,
|
|||||||
CGraphics::InitializeBoo(factory, cc, renderTex);
|
CGraphics::InitializeBoo(factory, cc, renderTex);
|
||||||
CModelShaders::Initialize(storeMgr, factory);
|
CModelShaders::Initialize(storeMgr, factory);
|
||||||
TShader<CThermalColdFilter>::Initialize();
|
TShader<CThermalColdFilter>::Initialize();
|
||||||
|
TShader<CThermalHotFilter>::Initialize();
|
||||||
TShader<CSpaceWarpFilter>::Initialize();
|
TShader<CSpaceWarpFilter>::Initialize();
|
||||||
CMoviePlayer::Initialize();
|
CMoviePlayer::Initialize();
|
||||||
CLineRenderer::Initialize();
|
CLineRenderer::Initialize();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user