mirror of https://github.com/AxioDL/metaforce.git
Implement Metal lighting shader
This commit is contained in:
parent
408ce2ca8b
commit
9f0e9a808b
|
@ -118,7 +118,7 @@ struct OGLLineDataBindingFactory : CLineRendererShaders::IDataBindingFactory
|
||||||
boo::IGraphicsBuffer* uniforms[] = {renderer.m_uniformBuf};
|
boo::IGraphicsBuffer* uniforms[] = {renderer.m_uniformBuf};
|
||||||
|
|
||||||
renderer.m_shaderBind = ctx.newShaderDataBinding(pipeline, vtxFmt, renderer.m_vertBuf,
|
renderer.m_shaderBind = ctx.newShaderDataBinding(pipeline, vtxFmt, renderer.m_vertBuf,
|
||||||
nullptr, nullptr, 1, uniforms,
|
nullptr, nullptr, 1, uniforms, nullptr,
|
||||||
texCount, textures);
|
texCount, textures);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -117,7 +117,7 @@ struct MetalLineDataBindingFactory : CLineRendererShaders::IDataBindingFactory
|
||||||
boo::IGraphicsBuffer* uniforms[] = {renderer.m_uniformBuf};
|
boo::IGraphicsBuffer* uniforms[] = {renderer.m_uniformBuf};
|
||||||
|
|
||||||
renderer.m_shaderBind = ctx.newShaderDataBinding(pipeline, nullptr, renderer.m_vertBuf,
|
renderer.m_shaderBind = ctx.newShaderDataBinding(pipeline, nullptr, renderer.m_vertBuf,
|
||||||
nullptr, nullptr, 1, uniforms,
|
nullptr, nullptr, 1, uniforms, nullptr,
|
||||||
texCount, textures);
|
texCount, textures);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "Graphics/CLight.hpp"
|
#include "Graphics/CLight.hpp"
|
||||||
#include "hecl/HMDLMeta.hpp"
|
#include "hecl/HMDLMeta.hpp"
|
||||||
#include "hecl/Runtime.hpp"
|
#include "hecl/Runtime.hpp"
|
||||||
|
#include "boo/graphicsdev/Metal.hpp"
|
||||||
#include "CModelShaders.hpp"
|
#include "CModelShaders.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
|
@ -117,6 +118,10 @@ void CBooModel::BuildGfxToken()
|
||||||
size_t thisOffs[3];
|
size_t thisOffs[3];
|
||||||
size_t thisSizes[3];
|
size_t thisSizes[3];
|
||||||
|
|
||||||
|
static const boo::PipelineStage stages[3] = {boo::PipelineStage::Vertex,
|
||||||
|
boo::PipelineStage::Vertex,
|
||||||
|
boo::PipelineStage::Fragment};
|
||||||
|
|
||||||
/* Enumerate surfaces and build data bindings */
|
/* Enumerate surfaces and build data bindings */
|
||||||
for (const CBooSurface& surf : *x0_surfaces)
|
for (const CBooSurface& surf : *x0_surfaces)
|
||||||
{
|
{
|
||||||
|
@ -164,7 +169,7 @@ void CBooModel::BuildGfxToken()
|
||||||
for (boo::IShaderPipeline* pipeline : pipelines)
|
for (boo::IShaderPipeline* pipeline : pipelines)
|
||||||
extendeds.push_back(
|
extendeds.push_back(
|
||||||
ctx.newShaderDataBinding(pipeline, m_vtxFmt,
|
ctx.newShaderDataBinding(pipeline, m_vtxFmt,
|
||||||
x8_vbo, nullptr, xc_ibo, 3, bufs,
|
x8_vbo, nullptr, xc_ibo, 3, bufs, stages,
|
||||||
thisOffs, thisSizes, mat.textureIdxs.size(), texs.data()));
|
thisOffs, thisSizes, mat.textureIdxs.size(), texs.data()));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -3,10 +3,49 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static const char* LightingMetal =
|
||||||
|
"struct Light\n"
|
||||||
|
"{\n"
|
||||||
|
" float4 pos;\n"
|
||||||
|
" float4 dir;\n"
|
||||||
|
" float4 color;\n"
|
||||||
|
" float4 linAtt;\n"
|
||||||
|
" float4 angAtt;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"struct LightingUniform\n"
|
||||||
|
"{\n"
|
||||||
|
" Light lights[" _XSTR(URDE_MAX_LIGHTS) "];\n"
|
||||||
|
" float4 ambient;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"static float4 LightingFunc(constant LightingUniform& lu, float4 mvPosIn, float4 mvNormIn)\n"
|
||||||
|
"{\n"
|
||||||
|
" float4 ret = lu.ambient;\n"
|
||||||
|
" \n"
|
||||||
|
" for (int i=0 ; i<" _XSTR(URDE_MAX_LIGHTS) " ; ++i)\n"
|
||||||
|
" {\n"
|
||||||
|
" float3 delta = mvPosIn.xyz - lu.lights[i].pos.xyz;\n"
|
||||||
|
" float dist = length(delta);\n"
|
||||||
|
" float angDot = saturate(dot(normalize(delta), lu.lights[i].dir.xyz));\n"
|
||||||
|
" float att = 1.0 / (lu.lights[i].linAtt[2] * dist * dist +\n"
|
||||||
|
" lu.lights[i].linAtt[1] * dist +\n"
|
||||||
|
" lu.lights[i].linAtt[0]);\n"
|
||||||
|
" float angAtt = lu.lights[i].angAtt[2] * angDot * angDot +\n"
|
||||||
|
" lu.lights[i].angAtt[1] * angDot +\n"
|
||||||
|
" lu.lights[i].angAtt[0];\n"
|
||||||
|
" ret += lu.lights[i].color * saturate(angAtt) * att * saturate(dot(normalize(-delta), mvNormIn.xyz));\n"
|
||||||
|
" }\n"
|
||||||
|
" \n"
|
||||||
|
" return saturate(ret);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
hecl::Runtime::ShaderCacheExtensions
|
hecl::Runtime::ShaderCacheExtensions
|
||||||
CModelShaders::GetShaderExtensionsMetal(boo::IGraphicsDataFactory::Platform plat)
|
CModelShaders::GetShaderExtensionsMetal(boo::IGraphicsDataFactory::Platform plat)
|
||||||
{
|
{
|
||||||
|
static const char* BlockNames[] = {"LightingUniform"};
|
||||||
hecl::Runtime::ShaderCacheExtensions ext(plat);
|
hecl::Runtime::ShaderCacheExtensions ext(plat);
|
||||||
|
ext.registerExtensionSlot({LightingMetal, "LightingFunc"}, {}, 1, BlockNames);
|
||||||
return ext;
|
return ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -457,7 +457,7 @@ CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bo
|
||||||
{
|
{
|
||||||
boo::ITexture* texs[] = {set.Y[j], set.U, set.V};
|
boo::ITexture* texs[] = {set.Y[j], set.U, set.V};
|
||||||
set.binding[j] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf,
|
set.binding[j] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf,
|
||||||
nullptr, nullptr, 1, bufs, 3, texs);
|
nullptr, nullptr, 1, bufs, nullptr, 3, texs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -476,7 +476,7 @@ CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bo
|
||||||
boo::IGraphicsBuffer* bufs[] = {m_blockBuf};
|
boo::IGraphicsBuffer* bufs[] = {m_blockBuf};
|
||||||
boo::ITexture* texs[] = {set.Y[0], set.U, set.V};
|
boo::ITexture* texs[] = {set.Y[0], set.U, set.V};
|
||||||
set.binding[0] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf,
|
set.binding[0] = ctx.newShaderDataBinding(YUVShaderPipeline, vtxFmt, m_vertBuf,
|
||||||
nullptr, nullptr, 1, bufs, 3, texs);
|
nullptr, nullptr, 1, bufs, nullptr, 3, texs);
|
||||||
}
|
}
|
||||||
if (xf4_25_hasAudio)
|
if (xf4_25_hasAudio)
|
||||||
set.audioBuf.reset(new s16[x28_thpHead.maxAudioSamples * 2]);
|
set.audioBuf.reset(new s16[x28_thpHead.maxAudioSamples * 2]);
|
||||||
|
|
|
@ -95,7 +95,7 @@ void CTextRenderBuffer::CommitResources()
|
||||||
boo::ITexture* texs[] = {chs.m_font.GetObj()->GetTexture()->GetBooTexture()};
|
boo::ITexture* texs[] = {chs.m_font.GetObj()->GetTexture()->GetBooTexture()};
|
||||||
chs.m_dataBinding = ctx.newShaderDataBinding(g_TextShaderPipeline, vFmt,
|
chs.m_dataBinding = ctx.newShaderDataBinding(g_TextShaderPipeline, vFmt,
|
||||||
nullptr, chs.m_instBuf, nullptr,
|
nullptr, chs.m_instBuf, nullptr,
|
||||||
1, uniforms, 1, texs);
|
1, uniforms, nullptr, 1, texs);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (BooImage& img : m_images)
|
for (BooImage& img : m_images)
|
||||||
|
@ -126,7 +126,7 @@ void CTextRenderBuffer::CommitResources()
|
||||||
boo::ITexture* texs[] = {tex->GetBooTexture()};
|
boo::ITexture* texs[] = {tex->GetBooTexture()};
|
||||||
img.m_dataBinding.push_back(ctx.newShaderDataBinding(g_TextImageShaderPipeline, vFmt,
|
img.m_dataBinding.push_back(ctx.newShaderDataBinding(g_TextImageShaderPipeline, vFmt,
|
||||||
nullptr, img.m_instBuf, nullptr,
|
nullptr, img.m_instBuf, nullptr,
|
||||||
1, uniforms, 1, texs));
|
1, uniforms, nullptr, 1, texs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -259,11 +259,11 @@ struct OGLElementDataBindingFactory : CElementGenShaders::IDataBindingFactory
|
||||||
if (regPipeline)
|
if (regPipeline)
|
||||||
gen.m_normalDataBind = ctx.newShaderDataBinding(regPipeline, vtxFmt, nullptr,
|
gen.m_normalDataBind = ctx.newShaderDataBinding(regPipeline, vtxFmt, nullptr,
|
||||||
gen.m_instBuf, nullptr, 1, uniforms,
|
gen.m_instBuf, nullptr, 1, uniforms,
|
||||||
texCount, textures);
|
nullptr, texCount, textures);
|
||||||
if (redToAlphaPipeline)
|
if (redToAlphaPipeline)
|
||||||
gen.m_redToAlphaDataBind = ctx.newShaderDataBinding(redToAlphaPipeline, vtxFmt, nullptr,
|
gen.m_redToAlphaDataBind = ctx.newShaderDataBinding(redToAlphaPipeline, vtxFmt, nullptr,
|
||||||
gen.m_instBuf, nullptr, 1, uniforms,
|
gen.m_instBuf, nullptr, 1, uniforms,
|
||||||
texCount, textures);
|
nullptr, texCount, textures);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -240,11 +240,11 @@ struct MetalElementDataBindingFactory : CElementGenShaders::IDataBindingFactory
|
||||||
if (regPipeline)
|
if (regPipeline)
|
||||||
gen.m_normalDataBind = ctx.newShaderDataBinding(regPipeline, nullptr, nullptr,
|
gen.m_normalDataBind = ctx.newShaderDataBinding(regPipeline, nullptr, nullptr,
|
||||||
gen.m_instBuf, nullptr, 1, uniforms,
|
gen.m_instBuf, nullptr, 1, uniforms,
|
||||||
texCount, textures);
|
nullptr, texCount, textures);
|
||||||
if (redToAlphaPipeline)
|
if (redToAlphaPipeline)
|
||||||
gen.m_redToAlphaDataBind = ctx.newShaderDataBinding(redToAlphaPipeline, nullptr, nullptr,
|
gen.m_redToAlphaDataBind = ctx.newShaderDataBinding(redToAlphaPipeline, nullptr, nullptr,
|
||||||
gen.m_instBuf, nullptr, 1, uniforms,
|
gen.m_instBuf, nullptr, 1, uniforms,
|
||||||
texCount, textures);
|
nullptr, texCount, textures);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
||||||
Subproject commit d5f9da3914d0ae1f4b4a4d8d0fddde160e406a6e
|
Subproject commit 6050696cf9752c9a239f16920c216356649d5ed3
|
2
specter
2
specter
|
@ -1 +1 @@
|
||||||
Subproject commit d49a33ec1b936052ff1b4d02586748d59a27c174
|
Subproject commit a8ae3714d2983d9faa9123151d71259c1fb9e111
|
Loading…
Reference in New Issue